目录
1、自己创建一个新的项目,实现springboot和mybatis的整合(面试题)
2、动态sql相关的标签都有哪些?各自的作用是什么(面试题)
4、如何实现一对多映射(先缓缓,放到最后,明天还会再讲一遍)
一、springboot整合mybatis
1、接收请求
2、接收数据
3、事务
4、(创建SqlSessionFactory,SqlSession,UserMapper,)调用方法
5、配置文件 application.yml application.properties (mybatis-config.xml )
二、搭建环境
1、引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis 提供的和boot整合的jar包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2、配置文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis 提供的和boot整合的jar包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3、准备控制层、业务层、持久层
控制层
@RestController
@RequestMapping("/grade")
public class GradeController {
@Autowired
private GradeService gradeService;
//搜索 动态查询
@RequestMapping("search")
public List<Grade> searchGrade(Grade grade){
return gradeService.searchGrade(grade);
}
// 批量保存
@RequestMapping("saveBatch")
public int saveBatch(List<Grade> grades) {
return gradeService.saveBatch(grades);
}
}
业务层
public interface GradeService {
//搜索 动态查询
List<Grade> searchGrade(Grade grade);
// 批量保存
int saveBatch(List<Grade> grades);
}
持久层
@Mapper
public interface GradeMapper {
//搜索 动态查询
List<Grade> searchGrade(Grade grade);
// 批量保存
int saveBatch(List<Grade> grades);
}
4、SQLMapper文件
- <if>标签必须有test判断双引号里面是否为true,为true则使用if字符串拼接,多个语句拼接要写and或or
- 动态查询配合模糊查询此处用<where><if>标签实现动态查询、like concat('%',#{gradeName},'%')试实现模糊查询
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.GradeMapper">
<!-- //搜索 动态查询-->
<!-- List<Grade> searchGrade(Grade grade);-->
<select id="searchGrade" resultType="Grade">
select * from grade
<where>
<if test="gradeName != null and gradeName !='' ">
grade_name like concat('%',#{gradeName},'%')
</if>
<if test="address != null and address !='' ">
and address=#{address}
</if>
</where>
</select>
<!-- // 批量保存-->
<!-- int saveBatch(List<Grade> grades);-->
</mapper>
三、动态sql
- <where> 标签 添加where关键字,去除紧邻的 and 或者 or
- <if> 标签 动态判断 test=""
- <foreach>标签 循环 collection=“list” item="obj" index="index"——collection属性接收集 合、item指定集合中属性名、index指定索引下标的名字
- <trim>标签 代替where和set
prefix="where" prefixOverrides="and|or"
——prefix=“”是代替某个标签、prefixOverrides=“”是去除重复的 prefix="set" suffixOverrides=","
——suffixOverrides=“,”是去除最后的逗号 - <set>标签 动态更新 去除最后的 ,
- <choose> <when> <otherwise> case-when 选择一个条件执行
新增一般用@requestbody接收前端传来的json集合
//搜索 动态查询
@RequestMapping("search")
public List<Grade> searchGrade(Grade grade){
return gradeService.searchGrade(grade);
}
// 批量保存
@RequestMapping("saveBatch")
public int saveBatch(@RequestBody List<Grade> grades) {
return gradeService.saveBatch(grades);
}
@Mapper
public interface GradeMapper {
//搜索 动态查询
List<Grade> searchGrade(Grade grade);
// 批量保存
int saveBatch(@Param("list") List<Grade> grades);
}
<!-- //搜索 动态查询-->
<!-- List<Grade> searchGrade(Grade grade);-->
<select id="searchGrade" resultType="Grade">
select * from grade
<where>
<if test="gradeName != null and gradeName !='' ">
grade_name like concat('%',#{gradeName},'%')
</if>
<if test="address != null and address !='' ">
and address=#{address}
</if>
</where>
</select>
<!-- // 批量保存-->
<!-- int saveBatch(@Param("list")List<Grade> grades);-->
<insert id="saveBatch">
insert into grade(grade_name,address)
values
<foreach collection="list" item="obj" separator=",">
(#{obj.gradeName},#{obj.address})
</foreach>
</insert>
四、分页
4.1逻辑分页
一次性从表中查询所有数据,在客户端分页。
4.2物理分页
每次从数据库表中查询指定条数的数据,返回给前端。
select * from grade limit 10; //第一页
select * from grade limit 11,10; //第二页
4.2.1引入分页插件在pom.xml
pageHelper-spring-boot-starter.jar
4.2.2使用分页插件
分页功能可以设置默认值 @RequestParam(defaultValue = "1") 防止前端没有传递参数
//搜索 动态查询+分页
@RequestMapping("search")
public PageInfo searchGrade(Grade grade,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "5") Integer pageSize){
//开启分页插件 只能对紧邻的第一个sql语句进行分页
PageHelper.startPage(pageNum,pageSize);
//调用目标方法
List<Grade> list = gradeService.searchGrade(grade);
//封装分页对象
PageInfo pageInfo = new PageInfo(list);
return pageInfo;
}
http://localhost:8080/grade/search?pageNum=2&pageSize=3
select——查询满足条件的数据条数
Limit——查询前几条数据
五、事务
编程式事务
connnect.setAutoCommit(false);
connnect.startTransaction();
dml;
connection.commit();|| rollback();
声明式事务
@Transactional
在对应的类上或者方法上声明,即可使用事务。
六、多表关联映射
结果集映射:
1、resultType :自动结果集映射 列名和属性名自动映射(相同或者满足驼峰式命名法)。
一般应用于单表操作。
2、resultMap: 手动结果集映射 手动的一个个指定列名和属性名的映射关系。
一般用于多表关联映射。
<!--结果集手动映射-->
<!--手动指令列名和属性名的映射关系 type="java中的数据类型,目标数据类型"-->
<resultMap id="baseMap" type="Grade">
<!--主键字段映射-->
<id property="id" column="id"></id>
<!--非主键字段-->
<result property="gradeName" column="grade_name"></result>
<result property="address" column="address"></result>
</resultMap>
<select id="searchGrade" resultMap="baseMap">
select * from grade
<trim prefix="where" prefixOverrides="and |or">
<if test="gradeName != null and gradeName !='' ">
grade_name like concat('%',#{gradeName},'%')
</if>
<if test="address != null and address !='' ">
and address=#{address}
</if>
</trim>
</select>
一对多映射 collection(一个班级有多少学生)
伪代码:
select grade.*,student.*
from grade join student
on grade.id = student.class_id
Grade{
//一对多
List<Student> list;
}
Student{
//一对一
Grade grade;
}
代码:
pojo包Student类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Integer studentId;
private String name;
private Integer classId;
}
pojo包Grade类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Grade {
private int id;
private String gradeName;
private String address;
//一对多关联
private List<Student> list;
}
####
Sercvice接口
//一对多映射
public List<Grade> query();
sql映射文件
映射的property是javabean定义的映射SQL的属性,column是SQL对应的列表名
<!--
//一对多映射
public List<Grade> query();
-->
<select id="query" resultMap="map2">
select grade.id,grade.grade_name,grade.address,
student.student_id,student.name,student.class_id
from grade join student
on grade.id = student.class_id
</select>
<resultMap id="map2" type="Grade">
<!--手动指定列名和属性名的映射关系-->
<!--主键-->
<id property="id" column="id"></id>
<!--非主键 普通属性-->
<result property="gradeName" column="grade_name"></result>
<result property="address" column="address"></result>
<!--集合属性 一对多映射 -->
<collection property="list" ofType="Student" autoMapping="true">
<id column="student_id" property="studentId"></id>
</collection>
</resultMap>
一对一 association
作业
1、自己创建一个新的项目,实现springboot和mybatis的整合(面试题)
2、动态sql相关的标签都有哪些?各自的作用是什么(面试题)
场景 | 核心标签 | 关键点 |
---|---|---|
批量新增 | <foreach> + <trim> |
遍历集合、处理逗号 |
动态查询 | <where> + <if> + <choose> |
条件分支、避免 WHERE AND 语法错误 |
动态修改 | <set> + <if> |
仅更新非空字段、去除末尾逗号 |
- <where> 标签 添加where关键字,去除紧邻的 and 或者 or
- <if> 标签 动态判断 test=""
- <foreach>标签 循环 collection=“list” item="obj" index="index"——collection属性接收集 合、item指定集合中属性名、index指定索引下标的名字
- <trim>标签 代替where和set
prefix="where" prefixOverrides="and|or"
——prefix=“”是代替某个标签、prefixOverrides=“”是去除重复的 prefix="set" suffixOverrides=","
——suffixOverrides=“,”是去除最后的逗号 - <set>标签 动态更新 去除最后的 ,
- <choose> <when> <otherwise> case-when 选择一个条件执行
3、分页插件如何实现?(面试题)
见四、分页