MyBatis的补充用法

说明:之前介绍过MyBatis的用法,像 用注解和Mapper.xml操作数据库、在Mapper.xml里写动态SQL。最近在一次用MyBatis批量更新数据库对象的场景中,意识到对MyBatis的一些标签用法不太熟悉,所以去 MyBatis官网 看了一些文档,基于此,本文介绍一些可能会用到的MyBatis用法。

$ 占位符

通常我们会使用#{}表示占位符,即该位置的值使用传递的参数,在运行SQL拼接时,会用 ?占位,在执行SQL的时候才会将我们的参数替换执行,不会有SQL注入的风险。如下:

(controller层)

    /**
     * 查询用户
     * @param id
     * @return
     */
    @GetMapping("/getUser/{id}")
    public String getUser(@PathVariable("id") String id){
        return userMapper.getUser(id).toString();
    }

(mapper层)

    @Select("select * from user where id = #{id}")
    User getUser(String id);

控制台打印的执行日志:

在这里插入图片描述

换成 ${}再看下:

    @Select("select * from tb_user where id = ${id}")
    User getUser(String id);

查看控制台可以看到,执行过程是直接将参数进行拼接的;

在这里插入图片描述

这么说,那还需要这个干什么,直接用#{}不就行了。我在查看官网文档时,文档提到了一个用法,可以动态查询数据库表中的某列字段,如下:

    @Select("select ${field} from tb_user where id = #{id}")
    User getUser(String field, String id);

field表示User表中的任意字段,该接口的作用就是根据ID查询User表中的任意字段值,该字段可用前端、或者Service层判断后传入;

(field传username,表示根据ID查询username)

在这里插入图片描述

(field传password,表示根据ID查询password)

在这里插入图片描述

另外,如果可以你还可以在 order by 后面方放一个 ${sortField}(根据某字段排序),让结果集的排序可根据前端或者Service层来动态的控制,非常灵活。这也算是$ 占位符的一抹光辉。

使用上的注意事项,官网中有一段说明,如下:

在这里插入图片描述

script 标签

我们都知道,使用Mabatis框架操作数据库有两种方式,一种是在Mapper中的接口上写注解,注解里写SQL语句,就像上面那样;一种是在对应的Mapper.xml中写SQL,关联到具体的Mapper接口,如下:

(namespace里写Mapper的全限定类名,mapper标签里面写对应类里的接口,id为方法名,resultType为结果集封装的对象的全限定类名)

<mapper namespace="com.hezy.mapper.UserMapper">
    <select id="getUser" resultType="com.hezy.pojo.User">
        select *
        from tb_user
        where id = #{id}
    </select>
</mapper>

关于这两种方式该怎么选择,官网中也有一段非常优雅的描述,如下:

在这里插入图片描述

script标签 的作用,就是把Mapper.xml中的动态SQL写在注解里,如下,根据ID更新数据,在Mapper.xml我们是这么写的。

    <update id="updateUserById">
        update tb_user
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
        </set>
        where id = #{id}
    </update>

如果你不想写在Mapper.xml里面(虽然不知道你为什么不想),就可以使用 script标签 我们可以把它写在注解里,如下:

    @Update("<script>" +
            "update tb_user " +
            "<set>" +
            "<if test='username != null'>username = #{username},</if>" +
            "<if test='password != null'>password = #{password}</if>" +
            "where id = #{id}" +
            "</set>" +
            "</script>")
    void updateUserById(User user);

虽然有点麻烦,我调试了一会儿,但效果是一样

trim 标签

在介绍trim标签前,先介绍我们经常会用到的两个标签:<set>标签 和 <where>标签

<set>标签 在更新数据时使用,如下:

    <update id="updateUserById">
        update tb_user
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
        </set>
        where id = #{id}
    </update>

它的作用是可以在拼接SQL时,删掉多于的逗号(,),比如上面这段动态SQL,当password值不为空时,拼接出来的SQL是下面这样的:

update tb_user set username = 'zhangsan_fix', password = '123456_fix', where id = '1'

执行会报错;

在这里插入图片描述


<where>标签 在复杂的条件查询时使用,如下:

    <select id="queryUser" resultType="com.hezy.pojo.User">
        select * from tb_user
        <where>
            <if test="id != null and id != ''">
                and id = #{id}
            </if>
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="password != null and password != ''">
                and password = #{password}
            </if>
        </where>
    </select>

它的作用是可以在拼接SQL时,删掉多于的 and 或者 or,像上面的动态SQL,如果id不为空,就会在where 后面拼接一个莫名其妙的and,这样的SQL同样是执行不成功的。


trim 标签的作用是,可以自定义选择在哪个关键字附近添加或删减什么字符。trim 标签属性如下:

  • prefix:前面拼接的内容;

  • suffix:后面拼接的内容;

  • prefixOverrides:去除的前缀内容;

  • suffixOverrides:去除的后缀内容

trim 标签可以起到<set>标签 和 <where>标签相同的作用,如下:

(trim标签里面的语句,前面加个 set,末尾多于的逗号去掉,等同于 <set>标签

    <update id="updateUserById">
        update tb_user
        <trim prefix="set" suffixOverrides=",">
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
        </trim>
        where id = #{id}
    </update>

控制台打印的日志信息

在这里插入图片描述

(trim标签里面的语句,前面加个 where,去掉前面多于的and 或者 or ,等同于 <where>标签

    <select id="queryUser" resultType="com.hezy.pojo.User">
        select * from tb_user
        <trim prefix="where" prefixOverrides="and |or ">
            <if test="id != null and id != ''">
                and id = #{id}
            </if>
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="password != null and password != ''">
                and password = #{password}
            </if>
        </trim>
    </select>

控制台打印的日志信息

在这里插入图片描述

官网中有说明,and |or 这里的空格是必要的,但我去掉之后执行时没有问题的,或许是考虑在一些特殊的场景没有空格是会有问题的。我想不到,有读者想得到请告诉我(do ze)。

在这里插入图片描述

总结

本文介绍了MyBatis一些补充用法

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

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

相关文章

综合交易模型----可转债双低策略自动轮动实盘,提供源代码

原理 量化研究---可转债双低策略原理 文章链接 综合交易模型----可转债双低策略自动轮动实盘&#xff0c;提供源代码 (qq.com) 就是按照值来轮动&#xff0c;轮动规则 规则 "策略轮动设置":"策略轮动设置************************,轮动都按排名来", &…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

web服务器nginx下载及在win11的安装

一.背景 还是为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11 家庭版 mginx版本&#xff1a;1.24.0 二.nginx版本选择与下载 我之前也写过下载nginx下载_ngnix stable 下载-CSDN博客 不想看寻找过程的&#xff0c;直接点这里去下载https://nginx.org/download…

好的测试数据管理,到底要怎么做?

你的组织是否实施了测试数据管理&#xff1f;如果你的组织处理关键或敏感的业务数据&#xff0c;测试数据管理肯定会让组织受益。与测试数据相关的问题占所有软件缺陷的 15%&#xff0c;这一事实强调了测试数据的重要性。本文将准确讨论测试数据经理职责、测试数据经理需要什么…

仿牛客网项目---帖子详情功能的实现

这篇文章主要讲讲帖子详情功能。其实帖子详情功能简单来说就是你点进去可以看到文章&#xff0c;这就叫帖子详情功能。那接下来我讲讲我的这个项目是如何实现这个功能的。 首先写DAO层。 Mapper public interface DiscussPostMapper {List<DiscussPost> selectDiscussPo…

寒假作业Day 02

这是第二天的作业&#xff0c;fighting&#xff01; Day 02 一、选择题 首先char* s[6]是指针数组&#xff0c;也就是其存储的都是这些字符串的地址&#xff0c;其实际上的类型为char**&#xff0c;而fun函数传入了s数组的首地址。而后续fun函数中打印字符&#xff0c;p[i]即…

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …

Java基于SpringBoot的企业客户管理系统的设计与实现论文

摘 要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述企业客户管理系统的当前背景以及系统开发的…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况&#xff0c;并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS&#xff0c;那么 Executor 计算完后&a…

MySQL 表的基本操作,结合项目的表自动初始化来讲

有了数据库以后&#xff0c;我们就可以在数据库中对表进行增删改查了&#xff0c;这也就意味着&#xff0c;一名真正的 CRUD Boy 即将到来&#xff08;&#x1f601;&#xff09;。 查表 查看当前数据库中所有的表&#xff0c;使用 show tables; 命令 由于当前数据库中还没有…

多层感知器(神经网络)与激活函数

单个神经元&#xff08;二分类&#xff09; 多个神经元&#xff08;多分类&#xff09; 多层感知器 多层感知器&#xff0c;他是一种深度学习模型&#xff0c;通过多层神经元的连接和激活来解决非线性问题。 激活函数 激活函数的种类包括relu&#xff0c;sigmoid和tanh等 …

torch的下载

cmd中输入 nvidia-smi 查看cuda版本&#xff0c;我这里是12.3 然后进入pytorch官网&#xff1a;PyTorch 直接本页面往下滑就能看到 选择与自己cuda版本相近的。 复制命令&#xff1a; pip3 install torch torchvision torchaudio --index-url https://download.pytorch.…

搭建stressapptest调试环境:VSCode的分步教程

vscode调试stressapptest详解 一、环境准备二、设置调试配置2.1、编辑launch.json文件和task.json文件2.2、将 stressapptest 编译成 debug 版本 三、运行调试总结 一、环境准备 stressapptest&#xff08;简称SAT&#xff09;是一种用于在Linux系统上测试系统稳定性和可靠性的…

【MySQL】:高效利用MySQL函数实用指南

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL函数概论二. 字符串函数三. 数值函数四. 日期函数五. 流程函数&#x1…

MySQL:合并查询语句

1、查询表的数据 t_book表数据 SELECT * FROM db_book.t_book; t_booktype表数据 SELECT * FROM db_book.t_booktype; 提醒&#xff1a; 下面的查询操作的数据来自上图查询表的数据 2. 使用 UNION 查询结果合并&#xff0c;会去掉重复的数据 使用UNION关键字是&#xff0c;数…

Angular 由一个bug说起之四:jsonEditor使用不当造成的bug

一&#xff1a;问题 项目中使用了一个JSON第三方库&#xff1a; GitHub - josdejong/jsoneditor: A web-based tool to view, edit, format, and validate JSON 当用户编辑JSON格式的数据&#xff0c;查找替换时&#xff1a; 用户的期望结果是&#xff1a;$$ 被替换为$$_text&a…

centos7 部署harbor镜像仓库

1. 安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum list docker-ce.x86_64 --showduplicates |sort -r yum install docker-ce-17.09.1.ce -y syste…

分布式事务简介

分布式事务简介&#xff0c;通过组内分享学习到的知识&#xff0c;并进行讨论。 主要内容 分布式事务简介 分布式事务是指跨越多个数据库或服务的一系列操作&#xff0c;这些数据库或服务可能分布在网络的不同节点上&#xff0c;它们共同组成一个完整的逻辑工作单元&#xf…

用Python库angr来分析二进制文件

最近在学习二进制分析&#xff0c;了解到二进制加载器&#xff0c;于是跟着AI一起&#xff0c;学习了这个python可用的二进制加载器分析器angr,并写了这篇介绍的文章&#xff0c;儿童卡通风格&#xff0c;哈哈。 亲爱的代码侠客们&#xff0c;今天我们要一起踏上探索二进制文件…

CloudCanal x Hive 构建高效的实时数仓

简述 CloudCanal 最近对于全周期数据流动进行了初步探索&#xff0c;打通了Hive 目标端的实时同步&#xff0c;为实时数仓的构建提供了支持&#xff0c;这篇文章简要做下分享。 基于临时表的增量合并方式基于 HDFS 文件写入方式临时表统一 Schema任务级的临时表 基于临时表的…