MyBatis(8)延迟加载&缓存
<!-- 延迟加载 --> <settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
<!-- 延迟加载 --> <resultMap type="com.MrChengs.po.Orders" id="slow"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 实现对用户信息进行延迟加载 select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,如果findUserById不在本mapper中需要前边加namespace column:订单信息中关联用户信息查询的列,是user_id 关联查询的sql理解为: SELECT orders.*, (SELECT username FROM USER WHERE orders.user_id = user.id)username, (SELECT sex FROM USER WHERE orders.user_id = user.id)sex FROM orders --> <association property="user" javaType="com.MrChengs.po.User" select="com.MrChengs.mapper.UserMapper.findUserById" column="user_id"></association> </resultMap> <select id="findSlowing" resultMap="slow"> SELECT * from orders </select>
测试文件:
//延迟加载 @Test public void testfindSlowing() throws Exception { SqlSession sqlSession = getSqlSessionFactory().openSession(); //代理对象 OrderMapperCustomer mapper = sqlSession.getMapper(OrderMapperCustomer.class); //测试findOrderUsers List<Orders> orders = mapper.findSlowing(); for(Orders order : orders){ User user = order.getUser(); System.out.println(user); } sqlSession.close(); }
结果:
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743] DEBUG [main] - ==> Preparing: SELECT * from orders DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 3 DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=2, address=null] User [id=1, username=王五, birthday=null, sex=2, address=null] DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 10(Integer) DEBUG [main] - <== Total: 1 User [id=10, username=张三, birthday=Thu Jul 10 00:00:00 CST 2014, sex=1, address=北京市] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743]
第一次查询先去缓存中查询,若没有则取数据库中查询
//一级缓存 @Test public void testCahseFiret() throws Exception{ SqlSession sqlSession = getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //第一次查询 User user = mapper.findUserById(1); System.out.println(user); //第二次查询 User user1 = mapper.findUserById(1); System.out.println(user1); sqlsession.close(); }
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743] DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=2, address=null] User [id=1, username=王五, birthday=null, sex=2, address=null]
@Test public void testCahseFiret() throws Exception{ SqlSession sqlSession = getSqlSessionFactory().openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //第一次查询 User user = mapper.findUserById(1); System.out.println(user); //commit User adduser = new User(); adduser.setUsername("Mr"); adduser.setSex(1); mapper.addUser(user); //清空缓存 sqlSession.commit(); //第二次查询 User user1 = mapper.findUserById(1); System.out.println(user1); sqlSession.close(); }
结果:
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 149047107. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@8e24743] DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=2, address=null] DEBUG [main] - ==> Preparing: insert into user(id,username,birthday,sex,address) value(?,?,?,?,?) DEBUG [main] - ==> Parameters: 1(Integer), 王五(String), null, 2(Integer), null
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
cacheEnabled:对在此配置文件下的所有cache 进行全局性开/关设置。
<!-- 开启本mapper的namespace下的二级缓存 --> <cache> </cache>
实现pojo类实现里序列化接口:
public class User implements Serializable{ ...... }
为了将存储数据取出执行反序列化的操作,以内二级缓存存储介质多种多种杨,不一定在内存
//二级缓存 @Test public void testCahseSecond() throws Exception{ SqlSession sqlSession = getSqlSessionFactory().openSession(); SqlSession sqlSession1 = getSqlSessionFactory().openSession(); //第一次查询 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.findUserById(1); System.out.println(user); //将执行关闭操作,将sqlsession写道二级缓存 sqlSession.close(); //第二次查询 UserMapper mapper2 = sqlSession1.getMapper(UserMapper.class); User user1 = mapper2.findUserById(1); System.out.println(user1); sqlSession1.close(); }
结果:
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e] DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=2, address=null] DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1990a65e] DEBUG [main] - Returned connection 428910174 to pool. DEBUG [main] - Cache Hit Ratio [com.MrChengs.mapper.UserMapper]: 0.0 DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 1873859565. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6fb0d3ed] DEBUG [main] - ==> Preparing: select * from user where id=? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 User [id=1, username=王五, birthday=null, sex=2, address=null]