当前位置: 首页 > news >正文

【Mybatis】Mybatis-plus使用介绍 - 教程


在这里插入图片描述

那我掉的头发算什么:个人主页

个人专栏: 《javaSE》《数据结构》《数据库》《javaEE》

⛺️待到苦尽甘来日

在这里插入图片描述

文章目录

  • Mybatis-plus介绍
  • 快速上手
    • 准备工作
      • 创建数据库
      • 项目准备
      • 创建实体类
      • 编写Mapper接口
    • CRUD单元测试
  • Mybatis-plus复杂操作
    • 常见注解
      • @TableName、@TableField、@Table
      • @TableId
    • 条件构造器
      • 1.QueryMapper
      • 2.UpdateWrapper
      • 3.LambdaQueryWrapper
      • 4.LambdaUpdateWrapper
    • 自定义SQL

Mybatis-plus介绍

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

特性:
润物无声:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
效率至上:只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间。
丰富功能:代码生成、自动分页、逻辑删除、自动填充、拦截器等功能一应俱全
广泛认可:连续 5 年获得开源中国年度最佳开源项目殊荣,Github 累计 16K Star。

(任何能使用 MyBatis 进行增删改查,并且支持标准 SQL 的数据库应该都在 MyBatis-Plus 的支持范围内)

官网地址:
https://baomidou.com/introduce/

在这里插入图片描述

快速上手

准备工作

创建数据库

创建一个类似的user_info数据表
在这里插入图片描述

项目准备

1.创建springBoot项目
2.添加依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot4-starter</artifactId><version>3.5.15</version></dependency>

springBoot版本4.0以后就需要使用这个依赖了。

3.配置yml文件

spring:
application:
name: mybatis-plus-demo
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: *****
password: *****
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration: # ???? MyBatis??
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml

创建实体类

package com.hbu.mybatisplusdemo.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user_info")
public class UserInfo {
@TableId(value = "id",type = IdType.AUTO)
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;
}

编写Mapper接口

MybatisPlus 提供了一个基础的 BaseMapper 接口,已经实现了单表的 CRUD,我们自定义的 Mapper 只需要继承这个 BaseMapper,就无需自己实现单表 CRUD 了。

在这里插入图片描述

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

CRUD单元测试

在这里插入图片描述
基本的功能都定义好了,直接调用就可以:

package com.hbu.mybatisplusdemo.mapper;
import com.hbu.mybatisplusdemo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void selectAll(){
userInfoMapper.selectById(1);
}
@Test
void deleteById(){
userInfoMapper.deleteById(20);
}
@Test
void updateById(){
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setUsername("不是张三");
userInfoMapper.updateById(userInfo);
}
@Test
void insert(){
UserInfo userInfo = new UserInfo();
userInfo.setUsername("不是张三");
userInfo.setAge(18);
userInfo.setGender(1);
userInfo.setPassword("555555");
userInfoMapper.insert(userInfo);
}
}

运行结果没啥问题,观察后端数据库也都成功了。

Mybatis-plus复杂操作

常见注解

在上面的程序中,MyBatis 是如何知道,我们要操作的是哪张表,表里有哪些字段呢?
UserInfoMapper 在继承 BaseMapper 时,指定了一个泛型,这个 UserInfo 就是与数据库表相对应的实体类。MyBatis-Plus 会根据这个实体类来推断表的信息。
默认情况下:
表名:实体类的驼峰表示法转换成蛇形表示法(下划线分割),作为表名。比如 UserInfo -> user_info
字段:根据实体类的属性名 转换为蛇形表示法作为字段名。比如 deleteFlag -> delete_flag
主键:默认为ID

那如果实体类和数据库不是按照上面的原则定义的呢??这时候就需要一些注解来帮忙了:

@TableName、@TableField、@Table

package com.hbu.mybatisplusdemo.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user_info")
public class Userinfo {
@Table("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;
}

如果咱们在定义类和类的属性时命名不规范,我们可以使用注解显示表明我们某一个属性或者类对应的是数据库中的哪张表或者哪个属性。

@TableId

在这里插入图片描述
我们上面插入一个新数据时,新数据的ID是随机的。但是我们定义数据库时明明设置了自增,要想恢复这个功能可以加上这个注解:

package com.hbu.mybatisplusdemo.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user_info")
public class UserInfo {
@TableId(value = "id",type = IdType.AUTO)
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;
}

然后再在设计表中把下一个id改成6就可以了。

条件构造器

入门程序里的使用,都是简单的 CRUD,在实际的应用场景中,我们还需要使用更复杂的操作,MyBatis-Plus 也给我们提供了相应的支持。

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

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

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

1.QueryMapper

QueryWrapper并不只用于查询语句, 无论是修改, 删除, 查询, 都可以使用QueryWrapper来构建查询条件.
在这里插入图片描述

@Test
void selectByCondition() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select("id, username, password, age, delete_flag").eq("age", 18).like("username", "张三");List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);userInfos.stream().forEach(System.out::println);}

在这里插入图片描述

注意:默认情况下 Mybatis-Plus 会根据 @TableField 生成别名,当指定了 QueryWrapper 的 select 属性后就仅仅是属性值而没有了别名,查询出来的结果会对应不上。

解决办法:
1.自己写自定义 SQL
2.实体类名和字段名保持一致
3.不指定 QueryWrapper 的 select 字段
4.使用 LambdaQueryWrapper 实现

在这里插入图片描述

@Test
void updateByCondition(){
UserInfo userinfo = new UserInfo();
userinfo.setDeleteFlag(1);
//where age<20
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lt("age", 20);userInfoMapper.update(userinfo, queryWrapper);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Test
void deleteByCondition(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("age",18);userInfoMapper.delete(queryWrapper);}

在这里插入图片描述
在这里插入图片描述

2.UpdateWrapper

咱们前面的更新操作,对于set属性设置的值,需要建立一个新的对象来表示:
在这里插入图片描述
在不创建实体类的情况下,我们可以使用UpdateWrapper来直接设置更新字段和条件。
在这里插入图片描述

@Test
void updateByCondition2(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",0).set("age",5).in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

3.LambdaQueryWrapper

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

@Test
void lambdaQueryWrapper(){
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().select(UserInfo::getUsername,UserInfo::getPassword,UserInfo::getAge).eq(UserInfo::getId,1);userInfoMapper.selectList(queryWrapper).forEach(System.out::println);}

4.LambdaUpdateWrapper

用法与LambdaQueryWrapper相似

@Test
void lambdaUpdateWrapper(){
UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.lambda().set(UserInfo::getDeleteFlag,0).set(UserInfo::getAge,5).in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(updateWrapper);}

在这里插入图片描述
在这里插入图片描述

自定义SQL

在实际的开发中,MyBatis-Plus 提供的操作不能满足我们的实际需求,MyBatis-Plus 也提供了自定义 SQL 的功能,我们可以利用 Wrapper 构造查询条件,再结合 Mapper 编写 SQL。

package com.hbu.mybatisplusdemo.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.hbu.mybatisplusdemo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);}
@Test
void queryUserByCustom() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username","lisi");userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);}

在这里插入图片描述
注意事项:

・参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param (Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
・使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
・不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。

MyBatis-Plus 在 MyBatis 的基础上只做增强不做改变, 所以也支持XML的实现方式

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hbu.mybatisplusdemo.mapper.UserInfoMapper"><select id="queryUserByCustom2" resultType="com.hbu.mybatisplusdemo.model.UserInfo">select id,username,password,age from user_info ${ew.customSqlSegment}</select></mapper>
package com.hbu.mybatisplusdemo.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.hbu.mybatisplusdemo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select id,username,password,age from user_info ${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);}
@Test
void queryUserByCustom2() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username","lisi");userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);}

当然传递其他参数也是原来一样不变:

@Update("update user_info set age = age + @{addAge} ${ew.customSqlSegment}" )
Integer updateUserByCustom(Integer addAge,@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);
@Test
void updateUserByCustom() {
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().in("id",List.of(1,2,3));userInfoMapper.updateUserByCustom(10, queryWrapper);}
以上就是本篇博客全部内容!
http://www.jsqmd.com/news/445572/

相关文章:

  • 2026年重庆专业家具公司盘点与选购指南 - 2026年企业推荐榜
  • Vertex:PT玩家的追剧刷流一体化管理工具
  • 沃尔玛购物卡回收,靠谱便捷这样做 - 京顺回收
  • 我的创作纪念日——从实战实践者到行业布道者的创作进阶之路
  • 2026年3月青岛踢脚服务机构综合实力盘点 - 2026年企业推荐榜
  • 2026年多领域铜铝材优质供应商推荐榜:铝瓦生产厂家、铝瓦生产多少钱、铝质琉璃瓦、防腐保温铝卷价格选择指南 - 优质品牌商家
  • 2026年2月宠物外科医院口碑排名引发关注,宠物内科/宠物医生/母狗绝育/宠物绝育/腹腔镜绝育,宠物外科医生找哪家 - 品牌推荐师
  • 3个颠覆性步骤:系统级音频优化完全掌握指南
  • 北京海景、创意、个性婚纱摄影选购时要注意什么 - 工业品网
  • 3个关键步骤:使用UNTRUNC实现专业级视频恢复
  • 2026年记账报税公司如何选择,长沙靠谱推荐与选购指南 - 工业设备
  • 打破数据查询壁垒:WrenAI的自然语言交互革命
  • 2026年共话时尚家具定制,驻马店性价比高的厂家推荐 - 工业设备
  • 聊聊2026年长沙靠谱记账报税公司,哪家性价比高 - 工业品网
  • 2026年上海热门的试验机品牌推荐,斯特玛试验机评价好吗值得选吗? - 工业品牌热点
  • 电子课本解析工具:破解教育资源获取难题的创新方案
  • 2026年口碑好的卧式破碎机厂家推荐:双轴破碎机/单轴破碎机厂家推荐与选择指南 - 行业平台推荐
  • 2026年口碑好的金蝶进销存品牌推荐:深圳金蝶ERP软件/深圳金蝶云星辰精选汇总推荐公司 - 行业平台推荐
  • 3个颠覆性技巧:GHelper让ROG玩家实现轻量控制与性能释放
  • 2026年推荐一下AI推广专业公司,昆山地区口碑好的有哪些 - myqiye
  • 数字时代护眼新选择:Dark Reader开源方案全解析
  • 2026年江苏食材冷链配送渠道排名,选购时要注意什么 - 工业品牌热点
  • 真心不骗你 10个AI论文平台深度测评:继续教育毕业论文写作必备工具推荐
  • 剑指offer-81、⼆叉搜索树的最近公共祖先
  • 2026年OM - 5烟囱防腐涂料,聊聊哪家口碑好且性价比高 - myqiye
  • 苹果更新MacBook Air,存储升级价格涨
  • 2026年靠谱的二轴破碎机厂家推荐:对轴破碎机厂家选购参考建议 - 行业平台推荐
  • 任务解构引擎:基于Awesome-Dify-Workflow的复杂任务效能提升方案
  • 2026年口碑好的钢丝网骨架厂家推荐:湖北钢丝网骨架管/钢丝网骨架复合管行业内口碑厂家推荐 - 行业平台推荐
  • Mac新系统引不满,降级攻略来了