Tk_Batis 介绍和用法以及和Jpa 的区别
什么是 Tk_Batis ??(以下介绍仅代表个人看法)
Tk\_Batis 是在 MyBatis 框架的基础上提供了很多工具,个人感觉就相当于一个通用的 Mapper 仅限单一实体类操作
为什么要用 Tk ??
说实话,刚开始用 Tk 的时候我也吐槽过。。为啥要用 Tk 然后怎么怎么麻烦怎么怎么样的。。但是后来我发现,这个真的很提升效率问题,首先,如果你每个实体类都写一遍基础的增删改查操作,就算是你 1 分钟写完。。那三个就是 3 分钟,而使用 Tk 的话,你只需要在 Mapper 继承一下 Tk 就可以直接调用它里边的方法,仅限单表操作,enmmm。。搞的我跟推销似的。。用过JPA的朋友应该很容易上手这个东西,他实体类的方法,其实就是用的 Jap 的注解
Tk_MyBatis 和 JPA 的区别 ??
JPA 是对象与对象之间的映射而 Tk\_MyBatis 是对象与结果集的映射,可以把这两者的理解为 Hibernate 和 MyBatis 之间的区别,JPA 默认使用 Hibernate 作为 orm 实现,所以一般使用 Spring Data JPA 即会使用 Hibernate ,从框架角度来讲,其实这个的差距还是蛮大的因为 Hibernate 是全自动化框架,用的是面向对象的方式,操作关系型数据库的数据,而 MyBatis 是半自动化框架,他是一个能够灵活编写sql语句,并将sql的入参和查询结果映射成POJO,灵活性来说还是感觉选择 MyBatis 为好。。感觉跑偏了呢。。
官方详解建议查看:https://gitee.com/taska/Mapper2
其实呢 Tk_Batis 集成了很多的方法包括单表多条件查询,多条件修改等,说一下他的用法,这里我们自己封装了一个公用的 BaseMapper 然后继承 Tk_Batis
首先是 Mapper 这个地方我们直接继承我们定义的 BaseMapper ,因为一般用不到我们的这个 Mapper 所以没写东西,但是考虑到,你们有多表操作。。还是写上吧。。这个地方写上仅限于示范多表操作,后边并没有用到
package com.cs.dao;
import com.cs.common.BaseMapper;
import com.cs.pojo.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @param: User 实现类接口
* @return: 这个地方因为我们用的 TK_MyBatis 除了特别复杂的 SQL 需要手写之外
* 其余的基本都可以交给 TK_MyBatis 来解决
* 后面会给大家来介绍 TK_MyBatis 的使用方式
* 差点忘了。。这里我们继承的是 BaseMapper<T> 这是一个封装的泛型
* @auther: linluochen
* @date: 2019/4/1 11:43
*/
public interface UserMapper extends BaseMapper<User> { // 泛型就写我们要查询的这个对象
/**
* @title: 例如查询多表联合查询
* @auther: linluochen
* @date: 2019/5/6 9:55
*/
@Select("select * from xxx left join xxx on xx") // 这个地方仅限于查询哈
List<User> selectUserList();
}
这里的 Service 层还是照常写就 Ok
package com.cs.service;
import com.cs.pojo.User;
import java.util.List;
/**
* @param: UserService 逻辑层接口
* @return: 就是写业务逻辑的地方......没啥可说的...
* @auther: linluochen
* @date: 2019/4/1 11:49
*/
public interface UserService {
/**
* @param: 查询全部
* @return: selectAll()
* @auther: linluochen
* @date: 2019/4/1 15:39
*/
List<User> selectAll();
/**
* @title: 根据条件查询对象
* @auther: linluochen
* @date: 2019/5/6 11:18
*/
User selectOne(Integer id);
/**
* @title: 根据条件查询集合
* @auther: linluochen
* @date: 2019/5/6 11:18
*/
List<User> selectByExample(Integer id);
/**
* @param: 查询 User ID
* @return: ID : User ID
* 个人建议使用 Integer 来接收 values 减少报 bug 的概率
* 个人理解:Integer 容纳 null 不会报错...提高容错率
* @auther: linluochen
* @date: 2019/4/1 11:51
*/
User selectByPrimaryKey(Integer id);
}
重点还是我们的业务实现层 ServiceImpl,详细用法可以查看 https://github.com/abel533/Mapper/wiki/6.example
package com.cs.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.cs.dao.UserMapper;
import com.cs.pojo.User;
import com.cs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
/**
* @ClassName UserServiceImpl
* @Param
* @Author linluochen
* @Date 2019/4/4 18:06
* @Version 1.0
**/
//@Service(version = "${demo.service.version}") // 获取自定义版本号
@Service // 声明这个是一个 Service
public class UserServiceImpl implements UserService { // 实现我们的 UserService 定义的接口
@Autowired
UserMapper UserMapper; // 调用我们的 User
@Override
public List<User> selectAll() {
return UserMapper.selectAll();
}
@Override
public User selectOne(Integer id) {
User user = new User();
user.setId(id);
return UserMapper.selectOne(user);
}
@Override
public List<User> selectByExample(Integer id) {
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
if (id != null && id != 0){
criteria.andEqualTo("id",id);
}
return UserMapper.selectByExample(example);
}
@Override
public User selectByPrimaryKey(Integer id) {
return UserMapper.selectByPrimaryKey(id);
}
}
然后就是该咋调用就咋调用,只是实现层的写法不同
还没有评论,来说两句吧...