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=true
    username: root
    #检查密码是否正确
    password: root

#SpringBoot整合MybatisPlus配置
mybatis-plus:
  #定义别名包
  type-aliases-package: com.jt.pojo
  mapper-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 {
    @Autowired
    private DemoUserMapper userMapper;

    @Test
    public 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 解决自动注入警告问题

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哪个牌子的洗地机质量好?值得入手的洗地机

在家庭清洁方面&#xff0c;洗地机绝不是被认为的智商税。实际上&#xff0c;洗地机是一种非常实用的清洁工具&#xff0c;其最大的优点在于能够高效地协助我们清理家居环境&#xff0c;不论是在何种场景下&#xff0c;都能有效提升卫生水平。然而&#xff0c;由于市场上存在众…

seata1.8 + nacos,store.mode=db

吐槽一下&#xff0c;官方文档是真少&#xff0c;而且更新很不及时。。 官网地址&#xff1a;直接部署 | Apache Seata 上述地址也包含了下载链接&#xff0c;我用的1.8版本&#xff0c;挑一些关键配置说一下 1、服务器上&#xff0c;seata/conf/application.yml&#xff0c;将…

【数据结构】从顺序表到ArrayList类

文章目录 1.线性表1.1线性表的概念2.顺序表2.1顺序表的概念2.2顺序表的实现2.3接口的实现(对数组增删查改操作)3.ArrayList简介4. ArrayList使用 4.1ArrayList的构造4.2 ArrayList的方法4.3 ArrayList的遍历 1.线性表 1.1线性表的概念 线性表&#xff08;linear list&#xf…

HCIP-10

交换机的作用&#xff1a; 区别集线器&#xff08;HUB&#xff09;&#xff0c;HUB为物理层设备&#xff0c;只能直接转发发电流&#xff1b; 交换机为数据链路层设备&#xff0c;可以将电流与二进制转换&#xff0c;实现了以下功能&#xff1a; 无限的传输距离彻底解决了冲突…

条件概率、全概率和贝叶斯公式

目录 1. 条件概率 1.1 条件概率说明 1.2 举例说明 1.3 条件概率公式 2. 全概率公式 2.1 条件概率公式 2.2 一个特例公式 2.3 全概率公式的意义 3. 贝叶斯公式 3.1 贝叶斯公式的推导 3.2 贝叶斯公式一个特例 ​​​​​​​3.3 贝叶斯公式的意义 4. 先验概率 &…

6.1 实现微服务:匹配系统(上中下)

WebSocketConfig。ja&#xff08;onOpen建立连接时自动调用onClose关闭链接时自动调用&#xff08;user还存在就在线程移除&#xff09;onMessageServer从Client接收消息时触发&#xff09; status&#xff1a;match来切换界面是不是匹配还是比赛的 解析token&#xff0c;如果…

Elastic Observability 8.12:AI 助手、SLO 和移动 APM 支持的正式发布

作者&#xff1a;来自 Elastic Tom Grabowski, Akhilesh Pokhariyal Elastic Observability 8.12 宣布 AI Assistant 全面上市 (正式发布)、服务级别目标 (SLO) 和移动 APM 支持&#xff1a; 服务级别目标 (service level objective - SLO)&#xff1a;现在正式发布版允许 SRE…

python:socket基础操作(2)-《udp发送信息》

基础发送udp信息 1.导入socket模块 2.使用udp模块 3.发送内容 4.关闭套接字 很简单的4步就可以实现udp的消息发送 import socket # 导入模块udp_socket socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 使用ipv4 udp协议udp_socket.sendto(b"hello world",(&…

即插即用篇 | UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

精品基于Uniapp+springboot智慧校园管理系统App课程选课成绩

《[含文档PPT源码等]精品基于Uniappspringboot智慧校园管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

ffmpeg使用及java操作

1.文档 官网: FFmpeg 官方使用文档: ffmpeg Documentation 中文简介: https://www.cnblogs.com/leisure_chn/p/10297002.html 函数及时间: ffmpeg日记1011-过滤器-语法高阶&#xff0c;逻辑&#xff0c;函数使用_ffmpeg gte(t,2)-CSDN博客 java集成ffmpeg: SpringBoot集成f…

【网络安全】-基本工具msf

secure 1、有此漏洞的目标主机2、无此漏洞的目标主机&#xff08;常用&#xff09; ps.本着兴趣爱好&#xff0c;加强电脑的安全防护能力&#xff0c;并严格遵守法律和道德规范。msf&#xff08;metasploit framework&#xff09;是一个开源的渗透测试框架&#xff0c;用于开发…

“智汇语言·驭领未来”——系列特辑:LLM大模型信息获取与企业应用变革

“智汇语言驭领未来”——系列特辑&#xff1a;LLM大模型信息获取与企业应用变革 原创 认真的飞速小软 飞速创软 2024-01-16 09:30 发表于新加坡 本期引言 LLM&#xff08;Large Language Model&#xff09;大型语言模型以其自然语言理解和生成能力&#xff0c;正以前所未有的…

函数极限与连续复盘

文章目录 函数的概念与特性反函数复合函数重要函数图像三个重要结论隐函数函数的四种特性有界性单调性奇偶性定义判断式复合函数的奇偶性:两个要记住的函数奇偶性:导数的奇偶性性质:一种特殊的形式 周期性重要结论 函数的图像基本初等函数与初等函数有趣的特性: 函数极限的概念…

Linux用户和权限

目录 1 root用户 1.1 root用户&#xff08;超级管理员&#xff09; ​​​​1.2 用户切换目录 1.3 sudo命令 2 用户、用户组管理 2.1 用户、用户组的概念 2.2 用户、用户组管理的相关命令 3 查看权限控制 4 修改权限控制 -chmod 5 修改权限控制 -chown 1 root用户 …

五分钟搞懂 POM 设计模式

今天&#xff0c;我们来聊聊 Web UI 自动化测试中的 POM 设计模式。 为什么要用 POM 设计模式 前期&#xff0c;我们学会了使用 PythonSelenium 编写 Web UI 自动化测试线性脚本 线性脚本&#xff08;以快递 100 网站登录举栗&#xff09;&#xff1a; PYTHON 1 2 3 4 5 6 …

MapReduce概述

文章目录 1. 分布式系统的驱动力和挑战2. 分布式系统的抽象和实现工具3. 可扩展性、可用性、一致性4. MapReduce基本工作方式5. Map函数和Reduce函数 1. 分布式系统的驱动力和挑战 分布式系统的核心是通过网络来协调&#xff0c;共同完成一致任务的一些计算机。构建分布式系统…

shopee最新选品:Shopee平台上的最新选品策略和方法

在Shopee平台上进行选品是卖家们必须经历的重要步骤。通过精心选择和定位产品&#xff0c;卖家可以提高产品的市场接受度和销售业绩。然而&#xff0c;要在竞争激烈的电商市场中脱颖而出&#xff0c;并不是一件容易的事情。本文将介绍一些在Shopee平台上进行最新选品时可以采用…

动态权限有哪些

定位权限&#xff1a; ACCESS_FINE_LOCATION&#xff1a;精确位置ACCESS_COARSE_LOCATION&#xff1a;大致位置 相机权限&#xff1a; CAMERA&#xff1a;访问摄像头 存储权限&#xff1a; READ_EXTERNAL_STORAGE&#xff1a;读取外部存储WRITE_EXTERNAL_STORAGE&#xff1a;…

【测试必备】汉化Postman竟如此简单,秒变中文,真香

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…