当前位置: 代码网 > it编程>编程语言>Java > MyBatis-Plus注解配置、条件构造器与自定义SQL的复杂操作实例详解

MyBatis-Plus注解配置、条件构造器与自定义SQL的复杂操作实例详解

2026年02月03日 Java 我要评论
一、mybatis-plus介绍mybatis-plus(简称 mp) 是一个 mybatis 的增强工具, 在 mybatis 的基础上只做增强不做改变, 为简化开发、提高效率而生。特性润物无声:

一、mybatis-plus介绍

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

特性

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

支持数据库
postgresql, mysql, mariadb, oracle, sql server, oceanbase, h2, db2…
(任何能使用 mybatis 进行增删改查,并且支持标准 sql 的数据库应该都在 mybatis-plus 的支持范围内)

官网地址:mybatis-plus 简化开发

二、mybatis-plus 入门使用

mybatis-plus操作数据库的步骤:

2.1 依赖引入与配置

  1. 创建springboot工程
  2. 添加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 入门使用

  • 创建实体类,实体类的属性名与表中的字段名一一对应:
  • 编写mapper接口类

mybatisplus提供了一个基础的basemapper 接口,已经实现了单表的crud,自定义的 mapper只需要继承这个basemapper,就无需自己实现单表crud了。

basemapper包含了很多方法,示例

mapper接口代码

@mapper
public interface userinfomapper extends basemapper<userinfo> {
}

也可以在启动类上添加 @mapperscan ,扫描mapper文件夹,如下:(二选一即可)

  1. crud单元测试

在创建出来的springboot工程中,在src下的test目录下,创建测试类,可以直接使用这个测试类来进行测试。

编写单元测试,测试基本的crud功能:

@springboottest
class mybatisplusdemoapplicationtests {
    @autowired
    private userinfomapper userinfomapper;
    @test
    public void testselect() {
        system.out.println(("----- selectall method test ------"));
        list<userinfo> userlist = userinfomapper.selectlist(null);
        userlist.foreach(system.out::println);
    }
}

运行结果如下

三、mybatis-plus复杂操作

3.1 注解配置

mybatis是如何知道,我们要操作的是哪张表,表里有哪些字段呢?

@mapper
public interface userinfomapper extends basemapper<userinfo> {
}

userinfomapper 在继承basemapper 时, 指定了一个泛型, 这个userinfo就是与数据库表相对应的实体类。mybatis-plus会根据这个实体类来推断表的信息。

默认情况下

  1. 表名: 实体类的驼峰表示法转换成蛇形表示法(下划线分割), 作为表名。比如userinfo -> user_info
  2. 字段: 根据实体类的属性名转换为蛇形表示法作为字段名。比如deleteflag -> delete_flag
  3. 主键: 默认为id

如果实体类和数据库不是按照上述规则定义。mybatis-plus也给我们提供了一些注解,用来标识表的信息。

3.1.1 @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.1.2 @tablefield

该注解用于标记实体类中的非主键字段,它告诉 mybatis-plus 如何映射实体类字段到数据库表字段。如果实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,可以省略这个注解。

示例:

@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.1.3 @tableid

该注解用于标记实体类中的主键字段。如果你的主键字段名为 id,可以省略这个注解。

示例:

@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;
}

如果属性名和字段名不一致, 需要在@tableid 指明对应的字段名;属性名和字段一致的情况下, 直接加@tableid 注解就可以。

@tableid 参数介绍:

  • value
    • 类型:string
    • 默认值""
    • 描述:指定数据库表的主键字段名。如果不设置,mybatis-plus 将使用实体类中的字段名作为数据库表的主键字段名。
  • type
    • 类型:enum
    • 默认值:idtype.none
    • 描述:指定主键的生成策略。

idtype 枚举类型定义

  • idtype.auto:使用数据库自增 id 作为主键。
  • idtype.none:无特定生成策略,如果全局配置中有 idtype 相关的配置,则会跟随全局配置。
  • idtype.input:在插入数据前,由用户自行设置主键值。
  • idtype.assign_id:自动分配 id,适用于 long、integer、string 类型的主键。默认使用雪花算法通过 identifiergenerator 的 nextid 实现。
  • idtype.assign_uuid:自动分配 uuid,适用于 string 类型的主键。默认实现为 identifiergenerator 的 nextuuid 方法。

详情参考网址:注解配置

3.2 打印日志

mybatis-plus配置日志如下(application.yml):

mybatis-plus:
  configuration: # 配置打印 mybatis日志
    log-impl: org.apache.ibatis.logging.stdout.stdoutimpl

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来构建查询条件。

  1. 查询

完成sql:

select id,username,password,age from user_info where age = 18 and username like "%min%"

测试代码:

@test
@test
    void testquerywrapper(){
        querywrapper<userinfo> querywrapper = new querywrapper<>();
        querywrapper.select("id","username","password","age")
                .eq("age",18)
                .like("username","min");
        list<userinfo> userinfos = userinfomapper.selectlist(querywrapper);
        userinfos.foreach(system.out::println);
    }
  1. 更新

完成sql:

update user_info set delete_flag=? where age < 20

测试代码:

@test
@test
    void testupdatebyquerywrapper(){
        querywrapper<userinfo> querywrapper = new querywrapper<>();
        querywrapper.lt("age",20);
        userinfo userinfo = new userinfo();
        userinfo.setdeleteflag(1);
        userinfomapper.update(userinfo,querywrapper);
    }

条件方法说明

  • lt : “less than” 的缩写,表示小于
  • le : "less than or equal to"的缩写, 表示小于等于
  • ge : “greater than or equal to” 的缩写, 表示大于等于
  • gt : “greater than” 的缩写, 表示大于
  • eq : “equals” 的缩写, 表示等于
  • ne : “not equals” 的缩写, 表示不等于
  1. 删除

完成sql:

delete from user_info where age = 18

测试代码:

@test
void testdeletebyquerywrapper(){
    querywrapper<userinfo> userinfoquerywrapper = new querywrapper<userinfo>()
            .eq("age",18);
    userinfomapper.delete(userinfoquerywrapper);

}

3.3.2 updatewrapper

对于更新,也可以直接使用 updatewrapper,在不创建实体对象的情况下,直接设置更新字段和条件。

  1. 基础更新

完成sql:

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

测试代码

@test
void testupdatewrapper(){
    updatewrapper<userinfo> updatewrapper = new updatewrapper<>();
    updatewrapper.set("delete_flag",1).set("age",5).in("id",list.of(2,3,5,8));
    userinfomapper.update(updatewrapper);
}
  1. 基于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(null, updatewrapper);
}

3.3.3 lambdaquerywrapper

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::getid, 1);
    userinfomapper.selectlist(querywrapper).foreach(system.out::println);
}

3.3.4 lambdaupdatewrapper

lambdaupdatewrapper用法和 lambdaquerywrapper相似:

@test
void testlambdaupdatebyupdatewrapper(){
    updatewrapper<userinfo> updatewrapper = new updatewrapper<userinfo>();
    updatewrapper.lambda()
            .set(userinfo::getdeleteflag, 0)
            .set(userinfo::getage, 5)
            .in(userinfo::getid, list.of(1,2,3));
    userinfomapper.update(null, updatewrapper);
}

3.4 自定义sql

在实际的开发中, mybatis-plus提供的操作不能满足所有的实际需求, mybatis-plus 也提供了自定义 sql的功能, 可以利用wrapper构造查询条件, 再结合mapper编写sql。

  • 注:为了使用这一功能, mybatis-plus 版本不低于 3.0.7。

代码示例1
完成下述sql查询:

select id,username,password,age from user_info where username = "admin"

mapper

@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 testqueryuserbycustom(){
    querywrapper<userinfo> querywrapper = new querywrapper<userinfo>()
            .eq("username","admin");
    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 语句。

代码示例2

mybatis-plus 在 mybatis 的基础上只做增强不做改变, 所以也支持xml的实现方式。上述功能也可以使用xml的方式完成。

配置mapper路径(application.yml)

mybatis-plus:
  mapper-locations: "classpath*:/mapper/**.xml" # mapper.xml

mapper

    list<userinfo> queryuserbycustom2(@param(constants.wrapper) wrapper<userinfo> wrapper);

编写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.bite.mybatis.plus.mapper.userinfomapper">
    <select id="queryuserbycustom2" resulttype="com.bite.mybatis.plus.entity.userinfo">
        select id,username,password,age from user_info ${ew.customsqlsegment}
    </select>
</mapper>

测试

@test
void testqueryuserbycustom2(){
    querywrapper<userinfo> querywrapper = new querywrapper<userinfo>()
            .eq("username","admin");
    userinfomapper.queryuserbycustom2(querywrapper).foreach(system.out::println);
}

到此这篇关于mybatis-plus注解配置、条件构造器与自定义sql的复杂操作实例详解的文章就介绍到这了,更多相关mybatisplus注解条件构造器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com