深入解析

Mybatis3.3.x技术内幕(十一):执行一个Sql命令的完整流程

混江龙づ霸主 提交于 2020-03-04 17:36:54
Mybatis中的Sql命令,在枚举类SqlCommandType中定义的。 public enum SqlCommandType { UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH; } 下面,我们以Mapper接口中的一个方法作为例子,看看Sql命令的执行完整流程。 public interface StudentMapper { List<Student> findAllStudents(Map<String, Object> map, RowBounds rowBounds, ResultSetHandler rh); } 参数RowBounds和ResultSetHandler是可选参数,表示分页对象和自定义结果集处理器,一般不需要。 一个完整的Sql命令,其执行的完整流程图如下: (Made In Edrawmax) 对于上面的流程图,如果看过前面的博文的话,大部分对象我们都比较熟悉了。一个图,就完整展示了其执行流程。 MapperProxy的功能: 1. 因为Mapper接口不能直接实例化, MapperProxy的作用,就是使用JDK动态代理功能,间接实例化Mapper的proxy对象。可参看系列博文的第二篇。 2. 缓存 MapperMethod对象。 private final Map<Method,

Mybatis3.3.x技术内幕(十):Mybatis初始化流程(下)

可紊 提交于 2019-11-27 08:34:36
Mybatis初始化过程中,解析parameterMap、resultMap、"select|insert|update|delete"元素,无疑是重头戏。本节将详细分析解析过程。 元素 parameterMap 将会解析为ParameterMap对象,该对象包含一个List<ParameterMapping>集合,是one-to-many关系。 元素 resultMap将会解析为ResultMap对象,该对象包含一个List<ResultMapping>集合, 是one-to-many关系 。 元素"select|insert|update|delete"将会被解析为MappedStatement对象,该对象包含了ParameterMap、 ResultMap等对象。 1. 解析 parameterMap元素 (Made In Visual Paradigm) MapperBuilderAssistant是一个通用构建Mapper辅助类。 ParameterMapping.Builder用于构建 ParameterMapping对象,而ParameterMap.Builder则用于构建 ParameterMap对象。 其中resolveTypeHandler()很重要,我们自定义的 TypeHandler要起作用,就靠该方法正确绑定 TypeHandler了,后续会单独开一篇关于

Mybatis3.3.x技术内幕(十四):Mybatis之KeyGenerator

非 Y 不嫁゛ 提交于 2019-11-26 20:36:20
在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象。 需要注意的是,KeyGenerator的作用,是返回数据库生成的自增主键值,而不是生成数据库的自增主键值。返回的主键值放到哪儿呢?放到parameter object的主键属性上。 下面看看其接口定义。 public interface KeyGenerator { void processBefore(Executor executor, MappedStatement ms, Statement stmt, Object parameter); void processAfter(Executor executor, MappedStatement ms, Statement stmt, Object parameter); } 接口定义还是比较简单的,就是在insert前、insert后,策略处理主键值。 (Made In IntelliJ IDEA IDE) Jdbc3KeyGenerator:用于处理数据库支持自增主键的情况,如MySQL的auto_increment。 NoKeyGenerator:空实现,不需要处理主键。 SelectKeyGenerator:用于处理数据库不支持自增主键的情况,比如Oracle的sequence序列。