美文网首页JpaMapper
mybatis免sql插件之JpaMapper-以Jpa hib

mybatis免sql插件之JpaMapper-以Jpa hib

作者: 逍遥天扬 | 来源:发表于2018-12-06 10:50 被阅读15次

    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的详细功能和使用方法。

    相关文章

      网友评论

        本文标题:mybatis免sql插件之JpaMapper-以Jpa hib

        本文链接:https://www.haomeiwen.com/subject/xumncqtx.html