MybatisPlus中的使用Wrapper自定义SQL

一、条件构造器

        条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦,提高代码的可读性和可维护性。

以下是官方文档提供的常用的条件构造器实例:

        每种方法都重载了第一个参数为boolean类型的参数,表示该条件是否加入最后生成的sql中,默认为true。

alleq():全部eq

allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null

eq():等于 =

eq("name", "老王")--->name = '老王'

ne():不等于 <>

ne("name", "老王")--->name <> '老王'

gt():大于 >

gt("age", 18)--->age > 18

ge():大于等于 >=

ge("age", 18)--->age >= 18

lt():小于 <

lt("age", 18)--->age < 18

le():小于等于 <=

le("age", 18)--->age <= 18

or():拼接OR

eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

add():拼接AND

and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

between():BETWEEN 值1 AND 值2

between("age", 18, 30)--->age between 18 and 30

notBetween():NOT BETWEEN 值1 AND 值2

notBetween("age", 18, 30)--->age not between 18 and 30

like():LIKE '%值%

like("name", "王")--->name like '%王%'

notLike():NOT LIKE '%值%'

notLike("name", "王")--->name not like '%王%'

likeLeft():LIKE '%值'

likeLeft("name", "王")--->name like '%王'

likeRight():LIKE '值%'

likeRight("name", "王")--->name like '王%'

isNull():字段 IS NULL

isNull("name")--->name is null

isNotNull():字段 IS NOT NULL

isNotNull("name")--->name is not null

in():字段 IN (v0, v1, ...)

in("age", 1, 2, 3)--->age in (1,2,3)

notIn():字段NOT IN  (v0, v1, ...)

notIn("age", 1, 2, 3)--->age not in (1,2,3)

groupBy():分组:GROUP BY 字段

groupBy("id", "name")--->group by id,name

orderByAsc():排序:ORDER BY 字段, ... ASC

orderByAsc("id", "name")--->order by id ASC,name ASC

orderByDesc():排序:ORDER BY 字段, ... DESC

orderByDesc("id", "name")--->order by id DESC,name DESC

having():HAVING ( sql语句 

having("sum(age) > 10")--->having sum(age) > 10

二、Wrapper

        Wrapper在MyBatis-Plus中是用于构建动态SQL语句的重要工具之一。主要的子类有UpdateWrapper(实现更新操作)、QueryWrapper(实现查询操作)以及可以进行链式编程的AbstractLambdaWrapper,Wrapper的使用非常灵活,可以单独使用,也可以组合使用。

QueryWrapper

    @Test
    void queryWrapperTest(){
        QueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",5);
        long count = userService.count(wrapper);
        System.out.println(count);
    }

UpdateWrapper

    @Test
    void updateWrapperTest1(){
        User user = new User();
        user.setEmail("456");
        UpdateWrapper<User> wrapper = new UpdateWrapper<User>().eq("name","fulian");
        boolean update = userService.update(user, wrapper);
        System.out.println(update);
    }

三、使用Wrapper实现自定义SQL

        需要注意的是:需要mybatis-plus版本 >= 3.0.7 param 参数名要么叫ew,要么加上注解@Param(Constants.WRAPPER) 使用${ew.customSqlSegment} 不支持 Wrapper 内的entity生成where语句。

实例

MySQL数据库中表内容如下:

User实体类

@TableName(value ="user")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private Long id;

    private String name;

    private Integer age;

    private String email;

    private static final long serialVersionUID = 1L;
}

UserMapper接口

public interface UserMapper extends BaseMapper<User> {
    // 使用 QueryWrapper 自定义update
    void updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("email") String email);

    // 使用 LambdaQueryWrapper 自定义update
    void updateEmailByAges2(@Param(Constants.WRAPPER) LambdaQueryWrapper<User> wrapper, @Param("email")String email);

    // 使用 LambdaQueryWrapper 自定义select
    List<User> findUserInAges(@Param(Constants.WRAPPER)LambdaQueryWrapper<User> wrapper);
}

UserMapper.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.fulian.mybatispluslearning.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.fulian.mybatispluslearning.domain.User">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="age" column="age" jdbcType="INTEGER"/>
            <result property="email" column="email" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,name,age,
        email
    </sql>

    <update id="updateEmailByAges">
        update user
        set email = #{email}
        ${ew.customSqlSegment}
    </update>
    <update id="updateEmailByAges2">
        update user
        set email = concat(email , #{email})
        ${ew.customSqlSegment}
    </update>
    <select id="findUserInAges" resultType="com.fulian.mybatispluslearning.domain.User">
        select * from user ${ew.customSqlSegment}
    </select>
</mapper>

测试类

@SpringBootTest
class UserServiceTest {
    @Resource
    private UserService userService;

    @Resource
    private UserMapper userMapper;


    @Test
    void customSqlUpdateTest(){
        List<Integer> ages = Arrays.asList(10,55);
        String email = "789";

        // 使用 LambdaQueryWrapper 自定义select
        LambdaQueryWrapper<User> in = new LambdaQueryWrapper<User>().in(User::getAge, ages);
        List<User> userInAges = userMapper.findUserInAges(in);

        // 使用 QueryWrapper 自定义update
        QueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",ages);
        userMapper.updateEmailByAges1(wrapper,email);

        // 使用 LambdaQueryWrapper 自定义update
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getAge,ages);
        userMapper.updateEmailByAges2(wrapper,email);

    }

}

        总之,Wrapper是MyBatis-Plus中非常强大和灵活的工具之一,它提供了一种链式调用的方式,可以方便地构建复杂的查询条件和动态SQL语句。通过使用Wrapper,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。

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

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

相关文章

Pandas使用过程中的神器加持 你不用不要怪我

Pandas是我们日常处理表格数据最常用的包&#xff0c;但是对于数据分析来说&#xff0c;Pandas的DataFrame还不够直观&#xff0c;所以今天我们将介绍4个和Pandas相关的Python包&#xff0c;可以将Pandas的DataFrame转换交互式表格&#xff0c;让我们可以直接在上面进行数据分析…

mybatis-plus的用法。如果条件不为空则查询。返回结果类型转换

1.如果条件不为空则查询 偶尔看到这个代码。感觉大可不必 点击进入源码就会发现。 内部已经封装好了条件判断&#xff0c;可以说非常的人性化 而且改条件走的非常深 2.返回结果类型转换 page查询的时候&#xff0c;返回的结果只能是表对应的实体类。如果自定义扩展vo,dto需…

“城中村上建高楼”,开启一场数智化时代新修炼

“数字化也好&#xff0c;数智化也罢&#xff0c;你明明白白地告诉我&#xff0c;他们与信息化到底有什么区别&#xff1f;” “我在信息化方面已投入那么多&#xff0c;为什么又要投那么多钱搞数智化&#xff1f;” 中国软件网、海比研究院在《2024中国企业数智服务趋势洞察研…

Kubernetes(K8s)安全认证-10

安全认证 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#xff0c;客户端通常有两类&#xff1a; User Acco…

【AI-Fix】解决地图展示包leafmap在Jupyter NoteBook中地图不显示的问题

1. 问题描述 新创建的环境想使用leafmap在Jupyter中进行地图展示&#xff0c;结果发现运行完成之后不显示&#xff0c;不论怎么重启都没有办法显示出来&#xff0c;以经验来看&#xff0c;多半是缺了包了。 于是去leafmap的官方文档查找原因&#xff0c;一开始并没有发现什么问…

用OpenCV与MFC写一个图像格式转换及简单处理程序

打开不同格式的图形文件&#xff0c;彩色装灰度图像、锐化、高斯滤波、边界检测及将其存储为需求格式是图像处理的最基本的操作。如果单纯用MFC编程&#xff0c;是一个令人头痛的事情&#xff0c;有不少的代码量。可用OpenCV与MFC编程就变得相对简单。下面来详细演示这一编程操…

Altair推出 Altair RapidMiner 2023 平台,提供生成式 AI 功能

Altair推出 Altair RapidMiner 2023 平台&#xff0c;提供生成式 AI 功能 更新包括自动聚类、扩展 SAS、Python 和 R 编程功能等 近日&#xff0c;Altair&#xff08;纳斯达克股票代码&#xff1a;ALTR&#xff09;近日宣布其数据分析和 AI 平台 Altair RapidMiner 取得了一系…

Python文件打包成exe可执行文件

我们平常用python写些脚本可以方便我们的学习办公&#xff0c;但限制就是需要有python环境才能运行。 那能不能直接在没有python环境的电脑上运行我们的脚本呢&#xff1f; 当然可以&#xff0c;那就是直接把python脚本打包成exe可执行程序&#xff08;注针对win系统&#xf…

Linux之进程(一)

目录 一、概念 1、基本概念 2、描述进程的PCB 3、task_struct 二、查看进程 三、获取进程的PID和PPID 通过系统调用获取进程的PID和PPID 四、通过系统调用创建进程 1、fork函数创建子进程 2、用if进行分流 五、进程状态 1、操作系统进程状态 1、新建 2、运行 3、…

windows磁盘扩容

在我们为电脑加装一个新的硬盘之后&#xff0c;需要相应的操作才能将硬盘空间加到磁盘空间中。 1.打开磁盘管理器 windows系统可以选择在搜索中直接搜索计算机管理并将其打开 windows server的打开方式为服务器管理器→工具→计算机管理 打开计算机管理后就可以看到磁盘管理&…

【链表Linked List】力扣-234回文链表

目录 问题描述 解题过程 labuladong题解 问题描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff…

20、pytest中的参数化

官方实例 # content of test_expectation.pyimport pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),("6*9",42)]) def test_eval(test_input, expected):assert eval(test_input) expected# content of …

unsafe类和varhandle类讲解

Java的Unsafe类是一个非常特殊的类&#xff0c;它提供了一组原始、底层的操作&#xff0c;可以跳过Java的限制&#xff0c;直接操作内存和对象。这些操作可能会破坏Java的安全机制&#xff0c;所以Unsafe类被标记为不安全的。 Unsafe类提供了下列方法&#xff1a; allocateIns…

漏洞复现--云时空商业ERP文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

几个查找开源组件CVE的网站和工具

有时在使用一个开源组件之前&#xff0c;需要先调查一下这个组件是否有一些比较验证的CVE。同时&#xff0c;对于一些重要的正在使用的组件&#xff0c;例如&#xff1a;Spring Framework&#xff0c;也希望查询一下是否有严重的CVE。 本文就介绍几个曾经用过的查找开源组件还不…

抖店怎么对接达人带货?达人渠道整理,实操详解!

我是电商珠珠 很多人在抖店开通后&#xff0c;按照流程去正常的跑自然流量&#xff0c;再去找达人带货让自己店铺的流量增多&#xff0c;得到相应的曝光。 但是一些新手小白并不知道从哪去找达人&#xff0c;或者说不知道怎么去筛选达人。 一开始所有人都想着去找头部主播&a…

MySQL_1. mysql数据库介绍

shell脚本差不多快完结了接下来会为大家更新MySQL系列的相关的基础知识笔记&#xff0c;希望对大家有所帮助&#xff0c;好废话不多说&#xff0c;接下来开始正题&#xff01; 1.mysql数据库介绍 mysql 是一款安全、跨平台、高效的&#xff0c;并与 PHP、Java 等主流编程语言…

docker安装及使用(Linux版本)

文章目录 前言一、docker安装二、docker命令pull&#xff08;安装镜像&#xff09;images&#xff08;安装镜像&#xff09;run&#xff08;创建容器&#xff09;exec&#xff08;进入运行中的容器&#xff09;常用命令 总结如有启发&#xff0c;可点赞收藏哟~ 前言 https://do…

Jmeter测试移动接口性能 —— 压测

一般的公司都想知道自己产品的性能瓶颈和以及提升性能&#xff0c;以期大流量来了还撑得住。其实性能测试很难&#xff0c;难点在你不知道性能要达到怎样的需求。难点在于你没有实际的环境场景给你测试&#xff0c;总不能给线上环境你测试吧&#xff1f; 难点在于找性能瓶颈&a…

吐血整理,Web自动化测试-项目阶段性总结,一篇策底打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是web自动…