mybatis免sql插件之JpaMapper-以Jpa hibernate的风格写mybatis(实现分页排序功能)

mybatis免sql插件之JpaMapper-以Jpa hibernate的风格写mybatis(实现分页排序功能)

简介

JpaMapper以Jpa hibernate的风格写mybatis的代码,可以减少手动写sql的烦恼。

优势:

  1. 不替换底层实现,仅生成sql并交给mybatis
  2. 方法基本与Jpa hibernate相似,易于框架替换,当然,没那么厉害,不支持联表哦,项目还在继续完善中。
  3. 提供简单分表功能
  4. 逻辑简单,可以拿去自己定制
  5. 提供分页排序功能,最简单的方法实现分页!

gitee地址:https://gitee.com/ffch/JpaMapper

github地址:https://github.com/ffch/jpa-mapper

上篇介绍如何使用mybatis做简单分表。这一篇将介绍如何使用mybatis做分表排序。

用一次查询让mybatis实现分页

为了能够实现自定义的分页查询,我们要先明白如何用mybatis一次查询实现分页。

@Results注解

@Results注解可以将查询结果映射到对应的字段上,因为我们可能会想到,将查询结果作为list传给page实体中的list,然后用类似SelectKey注解实现的功能查询一次count。

然而,经过多次实验,该方法行不通,查询结果无法作为list传给page实体中的list

@Many注解

虽然上述方式行不通,但是我们还要继续折腾,@Many注解是一对多查询,所以是否可以count之后查询list呢?

答案是可以,但是困难重重,@Many注解要求是外键关联,count和后续查询没有什么关联,因此我们要另辟蹊径。

解决方案

@Result(column = "{page = page,size = size}", property = "list", many = @Many(select="selectPage")

这里将page和size作为参数传给。@Many指定查询方法selectPage。selectPage查询后将结果返回给list。问题解决。

但是page和size不能通过参数传入,属于column,因此,我们需要将page和size作为count查询结果,这样我们才能拿到。

最终

@Select({
	"<script>",
        "SELECT ",
        "userName,passwd,name,mobile,valid",
        "FROM user_info",
        "limit #{size} OFFSET #{page}",
   "</script>"})
List<UserInfo> selectPage(int page, int size);

@Select({
	"<script>",
        "SELECT count(1) count, ${page} page, ${size} size",
        "FROM user_info",
   "</script>"})
@Results(value = {
        @Result(column = "count", property = "count", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
        @Result(column = "{page = page,size = size}", property = "list", many = @Many(select="selectPage"))
})
Page<UserInfo> selectCount(@Param("page")int page, @Param("size")int size);

自定义分页查询

为了实现我们的分页功能,我们需要思考怎么将@Many动态生成,因为我们要支持pageBy操作的,要和jpa hibernate拼一拼的。所以这个@Many的select语句是无法指定的,我们需要隐形生成一个MappedStatement。

因此,我们要定义一个新的MappedStatement生成方案,专门生成隐形MappedStatement。并根据pageBy后的参数名,生成mybatis需要的各项参数。 这里面还有个问题,就是不同的数据库类型,分页查询的方式不同的,所以这里我们还要拿到数据库类型:

拿到数据库类型

通过mybatis的configuration可以拿到DataSource。通过DataSource我们又可以拿到相应driver中定义的数据库名称。

Environment environment = configuration.getEnvironment();
DataSource dataSource = environment.getDataSource();
DatabaseMetaData md = dataSource.getConnection().getMetaData();
String databaseName = md.getDatabaseProductName();

通过这,我们就能分表Mysql和Oracle等,后续就是拼SQL的过程了。

这篇大致介绍完了。想了解更多就可以访问:

gitee地址:https://gitee.com/ffch/JpaMapper

github地址:https://github.com/ffch/jpa-mapper

下篇先介绍下JpaMapper的详细功能和使用方法。

猜你喜欢

转载自blog.csdn.net/feiyangtianyao/article/details/84638378
今日推荐