该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固
事务
Mybatis事物的设计都是基于Transaction接口来进行的:
该接口实际上是使用模板设计模式进行设计,可以看见该接口实际上有两个实现类:
一个为ManagedTransaction:由容器实现对事务的管理,单独使用commit和rollback没有任何效果
一个为JdbcTransaction:由java.sql.Connection完成对事物的管理
实际的配置需要在mybatis-config.xml中进行:
<environments default="mysql">
<!-- 环境配置,即连接的数据库。 -->
<environment id="mysql">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!--配置数据源-->
<dataSource type="POOLED">
<!--对数据源进行配置-->
</dataSource>
</environment>
</environments>
具体的获得Transaction方式是通过在构造函数中传入已经构造好的Connection,之后对JdbcTransaction的commit和rollback都会通过该connection实现,而ManagedTransaction将rollback和commit写空,具体是创建哪种Transaction将由TransactionFactory去实现。
缓存
mybatis中的缓存一共分为两种缓存:
一级缓存
一级缓存是SqlSession级别的缓存,请注意只有查询会进行缓存,加入出现了对数据进行修改的DML操作(insert、update和delete)并进行了提交将会对缓存进行清空,一级缓存默认开启
二级缓存
二级缓存是mapper级别的缓存,也就可以理解为如果多个SqlSession使用同一个Mapper去进行获取信息的话,获取的信息将会在多个SqlSession之间进行共用。二级缓存默认不开启,需要通过在mybatis-config.xml显式的进行开启:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
并且还需要再XXXMapper.xml中进行二级缓存的配置:
<mapper>
<cache eviction="LRU" flushInterval="多少毫秒进行一次刷新" size="可以存储多少对象" readOnly="true/false返回对象是否只可读"/>
<!--如果返回可读写的缓存,那么需要通过序列化返回缓存对象的拷贝,会造成数据损失。所以readOnly属性主要用于性能优化-->
</mapper>
如果想在某些方法上设置禁用二级缓存,可以通过设置useCache属性为false来禁用缓存。