mybatis是当下主流框架都会去集成的东西,而tkMybatis是对mybatis的封装。他处理了基本的增删改查也处理了很多高级条件查询。
小余哥之前用tkmybatis都是只用到基础的增删改查。
比如 :
SelectAll insertSelective updateByPrimaryKeySelective
这种最基础的增删改查,大家可以看到其实tkmybatis有封装很多方法,其实只是我们不怎么去调用而已。
先附上小余哥集成的tkmybatis,大家也可以像我这样操作
pom
<!-- tkmybatis --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.1.5</version> <exclusions> <exclusion> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency>
CommonBaseMapper
import tk.mybatis.mapper.annotation.RegisterMapper; import tk.mybatis.mapper.common.BaseMapper; import tk.mybatis.mapper.common.ConditionMapper; import tk.mybatis.mapper.common.ExampleMapper; import tk.mybatis.mapper.common.Marker; import tk.mybatis.mapper.common.MySqlMapper; import tk.mybatis.mapper.common.RowBoundsMapper; import tk.mybatis.mapper.common.base.BaseInsertMapper; import tk.mybatis.mapper.common.base.delete.DeleteByPrimaryKeyMapper; import tk.mybatis.mapper.common.base.delete.DeleteMapper; import tk.mybatis.mapper.common.base.insert.InsertSelectiveMapper; import tk.mybatis.mapper.common.base.select.ExistsWithPrimaryKeyMapper; import tk.mybatis.mapper.common.base.select.SelectAllMapper; import tk.mybatis.mapper.common.base.select.SelectByPrimaryKeyMapper; import tk.mybatis.mapper.common.base.select.SelectCountMapper; import tk.mybatis.mapper.common.base.select.SelectMapper; import tk.mybatis.mapper.common.base.select.SelectOneMapper; import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeyMapper; import tk.mybatis.mapper.common.base.update.UpdateByPrimaryKeySelectiveMapper; import tk.mybatis.mapper.common.condition.DeleteByConditionMapper; import tk.mybatis.mapper.common.condition.SelectByConditionMapper; import tk.mybatis.mapper.common.condition.SelectCountByConditionMapper; import tk.mybatis.mapper.common.condition.UpdateByConditionMapper; import tk.mybatis.mapper.common.condition.UpdateByConditionSelectiveMapper; import tk.mybatis.mapper.common.example.SelectByExampleMapper; import tk.mybatis.mapper.common.example.UpdateByExampleSelectiveMapper; import tk.mybatis.mapper.common.ids.DeleteByIdsMapper; import tk.mybatis.mapper.common.ids.SelectByIdsMapper; import tk.mybatis.mapper.common.rowbounds.SelectByExampleRowBoundsMapper; @RegisterMapper public interface CommonBaseMapper<T> extends Marker, //tk-mybatis 基础查询接口 SelectOneMapper<T>, SelectMapper<T>, SelectAllMapper<T>, SelectCountMapper<T>, SelectByPrimaryKeyMapper<T>, ExistsWithPrimaryKeyMapper<T>, SelectByIdsMapper<T>, SelectByConditionMapper<T>, SelectCountByConditionMapper<T>, SelectByExampleMapper<T>, SelectByExampleRowBoundsMapper<T>, //基础更新接口 UpdateByPrimaryKeyMapper<T>, UpdateByPrimaryKeySelectiveMapper<T>, UpdateByConditionMapper<T>, UpdateByConditionSelectiveMapper<T>, UpdateByExampleSelectiveMapper<T>, //基础删除接口 DeleteMapper<T>, DeleteByPrimaryKeyMapper<T>, DeleteByConditionMapper<T>, DeleteByIdsMapper<T>, //基础新增 BaseInsertMapper<T>, InsertSelectiveMapper<T>, BaseMapper<T>, //高级api接口 ExampleMapper<T>, RowBoundsMapper<T>, MySqlMapper<T>, ConditionMapper<T>{}
dao层实现
FactoryClassMapper是dao接口,
继承CommonBaseMapper<FactoryClass>
CommonBaseMapper是上面的tkmybatis封装类
FactoryClass是实体类。
service只要注入dao层mapper就可以直接使用tkmybatis的那些接口了
下面我们看看实现
CommonBaseMapper 里面一个RegisterMapper注解
点进去看一下
作者写了注释这个注解用于自动注册mapper接口的标记
springboot做的最好的一个就是可以注解驱动。
哪如果我们去掉这个注解会怎么样?
实践证明 spring容器会找不到这个bean然后报错。
我们继续看CommonBaseMapper 里面的方法实现
随便找一个我们点到接口里面看
@RegisterMapper public interface SelectByPrimaryKeyMapper<T> { /** * 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号 * * @param key * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") T selectByPrimaryKey(Object key); }
大家看到这里是不是有点熟悉?
spring注解写sql也是这样吗?selectProvider 然后声明type是哪个class文件
然后通过method指定哪个方法。(不懂的朋友百度一下spring注解写sql,网上一堆)
在往下就是对于selectProvide的一些封装了。大家有兴趣的可以自己研究
今天小余哥遇到的问题是,我之前每次写分页用的是封装pagehelp方法都需要去写分页的sql xml,恶心了我好久。
SelectByExampleRowBoundsMapper方法直接可以解决分页问题,为此
我百度了一下用法,找了一会发现没有教怎么用的,翻看源码实现发现有个
RowBounds,
List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds);
他自己弄了构造方法,你只需要在用这个方法的时候创建他,然后传入页码和条数就可以直接分页!!!!
Example example = new Example(FactoryClass.class); Example.Criteria criteria = example.createCriteria(); List<FactoryClass> factoryClasses = factoryClassMapper.selectByExampleAndRowBounds(example, new RowBounds(query.getCurrentNum(),query.getPageSize()));
这里的Example 是用来做高级查询条件的有兴趣的朋友可以研究一下这个类。
我现在基本不用xml文件来写sql了除非复杂逻辑才去使用。
@Override public PageResult<List<FactoryClass>> queryPage(WorkDayQuery query) { PageResult<List<FactoryClass>> result = new PageResult<>(); List<FactoryClass> factoryClasses = factoryClassMapper.selectByExampleAndRowBounds( new Example(FactoryClass.class), new RowBounds(query.getCurrentNum(),query.getPageSize())); result.setList(factoryClasses); result.setCount(factoryClasses.size()); return result; }