mybatis免sql插件之JpaMapper-以Jpa hibernate的风格写mybatis(实现分页排序功能)
简介
JpaMapper以Jpa hibernate的风格写mybatis的代码,可以减少手动写sql的烦恼。
优势:
- 不替换底层实现,仅生成sql并交给mybatis
- 方法基本与Jpa hibernate相似,易于框架替换,当然,没那么厉害,不支持联表哦,项目还在继续完善中。
- 提供简单分表功能
- 逻辑简单,可以拿去自己定制
- 提供分页排序功能,最简单的方法实现分页!
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的详细功能和使用方法。
网友评论