欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

TKmybatis的框架介绍和原理解析

程序员文章站 2022-03-24 14:41:54
一、tkmybatistkmybatis 是基于 mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率。二、怎么用?1....

一、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 注解, 打赌你没有用过