DAY08_SpringBoot—整合Mybatis-Plus

目录

  • 1 MybatisPlus
    • 1.1 MP介绍
    • 1.2 MP的特点
    • 1.3 MybatisPlus入门案例
      • 1.3.1 导入jar包
      • 1.3.2 编辑POJO对象
      • 1.3.3 编辑Mapper接口
      • 1.3.4 编译YML配置文件
      • 1.3.5 编辑测试案例
    • 1.4 MP核心原理
      • 1.4.1 需求
      • 1.4.2 原理说明
      • 1.4.3 对象转化Sql原理
    • 1.5 MP常规操作
      • 1.5.1 添加日志打印
      • 1.5.2 测试入库操作
      • 1.5.2 测试更新操作
    • 1.6 MP常规操作
      • 1.6.1 根据对象查询
      • 1.6.2 条件构造器查询
      • 1.6.3 关键字like查询
      • 1.6.4 关键字OrderBy
      • 1.6.5 In关键字
      • 1.6.6 带判断条件的查询
      • 1.6.7 查询第一列数据
      • 1.6.8 查询指定字段的数据
      • 1.6.9 更新数据
  • 2 解决自动注入警告问题

1 MybatisPlus

1.1 MP介绍

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.2 MP的特点

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.3 MybatisPlus入门案例

1.3.1 导入jar包

<!--spring整合mybatis-plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>

1.3.2 编辑POJO对象

MP要求以面向对象的方式操作数据库.其中对象与表 属性与字段必须映射。所以利用注解进行绑定

在这里插入图片描述

1.3.3 编辑Mapper接口

在这里插入图片描述

1.3.4 编译YML配置文件

MP增强了Mybatis, MP内部包含了Mybatis 所以将Mybatis的包删除,否则内部jar包异常

  • 完成pom文件如下
  • SpringBoot版本过高会不支持Mybatis-Plus
    • 再次我更改了SpringBoot版本为3.1.8(此时Mybatis-Plus必须使用3.5.5及以上)
    • 或者降低SpringBoot版本号(2.x版本)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.jt</groupId><artifactId>springboot_demo_2</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_demo_2</name><description>springboot_demo_2</description><properties><java.version>17</java.version></properties><dependencies><!--spring-boot-starter 启动项当程序解析到该jar包时,就会按照jar包内的配置实例化对象包括数据源的配置. 加载数据源......--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--引入数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--只对当前项目有效--><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!--true该jar包文件父子项目之间不传递.--><!--<optional>true</optional>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--spring整合mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--在项目打包时将lombok包除外.--><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>

YML配置文件中将mybatis名称为mybatis-plus即可

在这里插入图片描述

1.3.5 编辑测试案例

利用userMapper 实现以对象的方式操作数据库

//测试mybatis-plus
@Test
public void testSelect(){List<DemoUser> userList = userMapper.selectList(null);System.out.println(userList);
}

1.4 MP核心原理

1.4.1 需求

之前操作数据库采用sql(面向过程的语言)方法进行编辑. 但是如果所有的单表操作都由程序员完成.则开发效率低. 能否开发一种机制可以实现以面向对象的方式操作数据库.

1.4.2 原理说明

  • 对象与数据表进行关联 @TableName
  • MP采用BaseMapper的方式 将公共的接口方法进行了抽取. 采用泛型T的方式进行约束
  • MP将用户操作的对象在底层自动的转化为Sql语句!!!

1.4.3 对象转化Sql原理

  • 对象方法: userMapper.insert(User对象);
  • Sql语句: insert into demo_user(id,name…) value(100,xxx…)
  • 步骤:
    • 根据userMapper找到对应的class类型
    • 根据userMapper的类型通过反射机制获取父级接口类型BaseMapper
    • 找到BaseMapper类型之后,获取泛型类型 User.class
    • 获取User.class之后,获取class的注解名@TableName注解.获取注解名称. 至此表名获取成功
    • 根据User.class获取其中的属性名称.之后获取属性上的@TableField 获取字段名称.
    • 之后利用对象的get方法获取属性的值最终实现了Sql语句的拼接过程.
    • MP将整理好的Sql交给Mybatis(jdbc)去处理. 最终实现了以对象的方式操作数据库.

1.5 MP常规操作

1.5.1 添加日志打印

server:port: 8090#SpringBoot 开箱即用
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/jtadmin?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: root#检查密码是否正确password: root#SpringBoot整合MybatisPlus配置
mybatis-plus:#定义别名包type-aliases-package: com.jt.pojomapper-locations: classpath:/mappers/*.xml#开启驼峰映射configuration:map-underscore-to-camel-case: true#添加MP日志  打印执行的sql
logging:level:com.jt.mapper: debug

1.5.2 测试入库操作

import com.jt.mapper.DemoUserMapper;
import com.jt.pojo.DemoUser;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class TestMP {@Autowiredprivate DemoUserMapper userMapper;@Testpublic void insert(){DemoUser user = new DemoUser();user.setName("MP测试").setSex("男").setAge(19);userMapper.insert(user);}
}
  • 测试结果

在这里插入图片描述

1.5.2 测试更新操作

//测试更新操作 修改id=231的数据 name="中午吃什么" age=18
//原则: 根据对象中不为null的属性当做set条件. set name="xxx"
//      如果ById的操作,则Id必须赋值 并且ID当做唯一where条件
@Test
public void updateById(){DemoUser user = new DemoUser();user.setName("中午吃什么").setAge(18).setId(231);userMapper.updateById(user);
}

1.6 MP常规操作

1.6.1 根据对象查询

/*** 1.查询id=21的用户  根据ID查询数据   1条记录* 2.查询name="白骨精" sex=女 的用户   List* 知识点:*      1.queryWrapper  条件构造器  拼接where条件的.*      原则: 根据对象中不为null的属性拼接where条件
*/
@Test
public void testSelect(){//1.根据ID查询DemoUser user = userMapper.selectById(21);System.out.println(user);//2.根据属性查询DemoUser user2 = new DemoUser();user2.setName("白骨精").setSex("女");QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>(user2);List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.2 条件构造器查询

说明: 如果查询条件中有特殊关系符,则使用特殊转义字符查询 代码如下.

/*** 需求: 查询age>18岁  并且性别为女的用户* Sql: select * from demo_user where age > 18 and sex="女"* 特殊字符:  > gt   < lt   = eq*           >= ge  <= le* 默认链接符: and*
* */
@Test
public void testSelect2(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 18) .eq("sex", "女");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.3 关键字like查询

/*** 练习like关键字*      查询name中包含"精"字的数据* Sql: like "%精%"*      以精开头    like "精%"   likeRight*      以精结尾    like "%精"   likeleft
*/
@Test
public void testSelect3(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "精");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.4 关键字OrderBy

 /*** 查询sex=男的数据,以id倒序排列* Sql: select * from demo_user where sex='男' order by id desc
*/
@Test
public void testSelect4(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("sex", "男").orderByDesc("id");List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.5 In关键字

/*** 5.查询id= 1,3,5,6,7的用户* Sql: select * from demo_user where id in (xxx,xx,xx)
*/
@Test
public void testSelect5(){//数组使用包装类型Integer[] ids = {1,3,5,6,7};//需要将数组转化为集合List idList = Arrays.asList(ids);QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();//queryWrapper.in("id", idList);    //根据list查询 list集合功能丰富queryWrapper.in("id", ids); //数组必须包装类型List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.6 带判断条件的查询

 /*** 需求: 如果根据name属性和age属性查询数据. 有时某个数据可能为null,*      要求动态查询 where name=xxx age>xxxx* 伪Sql: select * from demo_user where name!=null name=xxx and age!=null age>xxx* condition: 内部编辑一个判断的条件*            如果返回值结果为true 则拼接该字段.*            如果为false 则不拼接该字段* StringUtils.hasLength(name) 判断字符串是否有效
*/
@Test
public void testSelect6(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper<>();String name = "";int age = 18;queryWrapper.eq(StringUtils.hasLength(name),"name",name).gt(age>0, "age",age);List<DemoUser> userList = userMapper.selectList(queryWrapper);System.out.println(userList);
}

1.6.7 查询第一列数据

/*** 需求: 只想查询第一列数据   selectObjs* 说明: queryWrapper=null 不需要where条件* selectObjs:*      1.一般根据条件查询Id的值,查询之后为后续的sql提供数据支持*      2. 有时用户只需要查询ID的值,并不需要其他数据项时 使用objs.
*/
@Test
public void testSelect7(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("sex","男");List objs = userMapper.selectObjs(queryWrapper);System.out.println(objs);
}

1.6.8 查询指定字段的数据

/*** 需求: 想查询name/sex字段*  queryWrapper.select("name","sex"); 挑选执行字段
*/
@Test
public void testSelect8(){QueryWrapper<DemoUser> queryWrapper = new QueryWrapper();queryWrapper.select("name","sex");List objs = userMapper.selectList(queryWrapper);System.out.println(objs);
}

1.6.9 更新数据

 /*** 更新数据*      将name="中午吃什么" 改为name="晚上吃什么"*      性别: 改为 其他* Sql:*      update demo_user set name="xxx",sex="其他" where name="xxxx"* 参数说明:*      1.entity 实体对象  需要修改的数据进行封装*      2.updateWrapper 条件构造器
*/
@Test
public void testSelect10(){DemoUser user = new DemoUser();user.setName("晚上吃什么").setSex("其他");UpdateWrapper updateWrapper = new UpdateWrapper();updateWrapper.eq("name", "中午吃什么");userMapper.update(user,updateWrapper);
}

2 解决自动注入警告问题

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建Android开发环境—— 熟悉Android开发工具,掌握Android移动端开发环境的搭建、项目导入,并能够将项目部署到模拟器和真机进行测试。

搭建Android开发环境 一、实验目的 熟悉Android开发工具&#xff0c;掌握Android移动端开发环境的搭建、项目导入&#xff0c;并能够将项目部署到模拟器和真机进行测试。 二、实验设备及器件 1、JDK1.8安装包 2、Android Studio安装包 三、实验内容 完成JDK和Android Stud…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

MySQL视图特性

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1.基本使用 创建视图 create view 视图名 as select 语句&#xff1b; 案例&…

微信双开bat脚本中出现中文目录导致报错运行不了

在微信双开bat脚本的教程中看到一个评论&#xff1a; 可以是可以&#xff0c;写完脚本另存为的时候改变编码就行了&#xff0c;选ANSI

Socket实现服务器和客户端

Socket 编程是一种用于在网络上进行通信的编程方法&#xff0c;以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤&#xff1a;服务器端步骤&#xff1a; 1.创建 Socket&#xff1a; int serverSocket socket(AF_INET, SOCK_STREAM, 0);…

java抽象工厂实战与总结

文章目录 一、工厂模式&#xff08;三种&#xff09;1.简单工厂模式1.1 概念&#xff1a;1.2 使用场景&#xff1a;1.3 模型图解&#xff1a;1.4 伪代码&#xff1a; 2.工厂方法模式2.1 概念&#xff1a;2.2 使用场景&#xff1a;2.3 模型图解&#xff1a;2.4 伪代码 3.抽象工厂…

3.chrony服务器

目录 1. 简介 1.1. 重要性 1.2. Linux的两个时钟 1.3. 设置日期时间 1.3.1. timedatectl命令设置 1.3.2. date命令设置 1.4. NTP 1.5. Chrony介绍 2. 安装与配置 2.1. 安装&#xff1a; 2.2. Chrony配置文件分析 2.3. 同步时间服务器 2.3.1. 授时中心 2.3.2. 实验…

进程通信与socket编程实践之猜数字小游戏

socket是实现进程通信的一种重要方式&#xff0c;本文将通过socket编程实现服务器进程与客户端进程之间的通信&#xff0c;并在通信之外实现猜数字的小游戏。 1. 设计思路 本文设计的C/S结构的猜数字游戏功能如下&#xff1a;服务器端自动生成一个1-100之间的随机数字&#x…

5.ROC-AUC机器学习模型性能的常用的评估指标

最近回顾机器学习基础知识部分的时候&#xff0c;看到了用于评估机器学习模型性能的ROC曲线。再次记录一下&#xff0c;想起之前学习的时候的茫然&#xff0c;希望这次可以更加清晰的了解这一指标。上课的时候听老师提起过&#xff0c;当时没有认真去看&#xff0c;所以这次可以…

Java毕业设计-基于jsp+servlet的学生推荐平台管理系统-第81期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的学生推荐平台管理系统&#xff1a;前端 jsp、jquery&#xff0c;后端 servlet、jdbc&#xff0c;集成用户端和管理后台&#xff0c;用户端浏览书籍课程&…

All-Flash Array Key-Value Cache for Large Objects——论文泛读

EuroSys 2023 Paper 论文阅读笔记整理 问题 随着网络内容质量的提高&#xff0c;对缓存大型对象的需求不断增加。在生产内容交付网络&#xff08;CDN&#xff09;、图像和文档服务器中&#xff0c;大多数对象的大别为8KB–32KB&#xff08;CDN服务器&#xff09;、32KB–128K…

AI时代:驱动光模块市场增长

人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;犹如一股强大的催化力量&#xff0c;正在驱动各行各业经历前所未有的变革性转型。光学收发器市场作为这一范式转变的重要领域之一&#xff0c;正见证着由ChatGPT等先进模型引领的AI革命所带来的深刻影响。本文将深度剖…