------Mybatis框架-:緩存問題-------java
<?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"> <mapper namespace="com.bdit.dao.IUserDao"> <!--cache 標籤標示當前這個 mapper 映射將使用二級緩存開啓二級緩存--> <!-- <cache></cache>--> <!--一級緩存是 SqlSession 級別的緩存,--> <!--useCache="true" 表明當前這個 statement 要使用二級緩存, 若是不使用二級緩存就設置爲 false【針對每次查詢都須要更新的數據, 就不建議使用二級緩存】--> <select id="findFiby" resultType="User" parameterType="int" useCache="true"> select * from user where id=#{id} </select> <resultMap id="Map6" type="User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="age" property="age"/> <result column="address" property="address"/> <!--關聯表中的實體屬性--> <collection property="accountList" javaType="List" ofType="Account" select="com.bdit.dao.IAccountDao.byid" column="id"/> </resultMap> <select id="findAll" resultMap="Map6"> select * from user </select> <!--一級緩存--> <select id="findAll" resultType="User"> select * from user </select> </mapper>
SqlMapConfig映射文件mysql
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- <!–-開啓二級緩存:默認就是開啓,則能夠不寫–>--> <!-- <settings>--> <!-- <setting name="cacheEnabled" value="true"/>--> <!-- </settings>--> <!--加載ab.properties屬性文件:第二種方式--> <properties resource="ab.properties"></properties> <!--開啓延遲加載:--> <!-- lazyLoadingEnabled:若是等於true的話,就延遲加載,若是等於false的話就深度加載 aggressiveLazyLoading:若是等於true的話,就延遲加載,若是等於false的話就深度加載 --> <settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="fasle"/> </settings> <!--定義單個別名:若是定義了別名,IUserDao中凡是用到包名.類名的 都用別名來代替--> <typeAliases> <!-- <typeAlias type="User" alias="User"/>--> <!--若是有多個,則批量定義,掃描整個包下的類,別名爲類名,(首字母大小寫均可以)--> <package name="com.bdit.model"/> </typeAliases> <!--開啓延遲加載:--> <!--配置Mybatis的環境--> <environments default="mysql"> <!--配置mysql的環境--> <environment id="mysql"> <!--配置事物的類型--> <transactionManager type="JDBC"/> <!--配置鏈接數據庫的信息,用的數據源是(鏈接池)--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--告知mybatis映射文件的位置--> <!--SQL映射文件mybatis是不認識的,全部須要告知--> <mappers> <!-- <mapper resource="com/bdit/dao/IUserDao.xml"/>--> <!--基於註解的方式--> <!--<mapper class="com.bdit.dao.IUserDao"/>--> <!--註冊指定包下的全部 mapper接口:也就是所謂的DAO接口--> <package name="com.bdit.dao"/> </mappers> </configuration>
測試類sql
package com.bdit; import com.bdit.dao.IUserDao; import com.bdit.model.Account; import com.bdit.model.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.IOException; import java.io.InputStream; import java.util.List; //測試類 public class mybatisTest1 { private InputStream input; private SqlSessionFactory factory; private SqlSession session; private IUserDao iUserDao; @Before //封裝好的數據,初始化時加載 public void init()throws IOException { //1 、 讀取配置文件-->SqlMapConfig核心的配置文件 input = Resources.getResourceAsStream("SqlMapConfig.xml"); //二、建立SqlSessionFactoryBuilder構建者的對象。 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); // 三、使用構建者對象建立工廠對象:SqlSessionFactory factory = builder.build(input); //四、使用SqlSessionFactory對象建立SqlSession對象 //4.1 =設置事務爲自動提交 session = factory.openSession(true); //五、使用SqlSession對象建立Dao接口的代理對象 iUserDao= session.getMapper(IUserDao.class); } @After public void destory()throws IOException { //提交事務 --上面設置爲自動提交 //session.commit(); //關閉釋放資源 session.close(); input.close(); } //查詢帳全部的帳戶:並關聯全部的用戶 @Test public void find(){ List<User>list=iUserDao.findAll(); for(User ss:list){ System.out.println(ss.getId()+"=="+ss.getUsername()+"=="+ss.getAge()+"=="+ss.getAddress()); List<Account>list1=ss.getAccountList(); for(Account s:list1){ System.out.println(s.getZid()+"--"+s.getUid()+"--"+s.getMoney()); } } } } package com.bdit; import com.bdit.dao.IUserDao; import com.bdit.model.Account; import com.bdit.model.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.IOException; import java.io.InputStream; import java.util.List; //測試類 public class mybatisTest2 { private InputStream input; private SqlSessionFactory factory; private SqlSession session; private IUserDao iUserDao; @Before //封裝好的數據,初始化時加載 public void init()throws IOException { //1 、 讀取配置文件-->SqlMapConfig核心的配置文件 input = Resources.getResourceAsStream("SqlMapConfig.xml"); //二、建立SqlSessionFactoryBuilder構建者的對象。 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); // 三、使用構建者對象建立工廠對象:SqlSessionFactory factory = builder.build(input); //四、使用SqlSessionFactory對象建立SqlSession對象 //4.1 =設置事務爲自動提交 session = factory.openSession(true); //五、使用SqlSession對象建立Dao接口的代理對象 iUserDao= session.getMapper(IUserDao.class); } @After public void destory()throws IOException { //提交事務 --上面設置爲自動提交 //session.commit(); //關閉釋放資源 session.close(); input.close(); } //一級緩存是 SqlSession 級別的緩存, // 只要 SqlSession 沒有 flush 或 close,它就有效 @Test public void find(){ User user=iUserDao.findFiby(2); System.out.println("第一次查詢用戶的User"+user); //測試一級緩存的清空 session.clearCache(); User user1=iUserDao.findFiby(2); System.out.println("第二次查詢用戶的User"+user1); System.out.println(user==user1); } //測試二級緩存 @Test public void method(){ SqlSession session1=factory.openSession(); IUserDao userDao1=session1.getMapper(IUserDao.class); User user=userDao1.findFiby(1); System.out.println("第一次查詢"+user); session.close(); SqlSession session2=factory.openSession(); IUserDao userDao2=session2.getMapper(IUserDao.class); User user2=userDao2.findFiby(1); System.out.println("第二次查詢"+user2); session.close(); System.out.println(user==user2); } }