天天看点

Mybatis jpa mini 代码解析二、Mybatis JPA

Mybatis中3个重要的概念:Configuration(容器),SqlSessionFactory(工厂),SqlSession;

相对于Spring中的applicationContext,BeanFactory,Bean。

不同之处在于SqlSession包含了所有的SQL方法,即这个SqlSession有且只有一个。SqlSession可以执行mybatis中注册的所有方法。官方示例说明

ResultMap是myabtis最重要最强大的元素,是SQL列名columnName与POJO属性名filedName的高级结果映射。对ResultMap不熟悉的朋友可以阅读官方文档了解。

ResultType可以理解为mybatis自动映射生成的简单的ResultMap,当POJO中的filedName与数据库ColumnName不一致时,无法完成映射。

ResultMap中使用

sql中使用

Mapper中的方法(方法签名和可执行的sql语句)会被封装为MappedStatement注册到Configuration中。

详见mybatis源码MapperBuilderAssistant.addMappedStatement(args);

1)首先,我们希望能够与spring集成,使用spring的依赖注入。

2)其次,我们希望能够兼容spring-mybatis集成的代码,拒绝污染。

3)解析注册ResultMap和MappedStatement。

1)参考spring data jpa,使用@RepositoryDefinition注解,标记需要自动生成sql的dao。

我们使用@MapperDefinition和@StatementDefinition注解,标记需要自动生成sql的dao和method。

这个是关键,既保证了不污染原有代码,又可以使用spring-mybatis已经实现的依赖注入。

我们只需要在此基础上,对特定注解标注的mapper类和方法做处理即可。

2)参考spring-mybatis

MapperScannerConfigurer,扫描mapper并注册到mybatis Configuration中,继而生成代理类。

MapperAnnotationBuilder实现java注解生成ResultMap和MappedStatement。

在spring容器初始化后,对@MapperDefinition标注的mapper类进行扫描。

重点:columnName与fieldName映射,特殊字段的jdbcType和typeHandler。

1)columnName与fieldName映射,使用JPA注解 @Cloumn即可,但是,我们希望能够自动转换驼峰与下划线风格,即对于符合规范命名的,不需要注解,直接映射。参见:PersistentUtil,ColumnNameUtil。

2)jdbcType和typeHandler

处理了以下3种类型:POJO中的Enum,Boolean,以及数据库中的CLOB,代码见MybatisColumnMeta。

需要强调说明的是,这里为所有的field都声明了jdbcType,是为了规避sql中参数为null时,产生异常。

3)ResultMap注册

见ResultMapAdapter.parseResultMap(args);

分类处理,select需要用到ResultMap,默认为Pojo.getSimpleName() + "ResultMap";

insert和insertSelective的区别:在于null值的处理,假设column_1在数据库设置了默认值,而参数中的field_1为null值,则insert 在数据库写入null,而insertSelective写入数据库默认值.

需要特别说明的是,动态SQL需要使用"<script></script>"标签包围。

对于各种sql方法的语句生成方法,详见com.mybatis.jpa.statement.builder包下的类。

这里以InsertSelective和select为例

本文转自xsster51CTO博客,原文链接: http://blog.51cto.com/12945177/1950668,如需转载请自行联系原作者