------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); } }