Mybatis(注解开发,缓存)--4

本文详细介绍了Mybatis注解开发的使用,包括注解测试类与接口的编写,以及一级和二级缓存的原理、测试策略与代码实现。特别关注了SpringBoot整合Mybatis时的一级缓存问题及解决方法,并演示了如何在Mapper中启用二级缓存。
摘要由CSDN通过智能技术生成

目录

1. Mybatis(二)

1.1 Mybatis 注解开发

1.1.1 编辑测试类

1.1.2 编辑测试接口

1.2 Mybatis 缓存讲解

1.2.1 缓存说明

1.2.2 mybatis缓存说明

1.2.3 一级缓存测试

1.3.2 编辑层级代码

1.3.3 使用二级缓存

1.4 注解使用二级缓存


1. Mybatis(二)

1.1 Mybatis 注解开发

1.1.1 编辑测试类

package com.jt;

import com.jt.mapper.DeptMapper;
import com.jt.mapper.EmpMapper;
import com.jt.mapper.UserAnnoMapper;
import com.jt.pojo.Dept;
import com.jt.pojo.Emp;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class TestMybatisAnno {

    @Autowired
    private UserAnnoMapper userMapper;

    @Test
    public void testFindAll(){

        List<User> list = userMapper.findAll();
        System.out.println(list);
    }

    @Test
    public void testFindUserById(){
        int id = 1;
        User user = userMapper.findUserById(id);
        System.out.println(user);
    }
}

1.1.2 编辑测试接口

//该Mapper主要测试注解开发
@Mapper
public interface UserAnnoMapper {
    //利用注解可以根据返回值类型,自动映射
    //规则1: 注解和映射文件 二选一  映射文件为主导.
    //规则2: 注解写法一般适用于简单操作.关联查询不适用
    @Select("select * from demo_user")
    List<User> findAll();

    @Select("select * from demo_user where id=#{id}")
    //@Insert()
    //@Update()
    //@Delete()
    User findUserById(int id);
}

 

1.2 Mybatis 缓存讲解

1.2.1 缓存说明

说明: 如果相同的数据需要多次查询,则可以使用缓存的方式处理,提高用户的响应速度.
在这里插入图片描述

1.2.2 mybatis缓存说明

1.2.2 mybatis缓存说明
mybatis中提供了2种缓存的机制.
一级缓存: SqlSession级别 在同一个sqlSession内实现数据的共享 默认开启
二级缓存: SqlSessionFactory级别 由同一个sqlSessionFactory,生产的SqlSession 数据共享. 默认开启 + 配置

易错项:

1.2.3 一级缓存测试

说明: SpringBoot在使用一二级缓存时,有特殊要求 需要额外注意.

/*测试mybatis的一级二级缓存
    * 现象: 如果采用springBoot的方式进行测试时发现,sql执行多次. 一级缓存无效.
    * 原因: springBoot整合mybatis之后,使用Mapper.find查询时.springBoot默认会开启
    *       多个sqlSession
    * 解决方案: 添加事务注解
    * 知识讲解: springBoot中如果添加了事务注解,则默认采用同一个SqlSession
    * */
    @Test
    @Transactional  //控制事务
    public void testCache1(){
        List<User> userList1 = userMapper.findCache1();
        List<User> userList2 = userMapper.findCache1();
        List<User> userList3 = userMapper.findCache1();
        List<User> userList4 = userMapper.findCache1();
    }

在这里插入图片描述

 

1.3 二级缓存测试
1.3.1 测试策略
说明: 为了构建多个mapper对象.需要准备多个线程进行测试. 可以通过浏览器让用户发起多次请求.之后测试二级缓存是否有效.
层级代码结构:
1. Controller 层 SpringMVC 面向接口编程 2:2:1
2. Service 层 Spring
3. Mapper/Dao层 Mybatis

 

1.3.2 编辑层级代码

1.3.2.1 编辑Mapper层

  1. 编辑mapper映射文件
    List<User> findCache1();
    
  2. 编辑xml映射文件
    <?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.jt.mapper.UserAnnoMapper">
    
        <select id="findCache1" resultType="User">
            select * from demo_user
        </select>
    </mapper>
    

    1.3.2.2 编辑Service层

    1.编辑service接口

    package com.jt.service;
    
    import com.jt.pojo.User;
    
    import java.util.List;
    
    public interface UserService {
    
        List<User> findCache1();
    }
    
    

         2.编辑ServiceImpl实现类

package com.jt.service;

import com.jt.mapper.UserAnnoMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserAnnoMapper userMapper;

    @Override
    public List<User> findCache1() {

        return userMapper.findCache1();
    }
}

1.3.2.3 编辑Controller层

package com.jt.controller;

import com.jt.pojo.User;
import com.jt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 要求返回List集合的JSON串
     */
    //@RequestMapping("/findCache")
    @GetMapping("/findCache")
    public List<User> findCache1(){

        return userService.findCache1();
    }
}

1.3.2.4 页面效果展现

在这里插入图片描述

1.3.3 使用二级缓存

<?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.jt.mapper.UserAnnoMapper">
    <!--
        1.让二级缓存在当前Mapper层有效
        2.POJO必须序列化
    -->
    <cache/>

    <select id="findCache1" resultType="User">
        select * from demo_user
    </select>
</mapper>

 

1.4 注解使用二级缓存

业务说明: Mybatis中采用注解方式的查询和xml映射文件的查询的方式不一样. 两者不可以混用.
使用注解的二级缓存:
在这里插入图片描述
总结说明: 注解缓存写法与映射文件写法冲突.所以一般二选一即可.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#空城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值