MyBatis03——SpringBoot整合MyBatis

目录

一、springboot整合mybatis

二、搭建环境

1、引入jar包

2、配置文件

3、准备控制层、业务层、持久层

4、SQLMapper文件

​编辑

三、动态sql

四、分页

4.1逻辑分页

4.2物理分页

4.2.1引入分页插件在pom.xml

4.2.2使用分页插件

五、事务

编程式事务

声明式事务

六、多表关联映射

结果集映射:

[一对多映射 collection(一个班级有多少学生)](#一对多映射 collection(一个班级有多少学生))

[一对一 association](#一对一 association)

作业

1、自己创建一个新的项目,实现springboot和mybatis的整合(面试题)

2、动态sql相关的标签都有哪些?各自的作用是什么(面试题)

3、分页插件如何实现?(面试题)

4、如何实现一对多映射(先缓缓,放到最后,明天还会再讲一遍)


一、springboot整合mybatis

1、接收请求

2、接收数据

3、事务

4、(创建SqlSessionFactory,SqlSession,UserMapper,)调用方法

5、配置文件 application.yml application.properties (mybatis-config.xml )

二、搭建环境

1、引入jar包

XML 复制代码
<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、配置文件

XML 复制代码
<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、准备控制层、业务层、持久层

控制层

java 复制代码
@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);
    }
}

业务层

java 复制代码
public interface GradeService {
    //搜索 动态查询
    List<Grade> searchGrade(Grade grade);
    // 批量保存
    int saveBatch(List<Grade> grades);
}

持久层

XML 复制代码
@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 复制代码
<?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集合

java 复制代码
//搜索 动态查询
@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);
}
java 复制代码
@Mapper
public interface GradeMapper {
    //搜索 动态查询
    List<Grade> searchGrade(Grade grade);
    // 批量保存
    int saveBatch(@Param("list") List<Grade> grades);
}
XML 复制代码
<!--    //搜索 动态查询-->
<!--    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") 防止前端没有传递参数

java 复制代码
//搜索 动态查询+分页
@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: 手动结果集映射 手动的一个个指定列名和属性名的映射关系。

一般用于多表关联映射。

XML 复制代码
<!--结果集手动映射-->
<!--手动指令列名和属性名的映射关系  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(一个班级有多少学生)

伪代码:

java 复制代码
select grade.*,student.*
from grade join student
on grade.id = student.class_id
​
Grade{
    //一对多
    List<Student> list;
}
​
Student{
    //一对一
    Grade grade;
}

代码:

pojo包Student类

java 复制代码
​​​​​​​@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
   private Integer studentId;
   private String name;
   private Integer classId;
}

pojo包Grade类

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Grade {
    private int id;
    private String gradeName;
    private String address;
    //一对多关联
    private List<Student> list;
}

Sercvice接口

java 复制代码
//一对多映射
public List<Grade> query();

sql映射文件

映射的property是javabean定义的映射SQL的属性,column是SQL对应的列表名

XML 复制代码
<!--
//一对多映射
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、分页插件如何实现?(面试题)

见四、分页

4、如何实现一对多映射(先缓缓,放到最后,明天还会再讲一遍)

相关推荐
Hockor10 分钟前
写给前端的 Python 教程一
前端·后端·python
用户131517382561523 分钟前
线上发现 Redis 机器爆了,如何优化?
后端
David爱编程23 分钟前
深入理解容器运行背后的“魔法秘籍”
后端·docker·容器
用户52203995206525 分钟前
Java多线程并发与加密算法和安全漏洞
java·后端
某鹏26 分钟前
使用jfr让java观测更简单
后端
谷宇26 分钟前
【Java实例-神秘年龄】用Java挑战你的直觉
java·后端
魔镜魔镜_谁是世界上最漂亮的小仙女28 分钟前
JAVA基础【异常处理】
java·后端
真是他30 分钟前
WPF 依赖属性
后端
Cache技术分享30 分钟前
95. Java 数字和字符串 - 操作字符串的其他方法
前端·后端
某鹏31 分钟前
load对进程判断失效
后端