TKmybatis的框架介绍和原理解析

 更新时间:2020年12月01日 14:49:05   作者:JMCui  
tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具

一、TkMybatis

Tkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率。

二、怎么用?

1. 引用

在 pom.xml 中引入 tk.mybatis 的引用。

<dependency>
 <groupId>tk.mybatis</groupId>
 <artifactId>mapper-spring-boot-starter</artifactId>
 <version>2.1.5</version>
</dependency>

2. DO 对象

@Table(name = "t_plan")
public class PopMerchantPlanDO{

	/**
	 * id
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	/**
	 * 编号
	 */
	private String code;
}

映射数据库表和实体对象,类似的注解还有 @Column、@ColumnType、@Transient 等等。

3. Mapper 数据库操作接口

public interface BaseDao<T> extends BaseMapper<T>, MySqlMapper<T>, IdsMapper<T>, ConditionMapper<T>, ExampleMapper<T> {
}

Dao 对象继承的这些接口帮你封装了一系列单表的操作,使你不用再为每个单表编写繁杂重复的 sql 语句。

当你使用 Dao 对象操作数据库的时候,只需要调用这些接口中封装好的方法,就能完成一系列对单表的 CURD 操作,比如下面的 selectAll 方法,鉴于篇幅,更多的 CURD 方法,大家可以打开 Mapper 接口自行查看,一目了然。

@RegisterMapper
public interface SelectAllMapper<T> {

 /**
  * 查询全部结果
  *
  * @return
  */
 @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
 List<T> selectAll();
}

当然,对于复杂的 SQL 语句,比如 JOIN 操作等等,仍然需要自行编写 xml 文件和 SQL 语句。

三、底层原理

TkMybatis 的封装依赖一个 @SelectProvider 注解来完成,如果你使用过 @Select 注解,那么 @SelectProvider 与它没有质的区别,只是在定义注解的方式上有所不同, 一个是直接定义 sql, 一个是在外部定义好 sql 直接引用。

public interface Mapper {

 @Select("select uuid,full_name as name from t_system_company ")
 List<Map<String, String>> getCompanyInfo();
}
@RegisterMapper
public interface SelectAllMapper<T> {

 @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
 List<T> selectAll();
}

@SelectProvider 引用的各种 *Provider.class 实现类,就是依赖反射、注解等手段拼接 SQL 语句的过程。

 /**
  * 查询全部结果
  *
  * @param ms
  * @return
  */
 public String selectAll(MappedStatement ms) {
  final Class<?> entityClass = getEntityClass(ms);
  //修改返回值类型为实体类型
  setResultType(ms, entityClass);
  StringBuilder sql = new StringBuilder();
  sql.append(SqlHelper.selectAllColumns(entityClass));
  sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));

  // 逻辑删除的未删除查询条件
  sql.append("<where>");
  sql.append(SqlHelper.whereLogicDelete(entityClass, false));
  sql.append("</where>");

  sql.append(SqlHelper.orderByDefault(entityClass));
  return sql.toString();
 }

四、结语

当初从 Hibernate 换到 Mybatis,把 HQL、QBC 语句的成本换成简单的 SQL 语句,这?现在又兜兜转转回去了?

Tkmybatis 减少了一系列对单表的单调接口和繁杂的 SQL 语句,但也降低了代码的可读性,另外这种广而全的数据库操作,必然会牺牲一部分的查询性能。

可以在一些并发量不大、对性能要求不高的项目中尝试下 Tkmybatis ,对一些比较大的项目来说,还是希望自己对 SQL 的控制更强一点。

相关链接:1. mybatis @SelectProvider 注解, 打赌你没有用过

相关文章

  • 浅谈C#与Java两种语言的比较

    浅谈C#与Java两种语言的比较

    今天小编就为大家分享一篇关于浅谈C#与Java两种语言的比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • idea+ springboot热部署的配置方法

    idea+ springboot热部署的配置方法

    这篇文章主要介绍了idea+ springboot熱部署的配置方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Spring内置任务调度如何实现添加、取消与重置详解

    Spring内置任务调度如何实现添加、取消与重置详解

    任务调度是我们日常开发中经常会碰到的,下面这篇文章主要给大家介绍了关于Spring内置任务调度如何实现添加、取消与重置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • 浅析Java语言中状态模式的优点

    浅析Java语言中状态模式的优点

    状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托到 代表当前状态的对象,我们知道行为会随着内部状态而改变
    2023-02-02
  • Spring启动指定时区的两种方法

    Spring启动指定时区的两种方法

    最近项目启动,时间要修改成东七区时间,本文主要介绍了Spring启动指定时区的两种方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java中PriorityBlockingQueue的入队知识点总结

    java中PriorityBlockingQueue的入队知识点总结

    在本篇文章里小编给大家整理一篇关于java中PriorityBlockingQueue的入队知识点总结内容,有需要的朋友们可以学习下。
    2021-01-01
  • springbooot使用google验证码的功能实现

    springbooot使用google验证码的功能实现

    这篇文章主要介绍了springbooot使用google验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 关于webLucene 安装方法

    关于webLucene 安装方法

    webLucene是一个基于开源项目lucene实现站内搜索的工具,关于它的安装,百度得到的大多是一样的,按照步骤也能正确安装并运行,需要注意的问题是
    2009-06-06
  • 处理Log4j2不能打印行号的问题(AsyncLogger)

    处理Log4j2不能打印行号的问题(AsyncLogger)

    这篇文章主要介绍了处理Log4j2不能打印行号的问题(AsyncLogger),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Aop注解实现

    Spring Aop注解实现

    本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,非常不错,具有一定的参考借鉴价值,需要的朋友一起看看吧,希望对你有所帮助
    2021-07-07

最新评论