MyBatis的补充用法

news2024/12/23 20:46:32

说明:之前介绍过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一些补充用法

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

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

相关文章

(介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)

前言 本文详细介绍了如何利用物联网技术,通过NodeMCU ESP8266(ESP-12F)模块连接到新版的OneNet平台,使用MQTT协议实现数据的上传与指令的下发。文中首先对NodeMCU ESP8266模块及其特性进行了简介,随后详细阐述了如何配置和使用MQTT协议连接到OneNet平台,实现温湿度数据的…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

Java对象大小计算

概述 在实际应用中&#xff0c;尤其是在进行JVM调优时&#xff0c;理解并正确估计对象大小是非常重要的&#xff0c;因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。 对象的组成 在Java中&#xff0c;计算一个对象的大小是为了了解它在内存中占用的确切空间…

Leetcode2673. 使二叉树所有路径值相等的最小代价

Every day a Leetcode 题目来源&#xff1a;2673. 使二叉树所有路径值相等的最小代价 解法1&#xff1a;遍历 对于满二叉树&#xff0c;父节点 cost[i] 的左右儿子节点分别为 cost[2 * i - 1]、cost[2 * i]。 考虑根到两个互为兄弟节点&#xff08;父节点相同&#xff09;的…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

Navicat保存的连接密码破解-java代码

第一步&#xff1a;找到加过密的密码 有两种方法可以找到密码&#xff0c;一种是注册表里可以找到&#xff0c;一种是导出连接信息功能&#xff0c;这里说第二种。 1、打开Navicat&#xff0c;点击文件->导出连接菜单 2、导出要破解密码的连接到connections.ncx文件中&…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤&#xff1a; 服务器选购推荐&#xff1a;腾讯云轻量服务器 点击以下任一云产品链接&#xff0c;跳转后登录&#xff0c;自动享有所有云产品优惠权益&#xff1a; 经过笔者亲测&#xff0c;强烈推荐腾讯云轻量应用服务器作为游戏服…

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

11-orm-自研微服务框架

ORM 当开发涉及到存储数据的时候&#xff0c;往往要用到数据库&#xff0c;用的最多的就是mysql了&#xff0c;这里我们实现一个orm&#xff0c;让开发者更加便捷的操作数据库 1. Insert实现 orm的本质就是拼接sql&#xff0c;让开发者更加方便的使用 package ormimport ("…

物联网技术助力智慧城市安全建设:构建全方位、智能化的安全防护体系

一、引言 随着城市化进程的加速和信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发展的重要方向。在智慧城市建设中&#xff0c;安全是不可或缺的一环。物联网技术的快速发展为智慧城市安全建设提供了有力支持&#xff0c;通过构建全方位、智能化的安全防护体系&#…

百度百科人物创建要求是什么?

百度百科作为我国最大的中文百科全书&#xff0c;其收录的人物词条要求严谨、客观、有权威性。那么&#xff0c;如何撰写一篇高质量的人物词条呢&#xff1f;本文伯乐网络传媒将从内容要求、注意事项以及创建流程与步骤三个方面进行详细介绍。 一、内容要求 1. 基本信息&#…

spring-boot-starter-parent和spring-boot-dependencies介绍

springboot项目的pom文件中&#xff0c;我们经常看见这样(下图)两种springboot的版本依赖管理方式&#xff1b;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…

UnityShader——09数学知识3

方阵 行与列数量相等的矩阵,n*n阶矩阵 对角矩阵 当对角线以外的矩阵内元素全为0&#xff0c;则称之为对角矩阵&#xff0c;对角矩阵的前提是必须是方阵 单位矩阵 对角线元素全为1&#xff0c;其余元素全为0&#xff0c;属于对角矩阵的一部分 矩阵和向量 把1 * n阶矩阵称…

C++设计模式_创建型模式_工厂方法模式

目录 C设计模式_创建型模式_工厂方法模式 一、简单工厂模式 1.1 简单工厂模式引入 1.2 简单工厂模式 1.3 简单工厂模式利弊分析 1.4 简单工厂模式的UML图 二、工厂方法模式 2.1 工厂模式和简单工厂模式比较 2.2 工厂模式代码实现 2.3 工厂模式UML 三、抽象工厂模式 3.1 战斗场景…

实现定时器的两种方法:使用windows api定时器 和使用c++11/14 定时器

前言&#xff1a; 当我有一个开发需求&#xff0c;符合下面的条件 1.需要某个任务在程序中每隔一段时间就要执行一次&#xff0c;可能把这个任务封装成了一个函数。 2.这种需要定时执行的任务&#xff0c;有2个&#xff0c;3个....越来越多。 这个时候我们就可以考虑使用定时…

laravel ApiResponse接口统一响应封装

一&#xff0c;新增接口返回码配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

我做的app上架应用市场一天,快破400下载量,0差评

上集说到&#xff0c;我做了一个叫QB音乐的安卓app&#xff0c;经过一段时间的自我使用与测试终于算发布了。我昨天顺便把它上架了奇妙应用市场&#xff0c;截止目前3月1号过去了一天&#xff0c;下载量快到400&#xff0c;0差评。看来还是能正常使用的。 一、为什么做这个ap…

ABAP - SALV教程 01- 开篇:打开SALV的三种方式之一

关于SALV&#xff0c;这里参考巨佬江正军的文章讲解&#xff0c;在做SAP开发的遇到困难和瓶颈的时候&#xff0c;每每读到巨佬的文章都会灵感爆发、醍醐灌顶。https://www.cnblogs.com/jiangzhengjun/p/4291387.html 博主由于是由JAVA转型的ABAP开发&#xff0c;刚接触ABAP的时…

Python爬虫——Urllib库-2

编解码 问题引入 例如&#xff1a; https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串乱码就是章若楠 如果这里是写的章若楠就会 产生这样的错误 所以我们就可以使用get请求方式的quote方法了 get请求方式的q…

YOLOv9:使用可编程梯度信息学习您想学习的内容

摘要 arxiv.org/pdf/2402.13616.pdf 当今的深度学习方法侧重于如何设计最合适的目标函数,以便模型的预测结果能最接近于实际结果。同时,还必须设计一个适当的架构,以便于获取足够的预测信息。现有的方法忽略了一个事实,即当输入数据经历层层特征提取和空间变换时,会损失…