首页 > 技术文章 > 11 mybatis-高级应用

lizhuxin 2019-04-21 15:21 原文

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是序列化的。

二级缓存的流程如下:

 

 

推荐阅读