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.mzph.cn/news/642288.shtml

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

相关文章

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

全国大学生智能汽车竞赛—解决Ubuntu 18.04.6 无法连接网络的问题

1.1 用到的命令 lshw &#xff08;1&#xff09;功能描述: lshw是一个提取机器硬件配置详细信息的工具&#xff0c;并且能将结果输出成HTML、json、XML等格式。 &#xff08;2&#xff09;输出形式&#xff1a; -class 仅显示一类硬件信息&#xff0c;可以使用lshw -short或ls…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

ps去除图片上的文字

1. 打开ps, 打开文件 2. 选择套索工具 3. 使用套索工具将需要去除的文字框选 4. 然后鼠标右击&#xff0c;选择内容识别填充 5. 应用确定后, 此时文字就去掉了

保姆级CISP报考攻略,让你不再迷茫

信息安全领域越来越火&#xff0c;想要在这个行业闯出一片天&#xff1f;CISP认证就是你的“敲门砖”&#xff01;想知道如何顺利考取这个超牛的证书吗&#xff1f;下面就带你一起探索保姆级CISP报考流程&#xff01;&#x1f389; &#x1f393;报考条件&#x1f393; 学历专业…

推荐在线PS修图网页版工具PHP网站源码

在线PS修图网页版工具PHP网站源码&#xff0c;PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的&#xff0c;众所周知在使用和学习PS时是需要下载软件的&#xff0c;Photoshop软件对电脑配置也是有一定要求的&#xff0c;今天就为大家带来一…

牛客网-----跳石头

题目描述&#xff1a; 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行&#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间&#xff0c;有N块岩石(不含起点和终点的岩石)。在比赛过程中&#xff0…

JAVA算法—排序

目录 *冒泡排序&#xff1a; *选择排序&#xff1a; 插入排序&#xff1a; 快速排序&#xff1a; 总结&#xff1a; 以下全部以升序为例 *冒泡排序&#xff1a; 引用&#xff1a; 在完成升序排序时&#xff0c;最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾&#…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值&#xff0c;会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数…

深度学习(3)--递归神经网络(RNN)和词向量模型Word2Vec

目录 一.递归神经网络基础概念 二.自然语言处理-词向量模型Word2Vec 2.1.词向量模型 2.2.常用模型对比 2.3.负采样方案 2.4.词向量训练过程 一.递归神经网络基础概念 递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题&#xff0c;处理诸如树、图这样…

蓝桥杯(C++ 最大开支 优先队列)

优先队列&#xff1a; 蓝桥杯&#xff08;C 整数删除 优先队列 &#xff09;-CSDN博客 思路&#xff1a; 1、每个人依此选择项目&#xff0c;每个人选项目时都&#xff08;选择当下花费增加最多的项目&#xff09;&#xff0c;若项目i的门票价格为kxb&#xff0c;那么增加一个…

HTML+JavaScript-02

数组 JavaScript中的数组用于在单一变量存储多个值&#xff0c;其实跟java中的数组是一样的&#xff0c;都是通过索引来访问这些值的。 创建数组 方式一&#xff1a;&#xff08;推荐&#xff09; var cars ["北京现代", "丰田", "五菱宏光"…

EDA-数据探索-pandas自带可视化-iris

# 加载yellowbrick数据集 import os import pandas as pd FIXTURES os.path.join(os.getcwd(), "data") df pd.read_csv(os.path.join(FIXTURES,"iris.csv")) df.head()sepal_lengthsepal_widthpetal_lengthpetal_widthspecies05.13.51.40.2setosa14.93…

最新AI系统ChatGPT网站系统源码,支持AI绘画,GPT语音对话,ChatFile文档对话总结,DALL-E3文生图,MJ绘画局部编辑重绘

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

数仓建设学习路线(三)元数据管理

什么是元数据&#xff1f; 简单来说就是描述数据的数据&#xff0c;更直白来说就是描述表名、表制作者、表字段、表生命周期、表存粗等信息的数据 元数据该如何管理 工具化 开源&#xff1a; 可通过atlas获取表依赖及信息做二次开发&#xff0c;或者完成可视化界面 平台化&am…

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述 &#xff08;二&#xff09;.防火墙组网

计组与原理:系统总线

大家好啊&#xff0c;这里来到计组第二部分内容&#xff1a;系统总线 跳转上一篇&#xff1a;计组原理&#xff1a;系统概论与基本组成 系统总线 1.总线的基本概念单总线结构框图面向 CPU 的双总线结构框图以存储器为中心的双总线结构框图 2.总线的分类片内总线系统总线通信总线…

Linux之权限(内容详细,细节满满)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 …

Python学习02—Python开发环境的配置

1.Python语言的简单概述 Python的诞生离不开一个人&#xff0c;他就是Guido van Rossum&#xff0c;他在1989年的圣诞节期间&#xff0c;在荷兰的阿姆斯特丹度假&#xff0c;为了打发假期时间&#xff0c;就想着设计一种编程语言&#xff0c;后期便诞生了Python Python语言拥…