11 mybatis-高级应用
1 TypeHandler使用
MyBatis会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
mybaits内置了很多TypeHandler,如下:
自定义一个TypeHandler需要继承BaseTypeHandler类,并在配置文件中注册和使用
<typeHandlers>
<typeHandler handler="自定义TypeHandler"
javaType="XXX" jdbcType="VARCHAR"/>
</typeHandlers>
<resultMap>
<result property="id" column="id"/>
<result property="date" column="date" typeHandler="自定义TypeHandler"/>
</resultMap>
2 一对多映射
collection聚合:该方式效率较高,只需要执行一次sql
collection select嵌套:该方式效率较低,会执行多次sql查询。对象之间的sql配置是分开的,可重用性较好。
3 缓存
Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言,二级缓存是mapper级别的缓存,如下图:
一级缓存:
(1) MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的
(2) 同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况,多次查询时会使用缓存。
二级缓存:
(1) 二级缓存是基于 mapper文件的namespace的,也就是说多个sqlSession可以共享一个mapper中的二级缓存区域,是Application级别的缓存。
(2) 二级缓存有全局和Mapper中的两种开关配置,默认是关闭的。
(3) 二级缓存要求返回的模型类POJO是序列化的。
二级缓存的流程如下: