Mybatis事务管理机制和缓存机制

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>

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32754539/article/details/89892056