mybatis事务管理机制
事务特性
事务配置
缓存机制
一级缓存(sqlsession关闭之后,记录清空)
默认开启
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="org.fkit.mapper.UserMapper">
<!-- 根据id查询User -->
<select id="selectUserById" parameterType="int"
resultType="org.fkit.domain.User">
SELECT * FROM TB_USER WHERE id = #{id}
</select>
<!-- 查询所有User -->
<select id="selectAllUser" resultType="org.fkit.domain.User">
SELECT * FROM TB_USER
</select>
<!-- 根据id删除User -->
<delete id="deleteUserById" parameterType="int">
DELETE FROM TB_USER WHERE id = #{id}
</delete>
</mapper>
User.java
package org.fkit.mapper;
import java.util.List;
import org.fkit.domain.User;
public interface UserMapper {
// 根据id查询User
User selectUserById(Integer id);
// 查询所有User
List<User> selectAllUser();
// 根据id删除User
void deleteUserById(Integer id);
}
FKSqlSessionFactory.java
package org.fkit.factory;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class FKSqlSessionFactory {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化创建SqlSessionFactory对象
static{
try {
// 读取mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
// 获取SqlSessionFactory的静态方法
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
TestOneLevelCache .java
package org.fkit.test;
import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.User;
import org.fkit.factory.FKSqlSessionFactory;
import org.fkit.mapper.UserMapper;
public class TestOneLevelCache {
public static void main(String[] args) throws Exception {
TestOneLevelCache t = new TestOneLevelCache();
t.testCache1();
// t.testCache2();
// t.testCache3();
}
/*
* 一级缓存: 也就Session级的缓存(默认开启)
*/
public void testCache1 (){
// 使用工厂类获得SqlSession对象
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 获得UserMapping对象
UserMapper um = session.getMapper(UserMapper.class);
// 查询id为1的User对象,会执行select语句
User user = um.selectUserById(1);
System.out.println(user);
// 再次查询id为1的User对象,因为是同一个SqlSession,所以会从之前的一级缓存中查找数据
User user2 = um.selectUserById(1);
System.out.println(user2);
// 关闭SqlSession对象
session.close();
}
public void testCache2 (){
// 使用工厂类获得SqlSession对象
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 获得UserMapping对象
UserMapper um = session.getMapper(UserMapper.class);
// 查询id为1的User对象,会执行select语句
User user = um.selectUserById(1);
System.out.println(user);
// 执行delete操作
um.deleteUserById(5);
// commit提交
session.commit();
// 再次查询id为1的User对象,因为DML操作会清空SqlSession缓存,所以会再次执行select语句
User user2 = um.selectUserById(1);
System.out.println(user2);
// 关闭SqlSession对象
session.close();
}
public void testCache3 (){
// 使用工厂类获得SqlSession对象
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 获得UserMapping对象
UserMapper um = session.getMapper(UserMapper.class);
// 查询id为1的User对象,会执行select语句
User user = um.selectUserById(1);
System.out.println(user);
// 关闭一级缓存
session.close();
// 再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常
session = FKSqlSessionFactory.getSqlSession();
// 再次获得UserMapping对象
um = session.getMapper(UserMapper.class);
// 再次访问,因为现在使用的是一个新的SqlSession对象,所以会再次执行select语句
User user2 = um.selectUserById(1);
System.out.println(user2);
// 关闭SqlSession对象
session.close();
}
}
二级缓存(sqlsession清空记录,重新创建的sqlsession还会读取二级缓存中数据)
mybatis-config.xml
<settings>
<setting name="logImpl" value="LOG4J"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="org.fkit.mapper.UserMapper">
<!-- 开启二级缓存
回收策略为先进先出
自动刷新时间60s
最多缓存512个引用对象
只读
-->
<cache
eviction="LRU"
flushInterval="60000"
size="512"
readOnly="true"/>
<!-- 根据id查询User -->
<select id="selectUserById" parameterType="int"
resultType="org.fkit.domain.User" useCache='false'>
SELECT * FROM TB_USER WHERE id = #{id}
</select>
<!-- 查询所有User -->
<select id="selectAllUser" resultType="org.fkit.domain.User">
SELECT * FROM TB_USER
</select>
<!-- 根据id删除User -->
<select id="deleteUserById" parameterType="int">
DELETE FROM TB_USER WHERE id = #{id}
</select>
</mapper>