二级缓存:
二级缓存是大过SqlSession范围的,不同的SqlSession也是可以用的。二级缓存容易发生脏读,特别是多表查询的时候。二级缓存在实际开发里面是不常用的,一般用redis去缓解数据库压力。
开启二级缓存:
在SqlMapperConfig.xml里面开启二级缓存的设置。
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
UserMapper.xml:
在UserMapper.xml里面,加上useCache属性,标记为true。
<!--useCache = true 表示为开启缓存-->
<select id="findUserById" parameterType="int" resultType="com.findyou.entity.User" useCache="true">
select * from user where id = #{uid};
</select>
对象序列化:
测试代码:
测试类里面用的是两个SqlSession去检验的,第一个SqlSession先去二级缓存里面去找,但是没找到,就回去数据库里面找,然后其close的时候,会把数据刷新到二级缓存里面。当第二个SqlSession去找到的时候,发现二级缓存里面有,就不再去数据库里面查询了。
/**
* 验证二级缓存
*/
@Test
public void test08() {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
throw new RuntimeException(e);
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession1 = sqlSessionFactory.openSession(); /*默认的是手动的提交 如果里面的参数是true的话 就为自动提交了*/
// 第一次调用的时候没有
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = userMapper1.findUserById(1);
System.out.println(user1);
sqlSession1.close(); // 关闭的时候 会把一级缓存刷新到二级缓存里面
SqlSession sqlSession2= sqlSessionFactory.openSession();
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
User user2= userMapper2.findUserById(1);
System.out.println(user2);
sqlSession1.close(); // 关闭的时候 会刷新到二级缓存里面
}
Mybatis注解@select
UserMapper接口:
也即是直接在方法的上面写注解,value = 要执行的sql语句,只有一个参数的时候,value可以省略。
public interface UserMapper {
/**
* 查询全部的用户 用的是注解的形式
* @return
*/
@Select("select * from user")
List<User> findAll();
}
测试类:
用到了@Before注解,也即是在执行任何代码之前都会先去执行@Before里面的代码。同理,@After在之后进行执行。最后的输出用的是lambda表达式。
public class MyTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private InputStream inputStream;
/**
* 执行测试之前,会先去执行这个Before 也就是初始化
*/
@Before
public void before() throws IOException {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
}
/**
* 执行完测试之后,会去执行这个
*/
@After
public void after() {
sqlSession.commit();
sqlSession.close();
}
@Test
public void test01() {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> allUser = userMapper.findAll();
allUser.forEach(System.out::println);
}
}