Mybatis入门系列之(十三)——一级缓存

本文通过示例展示了MyBatis的一级缓存机制。在同一个SqlSession内进行两次相同查询时,第二次查询会直接从缓存中获取结果,而不会重新执行SQL语句。但当SqlSession关闭或提交后,缓存会被清空。

一级缓存

在EmpMapper.java接口中增加如下方法:

/**
 * 根据id查询员工
 * @param id
 * @return
 */
Emp selectById(Long id);

/**
 * 根据id删除用户
 * @param id
 * @return
 */
int deleteByid(Long id);

在EmpMapper.xml配置文件中增加如下配置:

<select id="selectById" resultType="tk.mybatis.simple.model.Emp">
    SELECT * from emp where id = #{id}
</select>

<delete id="deleteByid">
    DELETE  FROM  emp where id = #{id}

测试缓存的代码如下:

public class CacheTest extends  BaseMapperTest{

    @Test
    public void testL1Cache(){
        SqlSession sqlSession = getSqlSession();
        Emp emp = null;
        try {
            EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
            emp = empMapper.selectById(3L);
            System.out.println(emp.getUserName());

            System.out.println("-----------------------------");
            emp.setUserEmail("张三");
            Emp emp1 = empMapper.selectById(3L);
            System.out.println(emp1.getUserName());

            Assert.assertEquals(emp,emp1);
        }finally {
            System.out.println("123");
            sqlSession.close();
        }

        System.out.println("开启新的sqlSession");
        sqlSession = getSqlSession();
        try {
            EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
            Emp emp2 = empMapper.selectById(3L);
            System.out.println(emp.getUserName());

            System.out.println("-----------------------------");
            emp.setUserEmail("里斯");
            //执行delete删除操作
            empMapper.deleteByid (2L);
            Emp emp3 = empMapper.selectById(3L);
            System.out.println(emp3.getUserName());

            Assert.assertEquals(emp2,emp3);
        }finally {
            System.out.println("123");
            sqlSession.close();
        }

    }

}

测试结果如下:

[DEBUG] 2018-05-01 07:11:25,897 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: SELECT * from emp where id = ?
[DEBUG] 2018-05-01 07:11:25,944 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 3(Long)
[TRACE] 2018-05-01 07:11:26,007 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
[TRACE] 2018-05-01 07:11:26,007 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Row: 3, test 3, 123456, email 3, <>, <>, 2018-04-29 13:33:33.0
[DEBUG] 2018-05-01 07:11:26,007 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Total: 1
test 3

分割线(“———————————————-”)

test 3
123
开启新的sqlSession
[DEBUG] 2018-05-01 07:11:26,101 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: SELECT * from emp where id = ?
[DEBUG] 2018-05-01 07:11:26,101 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 3(Long)
[TRACE] 2018-05-01 07:11:26,163 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
[TRACE] 2018-05-01 07:11:26,163 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Row: 3, test 3, 123456, email 3, <>, <>, 2018-04-29 13:33:33.0
[DEBUG] 2018-05-01 07:11:26,163 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Total: 1
test 3

分割线(“———————————————-”)

[DEBUG] 2018-05-01 07:11:26,163 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: DELETE FROM emp where id = ?
[DEBUG] 2018-05-01 07:11:26,163 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 2(Long)
[DEBUG] 2018-05-01 07:11:26,241 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Updates: 1
[DEBUG] 2018-05-01 07:11:26,241 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: SELECT * from emp where id = ?
[DEBUG] 2018-05-01 07:11:26,257 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 3(Long)
[TRACE] 2018-05-01 07:11:26,288 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Columns: id, user_name, user_password, user_email, user_info, head_img, create_time
[TRACE] 2018-05-01 07:11:26,288 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165)
<== Row: 3, test 3, 123456, email 3, <>, <>, 2018-04-29 13:33:33.0
[DEBUG] 2018-05-01 07:11:26,288 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Total: 1
test 3
123

java.lang.AssertionError:
Expected :tk.mybatis.simple.model.Emp@75d4a5c2
Actual :tk.mybatis.simple.model.Emp@557caf28

结果:第一次查询只发送了一条sql语句,第二次查询发送了两条sql语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值