一篇了解: MyBatis-Plus 操作数据库的使用

news2025/1/22 16:01:51

目录

一、MyBatis-Plus介绍

二、基础使用 

2.1 准备工作

2.2 编码

2.3 CRUD单元测试

三、MyBatis-Plus复杂操作

3.1 打印日志

3.2 常见注解

3.2.1 @TableName

3.2.2 @TableField

3.2.3 @TableId

3.3 条件构造器

3.3.1 QueryWrapper

3.3.2 UpdateWrapper

3.3.3 LambdaQueryWrapper 和 LambdaUpdateWrapper


一、MyBatis-Plus介绍

MyBatis-Plus(简称 MP) 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变, 为简化开发,提高效率而生。
它支持多款数据库,如: PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, OceanBase, H2, DB2... (任何能使用 MyBatis 进行增删改查,并且支持标准 SQL 的数据库应该都在 MyBatis-Plus 的支持范围 内)
官网地址: https://baomidou.com/

二、基础使用 

Mybatis-Plus操作数据库的步骤:

  1. 准备工作(数据准备, 项目准备, 引入依赖, 配置数据库连接信息)
  2. 编码(数据库表对应的实体类, 以及数据操作的Mapper文件)
  3. 测试

以下使用具体的例子体现 MyBatis-Plus 是如何操作数据库的。

2.1 准备工作

创建用户表, 并创建对应的实体类User:
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `username` VARCHAR ( 127 ) NOT NULL,
 `password` VARCHAR ( 127 ) NOT NULL,
 `age` TINYINT ( 4 ) NOT NULL,
 `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
 `phone` VARCHAR ( 15 ) DEFAULT NULL,
 `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
 `create_time` DATETIME DEFAULT now(),
 `update_time` DATETIME DEFAULT now(),
 PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 
-- 添加⽤⼾信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
创建springboot工程 ,添加MyBatis-Plus和MySQL依赖, 配置数据库连接信息:
Spring Boot2
<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.5.7</version>
</dependency>

Spring Boot3

<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
 <version>3.5.5</version>
</dependency>

MySQL

<dependency>
 <groupId>com.mysql</groupId>
 <artifactId>mysql-connector-j</artifactId>
 <scope>runtime</scope>
</dependency>

配置数据库:

application.yml文件格式:

# 数据库连接配置
spring:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
  username: root
  password: root
  driver-class-name: com.mysql.cj.jdbc.Driver
application.properties文件格式如下:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root

2.2 编码

创建实体类UserInfo

import lombok.Data;

import java.util.Date;

@Data
public class UserInfo {
 private Integer id;
 private String username;
 private String password;
 private Integer age;
 private Integer gender;
 private String phone;
 private Integer deleteFlag;
 private Date createTime;
 private Date updateTime;
}
编写Mapper接口类
MybatisPlus提供了一个基础的 BaseMapper 接口,已经实现了单表的CRUD, 自定义的 Mapper只需要继承这个BaseMapper, 就无需自己实现单表CRUD了。
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

也可以在启动类上添加 @MapperScan , 扫描Mapper文件夹, ⼆选一即可。

2.3 CRUD单元测试

在创建出来的SpringBoot工程中,在src下的test目录下,已经自动创建好了测试类 ,可以直接使用这个测试类来进行测试。编写几个单元测试,测试基本的CRUD功能:
@SpringBootTest
class MybatisPlusDemoApplicationTests {

 @Autowired
  private UserInfoMapper userInfoMapper;

 @Test
 void testInsert() {
   UserInfo user = new UserInfo();
   user.setUsername("bite");
   user.setPassword("123456");
   user.setAge(11);
   user.setGender(0);
   user.setPhone("18610001234");
   userInfoMapper.insert(user);
 }

 @Test
 void testSelectById() {
  UserInfo user = userInfoMapper.selectById(1L);
  System.out.println("user: " + user);
 }

 @Test
 void testSelectByIds() {
   List<UserInfo> users = userInfoMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));
   users.forEach(System.out::println);
 }

 @Test
 void testUpdateById() {
   UserInfo user = new UserInfo();
   user.setId(1);
   user.setPassword("4444444");
   userInfoMapper.updateById(user);
 }

 @Test
 void testDelete() {
   userInfoMapper.deleteById(5L);
 }
}

结果如下,执行成功:

三、MyBatis-Plus复杂操作

3.1 打印日志

mybatis-plus:
 configuration: # 配置打印 MyBatis⽇志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2 常见注解

默认情况下:
  1. 表名: 实体类的驼峰表示法转换成蛇形表示法(下划线分割), 作为表名。比如UserInfo -> user_info
  2. 字段: 根据实体类的属性名转换为蛇形表示法作为字段名。比如deleteFlag -> delete_flag
  3. 主键: 默认为id
那如果实体类和数据库不是按照上述规则定义的呢? MyBatis-Plus提供了一些注解,来标识表的信息。

3.2.1 @TableName

通过 @TableName 来标识实体类对应的表:
@Data
@TableName("user_info")
public class Userinfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

3.2.2 @TableField

通过 @TableField 来标识对应的字段名:
@Data
@TableName("user_info")
   public class Userinfo {
   private Integer id;
   private String username;
   private String password;
   private Integer age;
   private Integer gender;
   private String phone;

  @TableField("delete_flag")
   private Integer deleteflag;
   private Date createTime;
   private Date updateTime;
}

3.2.3 @TableId

通过 @TableId 来指定对应的主键:
 @Data
 @TableName("user_info")
   public class Userinfo {
   
 @TableId("id")
   private Integer userId;
   private String username;
   private String password;
   private Integer age;
   private Integer gender;
   private String phone;

  @TableField("delete_flag")
   private Integer deleteflag;
   private Date createTime;
   private Date updateTime;
}

3.3 条件构造器

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL注入的风险。

以下是主要的 Wrapper 类及其功能:
  • AbstractWrapper:这是⼀个抽象基类, 提供了所有 Wrapper 类共有的方法和属性。
  • QueryWrapper:用于构造查询条件, 在AbstractWrapper的基础上拓展了一个select方法, 允许指定查询字段。
  • UpdateWrapper: 用于构造更新条件, 可以在更新数据时指定条件。
  • LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。
  • LambdaUpdateWrapper: 基于 Lambda 表达式的更新条件构造器, 它允许你使用 Lambda 表达 式来指定更新字段和条件,同样避免了硬编码字段名的问题。

3.3.1 QueryWrapper

QueryWrapper并不只用于查询语句, 无论是修改, 删除, 查询, 都可以使用QueryWrapper来构建查询条件。

查询:

@Test
void testQueryWrapper(){
 QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
 .select("id","username","password","age")
 .eq("age",18)
 .like("username", "min");

 List<UserInfo> userInfos = userInfoMapper.selectList(userInfoQueryWrapper);
 userInfos.forEach(System.out::println);
}

更新:

@Test
void testUpdateByQueryWrapper(){
 QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
 .lt("age", 20);

 UserInfo userInfo = new UserInfo();
 userInfo.setDeleteFlag(1);
 userInfoMapper.update(userInfo, userInfoQueryWrapper);
}
• lt : "less than" 的缩写,表示小于;
• le : "less than or equal to"的缩写,表示小于等于;
• ge : "greater than or equal to" 的缩写,表示大于等于;
• gt : "greater than" 的缩写,表示大于;
• eq : "equals" 的缩写,表示等于;
• ne : "not equals" 的缩写,表示不等于;

删除:

@Test
void testDeleteByQueryWrapper(){
 QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
 .eq("age",18);

 userInfoMapper.delete(userInfoQueryWrapper);

3.3.2 UpdateWrapper

对于更新, 也可以直接使用 UpdateWrapper, 在不创建实体对象的情况下, 直接设置更新字段和条件。
  • 基础更新:
完成下述SQL查询:
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)

测试代码:

@Test
void testUpdateByUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>()
       .set("delete_flag",0)
       .set("age", 5)
       .in("id", List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}
  • 基于SQL更新:
完成下述SQL查询:
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)

测试代码:

@Test
void testUpdateBySQLUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>()
          .setSql("age = age+10")
          .in("id", List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}

3.3.3 LambdaQueryWrapper 和 LambdaUpdateWrapper

 QueryWrapper 和 UpdateWrapper存在一个问题,就是需要写死字段名,如果字段名发生变更, 可能会因为测试不到位酿成事故。MyBatis-Plus 给我们提供了一种基于Lambda表达式的条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名,,也提高了代码的可读性和可维护性。

LambdaQueryWrapper  和  LambdaUpdateWrapper 分别对应上述的 QueryWrapper 和 UpdateWrapper。

用法:

@Test
void testLambdaQueryWrapper(){
 QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();
 queryWrapper.lambda()
 .select(UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge)
 .eq(UserInfo::getUserId, 1);
 userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
}
@Test
void testLambdUpdateByUpdateWrapper(){
 UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();
 updateWrapper.lambda()
 .set(UserInfo::getDeleteFlag, 0)
 .set(UserInfo::getAge, 5)
 .in(UserInfo::getUserId, List.of(1,2,3));
 userInfoMapper.update(updateWrapper);
}

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

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

相关文章

网络空间安全专业怎么样,可通过哪些途径自学?

网络空间安全主要研究网络空间的组成、形态、安全、管理等&#xff0c;进行网络空间相关的软硬件开发、系统设计与分析、网络空间安全规划管理等。例如&#xff0c;网络犯罪的预防&#xff0c;国家网络安全的维护&#xff0c;杀毒软件等安全产品的研发&#xff0c;网络世界的监…

计算机常识与NOIP历史-CSP初赛知识点整理

真题练习 [2021-CSP-J-第2题] 以下奖项与计算机领域最相关的是&#xff08; &#xff09;。 A.奥斯卡奖 B.图灵奖 C.诺贝尔奖 D.普利策奖 [2017-NOIP-第7题] 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。 A. 1983 B. 1984 C. 1985 D. 1986 [2018-NOIP-第5题…

Professional Scrum Master (PSM) 官方认证培训班:掌握Scrum,提升项目管理能力

在快速变化的商业环境中&#xff0c;高效的项目管理和团队协作是企业成功的关键。作为一种广泛认可的敏捷框架&#xff0c;Scrum已成为推动项目成功和提高团队效率的重要工具。为了帮助专业人士掌握Scrum方法和实践&#xff0c;Scrum.org推出了Professional Scrum Master (PSM)…

C++ 初探:不要‘下次一定’,立即开始你的C++之旅

C初识 文章目录 C hello worldnamespace&#xff0c;命名空间命名空间的使用域作用限定符展开命名空间指定展开命名空间成员 C的域 C的输入和输出缺省参数函数重载引用&#xff08;reference&#xff09;引用概念引用的特性引用的使用const引用 inlinenullptr C hello world #…

学习C语言遇到的问题

前言 这是博主在班训班培训期间学习C基础过程中遇到的一些问题&#xff0c;我把遇到的问题以及这些问题的解答链接统一放在这篇文章了。这只是博主遇到的一些问题&#xff0c;可能不会适用于全部人&#xff0c;希望大家把这篇文章当做查漏补缺的内容吧。 问题一:把字符串赋给…

三十种未授权访问漏洞复现 合集( 三)

未授权访问漏洞介绍 未授权访问可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷&#xff0c;导致其他用户可以直接访问&#xff0c;从而引发重要权限可被操作、数据库、网站目录等敏感信息泄露。---->目录遍历 目前主要存在未授权访问漏洞的有:NFS服务&a…

CnosDB 元数据集群 – 分布式时序数据库的大脑

CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。 1. 概述 CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。元数据包括数据库…

用Ollama 和 Open WebUI本地部署Llama 3.1 8B

说明&#xff1a; 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型&#xff08;LLM&…

[CR]厚云填补_GridFormer

GridFormer: Residual Dense Transformer with Grid Structure for Image Restoration in Adverse Weather Conditions Abstract 恶劣天气条件下的图像恢复是计算机视觉中的一个难点。在本文中&#xff0c;我们提出了一种新的基于变压器的框架GridFormer&#xff0c;它可以作为…

【Android】ContentProvider基本概念

ContentProvider Android权限机制详解 <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.example.broadcasttest"> <uses-permission android:name"android.permission.RECEIVE_BOOT_COMPLETED" />…

8.2 grafana上导入模板看图并讲解告警

本节重点介绍 : grafana 上导入mysqld-dashboardglobal status 相关源码解读重要指标讲解 连接数内存TPS、QPS 将采集任务添加到prometheus中 - job_name: mysqld_exporterhonor_timestamps: truescrape_interval: 8sscrape_timeout: 8smetrics_path: /metricsscheme: httpf…

七天打造一套量化交易系统:Day7-实盘交易接入方式与注意事项

七天打造一套量化交易系统&#xff1a;Day7-实盘交易接入方式与注意事项 前情回顾证券交易接口XTP 接口头文件列表XTP 接口 demo 示例 期货交易接口CTP-API开发系列专栏 数字货币交易接口实盘接入注意事项 量化交易系统的核心要素包括选择投资标的、资金的分配、何时入场、何时…

Midjourney咒语之装修设计

装修设计 living room with a chinese shanshui painting frame on a wall with a 2 inch frame, colors: blue, white, focus on the picture, 35mm lens, realistic, design, commercial, plants, furniture, centered painting --s 750 --ar 16:9 80 square meter minimalis…

浅谈简单的搜索算法(c++)

目录 DFS思路实现应用场景DFS 的优缺点优点缺点 例题讲解N皇后问题[题目描述]输入输出样例输入样例输出 思路AC代码排列数字[题目描述]输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a;思路AC代码 树的重心[题目描述]输入格式输出格式数据范围输入样例输出样…

百度网盘不下载怎么直接打印文件?

在数字化时代&#xff0c;百度网盘作为我们存储和分享文件的重要工具&#xff0c;承载了大量的文档、图片和资料。然而&#xff0c;当需要打印这些文件时&#xff0c;很多用户会面临一个共同的问题&#xff1a;不想下载到本地再打印&#xff0c;既占用空间又浪费时间。那么&…

自闭症儿童无法上学?专业康复机构是希望的灯塔

面对自闭症儿童因特殊需求而无法融入普通学校的困境&#xff0c;每一位家长的心中都充满了焦虑与无助。然而&#xff0c;在这个充满挑战的时刻&#xff0c;选择一条科学、系统的康复之路&#xff0c;成为了引领孩子走向未来的关键。星启帆&#xff0c;作为国内规模较大全寄宿制…

0_(机器学习)逻辑回归介绍

模型简介 逻辑回归&#xff08;logistic回归&#xff09;即对数几率回归&#xff0c;它虽然被称作“回归”&#xff0c;但却是一种用于二分类的分类方法。逻辑回归是通过分析一个样本被分为各个类的概率比较后得出该样本最有可能属于的类的一种分类方法。 逻辑回归公式推导 训…

《Python数据结构精要:选择与应用》

本文将深入探讨Python中的几种常见数据结构&#xff0c;并通过实际案例来展示它们的应用场景和优缺点。通过本文的学习&#xff0c;读者可以更好地理解何时使用哪种数据结构以达到最优的程序性能。 正文内容&#xff1a; 引言 介绍数据结构的重要性及其在Python中的实现。简…

8.4 字符串中等 443 String Compression 467 Unique Substrings in Wraparound String

443 String Compression 注意&#xff1a;这里是按照顺序压缩&#xff0c;不忽略顺序就不能用字母表计数再还原了。 如果char num 1 只需要压入char本身 num > 1 时还需要压入char的个数 按字符压入 class Solution { public:vector<char> Push(vector<char>&a…

吴恩达机器学习COURSE1 WEEK3

COURSE1 WEEK3 逻辑回归 逻辑回归主要用于分类任务 只有两种输出结果的分类任务叫做二元分类&#xff0c;例如预测垃圾邮件&#xff0c;只能回答是或否 实际上&#xff0c;在逻辑回归中&#xff0c;我们要做的任务就类似于在数据集中画出一个这样的曲线&#xff0c;用来作为…