【JavaEE】MyBatis - Plus - 教程

news/2025/9/25 21:10:50/文章来源:https://www.cnblogs.com/slgkaifa/p/19112041

【JavaEE】MyBatis - Plus - 教程

目录

  • 一、快速使用
  • 二、CRUD简单使用
  • 三、常见注解
    • 3.1 @TableName
    • 3.2 @TableFiled
    • 3.3 @TableId
  • 四、条件构造器
    • 4.1 QueryWrapper
    • 4.2 UpdateWrapper
    • 4.3 LambdaQueryWrapper
    • 4.4 LambdaUpdateWrapper
  • 五、自定义SQL

一、快速使用

MyBatis Plus官方文档:MyBatis Plus官方文档

添加依赖:官方文档都有。
Spring Boot 3的依赖:

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

配置文件:

mybatis-plus:
configuration:
# MyBatis 配置
map-underscore-to-camel-case: true
global-config:
# 全局配置
db-config:
# 数据库配置
id-type: auto

也要配置数据库:

spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver

再写实体类,

package com.example.mybatisplus.demo.model;
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo
{
private Integer id;
private String username;
private String password;
private Byte age;
private Byte gender;
private String phone;
private Byte deleteFlag;
private Date createTime;
private Date updateTime;
}

写Mapper接口,要继承BaseMapper,泛型指代要操作的实体类。

package com.example.mybatisplus.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserInfoMapper extends BaseMapper<
UserInfo> {
}

打印日志配置:

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

二、CRUD简单使用

直接调用对应方法即可,方法名十分清晰。

  • 增:



  • 查:

三、常见注解

如果我们的数据库设计是按照蛇形标准来设计数据库名以及字段名的话,驼峰方式命名类属性的话,MyBatis Plus会自动帮我们映射,但是如果有不和规范无法映射的话,就需要使用注解来帮我们映射。

3.1 @TableName

@TableName是类注解,用来表示当前类对应的数据库表名。

通过错误日志可以看见mybatis-Plus是通过我们的类名去找表名的,当不符合规范就会找不到,但是加上@TableName注解讲明表名,就可以找到。

3.2 @TableFiled

@TableFiled注解这个是属性注解,跟@TableName作用一样,是用来对应当不符合规范命名时,对应类属性与数据库表字段的。

@TableField("update_time")
private Date updateTime;

3.3 @TableId

@TableId注解,是用来对应主键的。MyBatis - Plus默认主键是id,但是如果主键不是,就可以加上该注解表明这是主键对应的属性。还可以用 @TableId注解的type属性来设置当前是否是自增的。

@TableId(value = "id",type = IdType.AUTO)
private Integer id;

四、条件构造器

前面介绍的都是简单的CRUD,在实际的应⽤场景中,我们还需要使⽤更复杂的操作,MyBatisPlus也给我们提供了相应的⽀持。
MyBatis-Plus 提供了⼀套强⼤的条件构造器(Wrapper),⽤于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调⽤的⽅式构造查询条件,⽆需编写繁琐的 SQL 语句, 从⽽提⾼开发效率并减少 SQL注⼊的⻛险。

以下是主要的 Wrapper 类及其功能:

介绍一些简写过的方法:

4.1 QueryWrapper

QueryWrapper并不只⽤于查询语句, ⽆论是修改, 删除, 查询,后面需要跟条件查询的时候都可以使⽤QueryWrapper来构建查询条件。

例如下面的sql语句:

select id,username, password, age, gender from `user_info` where age = 18 and username like "%s%"

结果如下:

当我们使用QueryMapper对应的代码如下:

@Test
public void selectByCondition() {
QueryWrapper<
UserInfo> queryWrapper = new QueryWrapper<
>();
queryWrapper.select(" id","username", "password", "age", "gender")
.eq("age",18)
.like("username","s");
System.out.println(userInfoMapper.selectList(queryWrapper));
}

结果:

默认情况下Mybatis-Plus会根据 @TableFiled ⽣成别名, 当指定了QueryWrapper的select属性后就仅仅是属性值⽽没有了别名. 查询出来的结果会对应不上
解决办法:

  1. ⾃⼰写⾃定义SQL
  2. 实体类名和字段名保持⼀致
  3. 不指定QueryWrapper的select字段
  4. 使⽤LambdaQueryWrapper实现

4.2 UpdateWrapper

完成下面的sql语句:

update user_info set delete_flag = 1, age = age + 10 where id in(1,2,3)

运行前数据:

使用UpdateWrapper的代码:

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

运行后结果:

4.3 LambdaQueryWrapper

LambdaQueryWrapper是基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。也提⾼了代码的可读性和可维护性。

查询下面的sql

select id,username, password, age, gender from `user_info` where age = 28 and username like "%s%"

结果:

对应的使用LambdaQueryWrapper的代码:

@Test
public void selectByCondition2() {
LambdaQueryWrapper<
UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<
>();
lambdaQueryWrapper
.select(UserInfo::getId, UserInfo::getUsername, UserInfo::getPassword,
UserInfo::getAge,UserInfo::getGender, UserInfo::getDeleteFlag)
.eq(UserInfo::getAge,28)
.like(UserInfo::getUsername,"s");
System.out.println(userInfoMapper.selectList(lambdaQueryWrapper));
}

结果:

4.4 LambdaUpdateWrapper

update user_info set delete_flag = 1, age = age - 10 where id in(1,2,3)

运行前数据:

对应使用LambdaUpdateWrapper代码:

@Test
public void updateByCondition2() {
LambdaUpdateWrapper<
UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<
>();
lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1)
.setSql("age = age - 10")
.in(UserInfo::getId, List.of(1,2,3));
userInfoMapper.update(lambdaUpdateWrapper);
}

执行结果:

五、自定义SQL

官方文档,MyBatis Plus官方文档介绍自定义SQL如下:

示例一:
SQL语句:

select id,username, password, age from `user_info` where age = 18 or username like "%s%"

结果:

代码:

@Select(" select id,username, password, age from user_info ${ew.customSqlSegment}")
List<
UserInfo> select (@Param(Constants.WRAPPER) Wrapper<
UserInfo> wrapper);

测试代码:

@Test
void testSelect() {
QueryWrapper<
UserInfo> queryWrapper = new QueryWrapper<
>();
queryWrapper.eq("age",18)
.or()
.like("username","s");
userInfoMapper.select(queryWrapper);
}

结果:

示例二:
执行的SQL语句:

update user_info set delete_flag = 0, age = age + 10 where id in(1,2,3)

原始数据:

xml代码:

<update id="update">update user_info set delete_flag = 0, age = age + #{age} ${ew.customSqlSegment}
</update>

测试代码:

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

结果:

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

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

相关文章

多GPU本地布署Wan2.2-T2V-A14B文本转视频模型 - yi

多GPU本地布署Wan2.2-T2V-A14B文本转视频模型一,#本机环境检查 执行nvidia-smi,查看右上角。验证显卡驱动已安装最高支持的版本。nvidia-smi#在调试时,为了实时观察GPU利用率,一般新开一个命令窗口,执行以下命令,…

NOI 模拟赛五

DPA. 纪念场切题。 记 \(f[i, j, x, 0/1, 0/1]\) 表示前 \(i\) 个车站都已经经过,\(i\rightarrow i+1\) 的边走过 \(j\) 次,总距离 \(\bmod m=x\) ,是否钦定起点,是否钦定终点(这 \(j\) 条边经过是有顺序)。 为了…

常州装修网站建设公司企业的建站方式

运行软件前提前安装好OPC运行组件&#xff1a; 为方便演示&#xff0c;提前准备好了一个DAServer服务器&#xff1a; 接下来开始配置&#xff1a; 该软件主要实现的功能如下&#xff1a; 配置过程也相对简单&#xff1a; 第一步&#xff1a; 编辑如下文件&#xff1a; 第二步…

企业微信手机片网站制作上海建筑工程招投标网

这是什么&#xff1f;这是有关警告&#xff0c;错误和注意事项的许多答案&#xff0c;这些警告&#xff0c;错误和注意事项在您对PHP进行编程时可能会遇到&#xff0c;并且不知道如何解决它们。这也是一个社区Wiki&#xff0c;因此邀请所有人参与添加并维护此列表。为什么是这样…

免费咨询律师24小时电话桂平seo快速优化软件

数学建模常用的算法分类 全国大学生数学建模竞赛中&#xff0c;常见的算法模型有以下30种&#xff1a; 最小二乘法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析马…

中小型网站建设与管理总结wordpress手机怎么用

性能对比&#xff1a;Memcached 与 Redis 的关键差异 在选择合适的缓存系统时&#xff0c;Memcached 和 Redis 是最常被提及的两种技术。它们都是内存存储系统&#xff0c;用于提高数据访问速度和应用性能。尽管它们在功能上有很多相似之处&#xff0c;但在性能、特性和应用场…

AI热点周报(09.14~09.20):Gemini集成到Chrome、Claude 强化记忆、Qwen3-Next快捷落地,AI走向集成化,工程化?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

什么是Delphi4Python?

什么是Delphi4Python? Delphi for Python的主要重点是为Python开发者提供免费的Python模块或Delphi的GUI框架的绑定。基于Delphi的两个不同的框架两个不同的库。DelphiVCL,用于 Windows 的本地库;DelphiFMX,用于跨…

实用指南:Python的大杀器:Jupyter Notebook处理.ipynb文件

实用指南:Python的大杀器:Jupyter Notebook处理.ipynb文件pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

flask认证机制logging模块实战

flask认证机制logging模块实战 ​ 如何在项目中实现日志的记录呢?在 Flask 中我们可以使用 Python 的内置 logging 模块来实现记录日志。你可以对照表格看看具体的日志级别分类,从上往下级别依次升高,最高的是 CRIT…

1核1g服务器做网站网站建设模块有哪些

大家好&#xff0c;这里是深海网络&#xff0c;今天给大家讲解一下新版影视小程序搭建。  首先给大家看一下新版影视小程序是什么样子的&#xff0c;它有黑夜和白天两种观影模式&#xff0c;而且搜索精准&#xff0c;播放速度快。01第一步&#xff0c;开始正式搭建。新版区小…

25.9.25随笔联考总结

考试 开考后忘记通读题面了,主要是看到 T1 太简单直接写了,写完才去读的题。然后决定的开题顺序是 324,结果后面 4 个小时一道都不会,破防了。T2 我觉得直接 manacher 是很诡异的,然后就去思考套一个 ds 啥的,不…

软工9.25

今天学的内容,没有,学习什么。

2025/9/25 模拟赛总结

招笑。 A. prime显然 \(v(i)u(i)\) 是若干个升序的连续段,而连续的数量为 \(u(i)-v(i)\)。于是不难想到小学奥数裂项相消,即 \(\frac{y-x}{xy}=\frac{1}{x}-\frac{1}{y}\),然后连续的 \(-+-+\) 抵消掉,只剩下首尾两…

电商网站开发流程list兰州网页设计

Kubernetes 项目作为容器编排领域的事实标准&#xff0c; 成功推动了诸如阿里云 Kubernetes &#xff08;ACK&#xff09;等云原生服务的迅速增长。但同时我们也关注到&#xff0c;Kubernetes 的核心 API 资源比如 Service、Deployment 等&#xff0c;实际上只是应用中的不同组…

完整教程:C 语言宏函数进阶:逗号表达式与 GNU 拓展的妙用

完整教程:C 语言宏函数进阶:逗号表达式与 GNU 拓展的妙用2025-09-25 20:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

代码随想录算法训练营第九天 |151.翻转字符串里的单词、 LCR 182. 动态口令、28. 实现 strStr()、459.重复的子字符串

151.翻转字符串里的单词 思路:前去头空格,再去尾空格,然后依次取出所有的单词,然后用一个字符串接受,然后从放入的数组,倒置输出。难在去空格细节,我是内置for来进行去空格的func reverseWords(s string) strin…

郑州企业排名百度seo排名报价

我们在打印字符时&#xff0c;通常都不用指定字符显示的坐标位置&#xff0c;大家也没觉得有什么奇怪&#xff0c;原因是字符是在当前光标的位置处显示的&#xff0c;而且光标的位置会一直更新顺延&#xff0c;我们的字符一直跟着光标走&#xff0c;似乎光标就是字符的导航一样…

新手做网站视频讲解购买域名和网站

到底计算机考研408是怎么样的。第一&#xff0c;什么学校考408&#xff0c;大部分985和少部分211第二&#xff0c;难度怎么样&#xff0c;确实难度很大&#xff0c;我没考过其他工科&#xff0c;不知道是不是最难。但是我想说的是考过的大部分都说特别难&#xff0c;一般考890不…

广州建外贸网站公司wordpress 文章密码

一辆49cc的二冲程摩托车仅需561元。 购买125的组装车不会超过1元&#xff0c;购买250品牌发动机的组装车不会超过4000元。 购买一辆名牌摩托车大约需要4000到10000元。 花一万到两百万多就能买到一辆像样、动力强劲、能玩的炫酷摩托车。 哈哈&#xff0c;就看你想要什么了&…