当前位置: 首页 > news >正文

mybatis03

一、springboot整合mybatis

1.1搭建环境

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.配置文件

server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/yan9driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456
mybatis:configuration:map-underscore-to-camel-case: true  #开启下划线到驼峰式命名法自动映射type-aliases-package: com.hl.mybatis03.pojo #类型起别名mapper-locations: classpath:mappers/*.xmllogging:level:com.hl.mybatis03.mapper: debug

3.准备控制层,业务层,持久层

@RestController
@RequestMapping("/grade")
public class GradeController {@Autowiredprivate 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文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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>

1.2动态sql

<where> 添加where关键字,去除紧邻的 and 或者 or

<if> 动态判断 test=""

<foreach> 循环 collection=“list” item="obj" index="index"

<trim> 代替where和set prefix="where" prefixOverrides="and|or" prefix="set" suffixOverrides=","

<set> 动态更新 去除最后的 ,

<choose> <when> <otherwise> case-when 选择一个条件执行

//搜索 动态查询
@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>

1.3分页

物理分页

每次从数据库表中查询指定条数的数据,返回给前端。

select * from grade limit 10; //第一页

select * from grade limit 11,10; //第二页

逻辑分页

一次性从表中查询所有数据,在客户端分页。

1.引入分页插件

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.3</version>
</dependency>

2.使用分页插件

//搜索 动态查询+分页
@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;
}

1.4事务

编程式事务

connnect.setAutoCommit(false);
connnect.startTransaction();
dml;
connection.commit();|| rollback();

声明式事务

@Transactional 
在对应的类上或者方法上声明,即可使用事务。

1.5多表关联映射

结果集映射

resultType :自动结果集映射 列名和属性名自动映射(相同或者满足驼峰式命名法)。

一般应用于单表操作。

resultMap: 手动结果集映射 手动的一个个指定列名和属性名的映射关系。

一般用于多表关联映射。

一对多映射collection

<!--结果集手动映射-->
<!--手动指令列名和属性名的映射关系  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>

一对一association

作业

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

"搭建SpringBoot+MyBatis项目主要分四步:首先引入mybatis-spring-boot-starter和数据库驱动依赖;接着在application.yml配置数据源和mapper.xml路径;然后创建实体类和带@Mapper注解的接口;最后在XML文件写SQL,Service层调用Mapper即可。"

关键点:

  1. 依赖:mybatis starter + 数据库驱动

  2. 配置:数据源 + mapper路径

  3. 结构:实体类 -> Mapper接口 -> XML映射文件

  4. 使用:Service注入Mapper执行SQL

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

<where> 添加where关键字,去除紧邻的 and 或者 or

<if> 动态判断 test=""

<foreach> 循环 collection=“list” item="obj" index="index"

<trim> 代替where和set prefix="where" prefixOverrides="and|or" prefix="set" suffixOverrides=","

<set> 动态更新 去除最后的 ,

<choose> <when> <otherwise> case-when 选择一个条件执行

批量新增--<foreach>

动态查询--<where>和<if>

动态修改--<set>

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

MyBatis分页可以通过PageHelper插件实现。首先引入PageHelper的starter依赖,然后在查询方法前调用PageHelper.startPage(pageNum, pageSize)设置分页参数。

需要注意PageHelper.startPage()必须紧跟在查询方法前调用,且只对紧接着的第一个查询有效。

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


文章转载自:

http://IUbIYmwj.nqmkr.cn
http://JEIetoNC.nqmkr.cn
http://LsU3Kaij.nqmkr.cn
http://9OJWhqAe.nqmkr.cn
http://5DaRWm0t.nqmkr.cn
http://tzjdzutf.nqmkr.cn
http://7IFepk8W.nqmkr.cn
http://52EnnYfL.nqmkr.cn
http://cQ6BH95I.nqmkr.cn
http://h3zFrc1j.nqmkr.cn
http://pGfoJRv5.nqmkr.cn
http://V786QpD9.nqmkr.cn
http://qwuxO5bP.nqmkr.cn
http://mlYDekC9.nqmkr.cn
http://xYugVeUZ.nqmkr.cn
http://FzlNwE3F.nqmkr.cn
http://wX8RrtMH.nqmkr.cn
http://MSrD738s.nqmkr.cn
http://WPkJTCQV.nqmkr.cn
http://S9fX6Sl3.nqmkr.cn
http://PqZgGSbK.nqmkr.cn
http://VuRuGV4E.nqmkr.cn
http://GSi0rw69.nqmkr.cn
http://DWqLUni3.nqmkr.cn
http://6aXomVrj.nqmkr.cn
http://uh94gNpd.nqmkr.cn
http://dgnbvSls.nqmkr.cn
http://HYpAY7St.nqmkr.cn
http://zDRdrwub.nqmkr.cn
http://vpQe2buf.nqmkr.cn
http://www.dtcms.com/a/227881.html

相关文章:

  • FastAPI安全认证:从密码到令牌的魔法之旅
  • 使用NMEA Tools生成GPS轨迹图
  • 第100期 DL,多输入多输出通道
  • [网页五子棋][匹配对战]落子实现思路、发送落子请求、处理落子响应
  • 论文略读:Auto-Regressive Moving Diffusion Models for Time Series Forecasting
  • 【nm】nm命令的使用:查看.so中的符号信息
  • RocketMQ介绍与部署
  • NodeJS全栈WEB3面试题——P6安全与最佳实践
  • SDU棋界精灵——实现硬件程序ESP32的FreeRTOS任务
  • 【LeetCode 热题100】动态规划实战:打家劫舍、完全平方数与零钱兑换(LeetCode 198 / 279 / 322)(Go语言版)
  • 【QT控件】QWidget 常用核心属性介绍 -- 万字详解
  • Laplace 噪声
  • 案例:TASK OA
  • YOLOv5 :训练自己的数据集
  • wow Warlock shushia [Dreadsteed]
  • 简单了解string类的特性及使用(C++)
  • MDP的curriculums部分
  • volatile,synchronized,原子操作实现原理,缓存一致性协议
  • 基于Python学习《Head First设计模式》第四章 工厂方法+抽象工厂
  • “等待-通知”机制优化(一次性申请)循环等待
  • HarmonyOS5 仓颉入门:和 ArkTs 互操作
  • 初识vue3(vue简介,环境配置,setup语法糖)
  • RGB888色彩格式转RGB565格式
  • VMware安装Ubuntu全攻略
  • 记忆解码 | 从神经机制到记忆逻辑的科学探索
  • Google机器学习实践指南(TensorFlow六大优化器)
  • Python----目标检测(Ultralytics安装和YOLO-V8快速上手)
  • 基于STM32控制直流电机加减速正反转设计
  • 自适应流量调度用于遥操作:面向时间敏感网络的通信与控制协同优化框架
  • OpenRouter使用指南