一、概述
原生的JDBC,驱动连接,sql处理,结果集映射,参数转换都需要自己处理,比较麻烦。
mybatis的出现,有效的简化的传统JDBC的操作,特点如下:
- 使用连接池进行连接的统一管理;
- SQL和代码分离,集中管理;
- 结果集映射处理;
- 参数映射和动态sql拼接
- 重复sql提取
- 缓存处理
- 插件机制
二、主要配置文件
mybatis中比较重要的配置文件,全局配置文件和mapper文件。
全局配置文件解析:
在xml中进行全局配置文件配置,必须遵循xml中的scheme约束,按照相应的标签顺序处理。
xml中属性如下:
configuration标签是配置文件根标签;
properties标签中resource属性,可以引用一个资源路径.properties文件,主配置文件用${}引用资源文件中的配置项。
settings标签是一个比较重要运行时的配置项:
如:日志,二级缓存是否开启,延时加载开关等,都在这进行相应的配置。
typeAliase标签,主要定义一种映射关系,简化结果集的映射操作。
typeHandlers标签,可以配置自定义的结果映射处理。
注:mybatis内置了很多TypeHandler,他们全部注册到TypeHandlerRegistry中,并且继承BaseTypeHandler。这样大部分的类型装换都帮我们处理了。
objectFactory标签,可以自定义我们自己的对象创建工厂。
注:当我们把数据库返回的信息转化为实体类的时候,我们必须通过反射创建对应的实体信息。
mybatis提供了ObjectFactory工厂来创建对象的实例,它是接口,有一个默认实现DefaultObjectFactory,创建对象都要调用instantiateClass(),这里能看到对应的反射代码。
pulgins标签,是mybatis预留的插件接口,让mybatis更加容易拓展。
environment标签,其中一个事务管理,一个是数据源。
标签的属性分别为transactionManager,datasource
mapper标签,配置xml文件对应的路径,目的是mybatis启动后,扫描映射器创建映射关系。
映射文件解析:
mapper文件组成由 UserMapper接口 以及对应的一个UserMapper.xml配置文件,其中xml中的namespace对应的UserMapper接口的全路径。
保证接口名称和UserMapper.xml中的sql标签中id一致就ok,最终通过反射就能调用处理。
映射文件相关标签:
● cache标签,该命名空间的缓存配置
● cache-ref,引用其他命名空间的缓存配置
● resultMap 从数据库结果集中加载对象,是最复杂也是最强大的元素
● parameterMap 参数映射,已废弃
● sql 可重用语句快
● select
● update
● delete
● insert
动态sql语句
● if 标签含有test属性 判断值是否存在
● choose(when,otherwise) when 中也有test属性
● trim (where set) prefix属性前缀 prefixOverriders suffixoverrides
● foreach 集合遍历 collection item open seperator close
mybatis中执行器
mybatis的批量更新比for循环的一条条的更新效率高的多,关键在于减少数据库操作次数,并且避免开启和结束事务的时间消耗。
批量操作的执行器BatchExecutor,如果批量操作的sql语句过大,默认的max_allowed_packet默认是4k。
全局配置时,setting如果不指定默认是Simple,当然也可以在创建会话的时候指定。
Executor 顶级接口
BaseExecutor CachingExecutor 分别实现Executor
最后 SimpleExecutor ReuseExecutor BatchExecutor CloseExecutor 都继承自BaseExecutor
SimpleExecutor: 执行完一次update或者select,就开启一个statement对象,用完立即关闭。
ReuseExecutor:执行完update或者select,以sql作为key查找statement对象,存在就使用,不存在就重新创建,用Map进行缓存。
BatchExecutor:执行update,将所有sql都添加到批处理中,等待统一执行。
关联查询:
resultMap 结果集映射 association标签 1对1的映射关系
collection 1对多的映射关系
分页处理:
逻辑分页:Mybatis中逻辑分页对象RowBounds,工作原理其实是对ResultSet的处理,它会舍弃掉offset条数据,然后取剩下的limit条数据。
物理分页:
是真正的分页,通过数据库支持的语句实现分页。
PageHelper是mybatis拦截器实现的,利用插件的相关原理。