一、什么是 TKMybatis
TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作。
二、TKMybatis 使用
2.1 Springboot 项目中加入依赖
<!--通用mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
在 POJO 类中加入依赖
<!--每个工程都有Pojo,都需要用到该包对应的注解-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
在启动类中配置 @MapperScan 扫描
@SpringBootApplication
@MapperScan(basePackages = {"com.tom.order.mapper"})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
2.2 使用讲解
2.2.1 实体类中使用
在实体类中,常用的注解和意义为:
- @Table:描述数据库表信息,主要属性有name(表名)、schema、catalog、uniqueConstraints等。
- @Id:指定表主键字段,无属性值。
- @Column:描述数据库字段信息,主要属性有name(字段名)、columnDefinition、insertable、length、nullable(是否可为空)、precision、scale、table、unique、updatable等。
- @ColumnType:描述数据库字段类型,可对一些特殊类型作配置,进行特殊处理,主要属性有jdbcType、column、typeHandler等。
- 其他注解如:@Transient、@ColumnResult、@JoinColumn、@OrderBy、@Embeddable等暂不描述
2.2.2 dao中使用
单表操作,只需要继承 tk.mybatis 下的 Mapper 接口即可使用
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
查看具体使用:内部都已经封装了基本的单表操作

2.2.3 Service 层中使用

2.3 实际案例
2.3.1 dao 层使用
import tk.mybatis.mapper.common.Mapper;
/**
* DAO 使用通用Mapper
* DSO接口需要继承 tk.mybatis.mapper.common.Mapper
*/
@Repository
public interface BrandMapper extends Mapper<Brand> {
}
2.3.2 service 层使用
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
public class BrandServiceImpl implements BrandService {
@Autowired
private BrandMapper brandMapper;
public Example createExample(Brand brand) {
// 自定义条件搜索对象 Example
Example example = new Example(Brand.class);
Example.Criteria criteria = example.createCriteria(); //条件构造器
if (brand != null) {
if (!StringUtils.isEmpty(brand.getName())) {
criteria.andLike("name", '%' + brand.getName() + '%');
}
if (!StringUtils.isEmpty(brand.getLetter())) {
criteria.andEqualTo("letter", brand.getLetter());
}
}
return example;
}
@Override
public List<Brand> findAll() {
return brandMapper.selectAll();
}
@Override
public List<Brand> findList(Brand brand) {
Example example = createExample(brand);
return brandMapper.selectByExample(example);
}
@Override
public Brand findById(Integer id) {
return brandMapper.selectByPrimaryKey(id);
}
/**
* 分页查询
* @param page 当前页
* @param size 每页显示的条数
* @return
*/
@Override
public PageInfo<Brand> pageSearch(Integer page, Integer size) {
// 分页实现
// 后面的查询必须是紧跟集合查询
PageHelper.startPage(page, size);
// 查询集合
List<Brand> brands = brandMapper.selectAll();
return new PageInfo<Brand>(brands);
}
@Override
public PageInfo<Brand> pageSearchAndCondition(Brand brand, Integer page, Integer size) {
// 开始分页
PageHelper.startPage(page, size);
// 搜索数据
Example example = createExample(brand);
List<Brand> list = brandMapper.selectByExample(example);
return new PageInfo<Brand>(list);
}
/**
* 增加品牌
* @param brand
*/
@Override
public void add(Brand brand) {
// 使用通用 Mapper.insertSelective
// 方法中但凡带有selective就会忽略空值
int i = brandMapper.insertSelective(brand);
}
/**
* 根据id修改品牌
* @param brand
*/
@Override
public void update(Brand brand) {
// 使用通用mapper.update();
brandMapper.updateByPrimaryKeySelective(brand);
}
/**
* 根据id删除
* @param id
*/
@Override
public void del(Integer id) {
brandMapper.deleteByPrimaryKey(id);
}
}