mybatis的二级缓存
生活随笔
收集整理的這篇文章主要介紹了
mybatis的二级缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二級緩存是mapper映射級別的緩存,多個SqlSession去操作同一個Mapper映射的sql語句,多個SqlSession可以共用二級緩存,
二級緩存是跨SqlSession的。
二級緩存結構圖
?首先開啟mybatis的二級緩存。
sqlSession1去查詢用戶信息,查詢到用戶信息會將查詢數據存儲到二級緩存中。
第一步:在SqlMapConfig.xml文件開啟二級緩存
<settings><setting name="cacheEnabled" value="true"/></settings> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 配置properties--><properties resource="jdbcConfig.properties"></properties><settings><setting name="cacheEnabled" value="true"/></settings><!--使用typeAliases配置別名,它只能配置domain中類的別名 --><typeAliases><package name="com.learn.domain"></package></typeAliases><!--配置環境--><environments default="mysql"><!-- 配置mysql的環境--><environment id="mysql"><!-- 配置事務 --><transactionManager type="JDBC"></transactionManager><!--配置連接池--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></dataSource></environment></environments><!-- 配置映射文件的位置 --><mappers><package name="com.learn.dao"></package></mappers> </configuration>第二步:配置相關的Mapper映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.learn.dao.IUserDao"><!-- 開啟user支持二級緩存 --><cache/><!-- 查詢所有 --><select id="findAll" resultType="user">select * from user</select><!-- 根據id查詢用戶 --><select id="findById" parameterType="INT" resultType="user" useCache="true">select * from user where id = #{uid}</select><!-- 更新用戶信息--><update id="updateUser" parameterType="user">update user set username=#{username},address=#{address} where id=#{id}</update> </mapper>第三步:配置statement上面的useCache屬性
<select id="findById" parameterType="INT" resultType="user" useCache="true">select * from user where id = #{uid}</select>二級緩存測試
package com.learn.test;import com.learn.dao.IUserDao; import com.learn.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test;import java.io.InputStream;/*** @author 黑馬程序員* @Company http://www.ithiema.com*/ public class SecondLevelCacheTest {private InputStream in;private SqlSessionFactory factory;@Before//用于在測試方法執行之前執行public void init()throws Exception{//1.讀取配置文件,生成字節輸入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.獲取SqlSessionFactoryfactory = new SqlSessionFactoryBuilder().build(in);}@After//用于在測試方法執行之后執行public void destroy()throws Exception{in.close();}/*** 測試一級緩存*/@Testpublic void testFirstLevelCache(){SqlSession sqlSession1 = factory.openSession();IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);User user1 = dao1.findById(41);System.out.println(user1);sqlSession1.close();//一級緩存消失SqlSession sqlSession2 = factory.openSession();IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);User user2 = dao2.findById(41);System.out.println(user2);sqlSession2.close();System.out.println(user1 == user2);}}經過上面的測試,我們發現執行了兩次查詢,并且在執行第一次查詢后,我們關閉了一級緩存,再去執行第二次查詢時,
我們發現并沒有對數據庫發出sql語句,所以此時的數據就只能是來自于我們所說的二級緩存。
二級緩存注意事項
當我們在使用二級緩存時,所緩存的類一定要實現java.io.Serializable接口,這種就可以使用序列化方式來保存對象。
package com.learn.domain;import java.io.Serializable; import java.util.Date;public class User implements Serializable {private Integer id;private String username;private String address;private String sex;private Date birthday;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}// @Override // public String toString() { // return "User{" + // "id=" + id + // ", username='" + username + '\'' + // ", address='" + address + '\'' + // ", sex='" + sex + '\'' + // ", birthday=" + birthday + // '}'; // } }?
總結
以上是生活随笔為你收集整理的mybatis的二级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis中的一级缓存
- 下一篇: mybatis注解开发使用二级缓存