JpaMapper

mybatis免sql插件之JpaMapper-以Jpa hib

2018-12-05  本文已影响10人  逍遥天扬

mybatis免sql插件之JpaMapper-以Jpa hibernate的风格写mybatis(生成自定义的MappedStatement)

简介

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

上篇作为起始篇,介绍一下如何从spring容器中获取到mybatis的mapper/bean。
这一篇将介绍生成自定义的MappedStatement的过程。

mybatis的注解解析MapperAnnotationBuilder

mybatis的注解解析方法位于MapperAnnotationBuilder中。

  1. parseStatement负责解析每个方法上的sql语句
  2. buildSqlSourceFromStrings负责生成SqlSource
  3. MapperBuilderAssistant负责将SqlSource存入mybatis的管理器中。
  4. handleSelectKeyAnnotation负责处理SelectKey注解,属于主键id回返的策略

当然,里面的方法不止这些,我们需要用的大概就这些了,其他的都是小细节了。

定义自己的解析器JpaMapperAnnotationBuilder

这里就只说主要内容了,其他从简。

  1. 首先我们需要确定我们的方法类型是属于增删改查的哪一种

  2. 根据方法名确定我们生成的sql语句

在这之前,我们还是要先拿到mapper接口定义的泛型,并分析泛型类的字段,拿到我们想要的信息,比如字段对应、id字段及策略、分表字段等

生成SqlSource

根据我们前面拿到的信息生成sql,并将sql使用languageDriver.createSqlSource创建mybatis需要的SqlSource。

public static SqlSource createSqlSource(JpaModelEntity jpaModelEntity, Method method, SqlType sqlCommandType,
        Class<?> parameterTypeClass, LanguageDriver languageDriver, Configuration configuration) {
    try {
        String sql = "";
        if(jpaModelEntity.isSharding()){
            sql = createShardingSql(jpaModelEntity, method, sqlCommandType);
        }else{
            sql = createCommonSql(jpaModelEntity, method, sqlCommandType);
        }
        if (StringUtil.isEmpty(sql))
            return null;
        return languageDriver.createSqlSource(configuration, sql, parameterTypeClass);
    } catch (Exception e) {
        throw new BuilderException("Could not find value method on SQL annotation.  Cause: " + e, e);
    }
}

生成Sql

这里仅以findBy + 字段做说明

mybatis查询结果一般作为实体或list返回,所以,findBy操作我们将返回Collection<T>,这个可以不管,写的时候定义什么就是什么。

查询字段

查询字段使用前面分析好的泛型类的字段,使用@Column注解获取数据库字段的名称。因此我们可以生成select的前缀:

select 数据库字段 as 成员名称 , (...)

表名

表名我们使用@Table注解指定。所有我们可以写成:

from 表名

查询条件

findBy + 字段 (and)做查询时,查询条件要把方法名做解析后获得。

String[] params = 方法名.split("And|and|AND");

根据方法名参数,我们可以找到对应的查询条件:

where 条件1(param在实体中的数据库对应名称) = #{实体中的成员名称} and (...)

至此,一个简单的findBy写好了。其他的方法将不再赘述。

下篇介绍下保存后如何拿回Id字段的值。
上一篇下一篇

猜你喜欢

热点阅读