SSM(二级缓存、Mybatis注解@select)

二级缓存:

二级缓存是大过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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FindYou.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值