目录
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 编辑层级代码
- 编辑mapper映射文件
List<User> findCache1();
- 编辑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映射文件的查询的方式不一样. 两者不可以混用.
使用注解的二级缓存:
总结说明: 注解缓存写法与映射文件写法冲突.所以一般二选一即可.