该注解的作用是在执行@Test方法之前调用 是测试方法提供的的测试API
1.1.2测试案例public class TestMybatis2 {
//定义公共的属性
private SqlSessionFactory sqlSessionFactory;
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testMybatis01(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
List list = demoUserMapper.findAll();
System.out.println(list);
sqlSession.close();
}
}
1.2.1编辑测试类
@Test
public void testFindByName(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
String name = "王昭君";
//如果不能保证结果唯一,则使用List集合接收数据.
List list = demoUserMapper.findByName(name);
System.out.println(list);
sqlSession.close();
}
1.2.2编辑xml映射文件
select * from demo_user where name = #{name}
2.Mybatis参数封装
2.1案例分析
2.1.1编辑测试方法
@Test
public void testFindBySA(){
//保证每个线程都能获取一个链接
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
//编程习惯: 面向对象
DemoUser user = new DemoUser();
user.setAge(18).setSex("女");
List list = demoUserMapper.findBySA(user);
System.out.println(list);
sqlSession.close();
}
2.1.2 编辑业务接口
2.1.3编辑映射文件
2.2关于Mybatis参数问题的说明
2.2.1报错说明
规则:mybatis如果遇到多值传参时,默认条件时采用下标的方式获取数据
mybatis天生只支持单值传参,如果遇到多值传参时,应该将多值封装为单值
2.2.3参数知识点总结
- 封装为实体对象 user对象
- 更为常用的方式 Map集合
- 如果传递的数据有多个,则可以使用注解@Param(“sex”) String sex 封装为Map.
1.如果参数采用对象封装,则可以使用#{属性}取值
2.如果参数有多个,可以封装为map实现参数的传递. 可以利用#{key}获取数据
3.也可以使用@Param将多个参数封装为map, 利用#{key}的方式获取数据
1.使用#{} 获取数据时,默认有预编译的效果.防止sql注入攻击.
2.mybatis使用#{}获取数据时,默认为数据添加一对""号.
3.当以字段名称为参数时,一般使用${},但是这样的sql慎用. 可能出现sql注入攻击问题.
在mybatis xml映射文件中需要写入POJO实体对象的路径 如果每次编辑都需要写全路径则开发相对繁琐 所以引入mybatis别名包规则
3.1.2实现别并配置在mybatis的核心配置文件中 定义别名
需求:如果项目中有多个POJO实体类,如果一个一个编辑别名标签,则更为繁琐,所以Mybatis提供了别名包的功能
例子:
com.jt.pojo.User.
com.jt.pojo.Dept.
原理说明:可以设置
mybatis的xml映射文件中会有大量的Sql语句. 随着业务的增加,Sql语句的数量也会增加. 其中有部分 "Sql片段"则可能重复. 如果想简化Sql语句,则可以使用Sql标签简化操作.
例子:
- select id,name,age,sex from demo_user where id = 1
- select id,name,age,sex from demo_user where name = xxx
优势:
- 使用Sql标签可以节省xml的文件大小.
- 代码的结构相对简单
弊端:
- Sql只能抽取公共的Sql语句,局限性稍大.
- 如果大量的使用Sql标签,则代码的可读性差
一般使用if标签的时候,会使用where标签来进行包裹
where标签的作用是用来去除if判断语句多余的and来确保sql完整语句
3.2.2分支结构
choose when otherwise 结构的使用
需求:如果存在name就按照name查询,否则按照sex查询
语法说明:
- choose:代表分支结构,只有一个条件生效
- when:指定判断的条件 和if类似
- otherwise:如果上述的条件都不满足时,该行代码有效
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Dept implements Serializable {
//驼峰命名法
private Integer deptId;
private String deptName;
}
4.2resultType与resultMap用法
resultType说明:
- 当结果集中的字段名称,如果与属性的名称一致时,才会实现自动的数据封装
resultMap说明:
- 当结果集中的字段名称,如果与属性名称不一致时,自定义的封装数据结构
resultMap说明:
- id:id标签代表主键(每张表都会有一个主键)
1.1column:代表结果集中的字段
1.2. property:代表对象中的属性 - result:除了主键之外的配置信息
- 一对一 例子:人和身份证号 员工和部门
- 一对多 例子:一个部门对应多个员工
- 多对多 例子:老师和学生
一个老师对应多个学生
一个学生对应多个老师
核心:考虑问题从一头出发
5.2一对一 5.2.1创建表表名:emp员工表
字段:id,name,age,dept_id
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Emp implements Serializable {
private Integer id;
private String name;
private Integer age;
private Dept dept;
//private Integer deptId;
}
5.2.3创建实现类接口EmpMapper
5.2.4创建EmpMapper.xml映射文件
5.2.5mybatis加载xml映射文件 5.2.6一对一业务封装select e.id, e.name,e.age,d.dept_id,d.dept_name from emp e ,dept d where e.dept_id = d.dept_id
规则:
- 如果对一 则使用对象封装
- 如果对多 则使用List集合封装
- 关联查询:通过大量的sql语句 实现数据的关联查询 其中sql语句相对复杂 但是数据封装简单
- 子查询: 可以通过子查询的方式实现复杂的数据封装 其中sql语句都是单标查询sql简单,但是数据封装复杂
6.1设置自动驼峰映射规则select d.dept_id,d.dept_name,e.id,e.name,e.age from dept d left join emp e on d.dept_id = e.dept_id
在核心配置文件中,添加自动驼峰命名配置
7.Mybatis缓存机制 7.1什么是缓存机制
说明:引入缓存可以有效降低用户访问屋里设备的频次,提高用户影响速度
扩展:
- mybatis自身缓存 一级缓存/二级缓存
- Redis缓存 读取10万次/秒,写8.6万次/秒
概念说明:Mybatis默认开启一级缓存,一级缓存可以在同一个SqlSession对象中查询相同的数据,可以实现数据的共享(缓存操作)
测试:
@Test
public void cache1(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
List list1 = demoUserMapper.findAll();
List list2 =demoUserMapper.findAll();
List list3 =demoUserMapper.findAll();
System.out.println(list1 == list2);
sqlSession.close();
}
7.1.2二级缓存
说明:二级缓存Mybatis中默认也是开启的,但是需要手动标识,二级缓存可以在同一个SqlSessionFactory内部有效
全局配置:
二级缓存使用:
说明:SqlSession查询数据之后,会将缓存信息保存到一级缓存中,但是不会立即将缓存交给二级缓存保管,如果需要使用二级缓存,则必须将sqlSession业务逻辑执行完成之后,并且关闭了
@Test
public void cache2(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
demoUserMapper.findAll();
//关闭一级缓存
sqlSession.close();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper2 = sqlSession2.getMapper(DemoUserMapper.class);
demoUserMapper2.findAll();
sqlSession2.close();
}



