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_userwhere 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.mzph.cn/news/713806.shtml

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

相关文章

php httpfs链接hdfs

一.代码&#xff08;有bug&#xff09; GitHub - michaelbutler/php-WebHDFS: A PHP client for WebHDFS 二.调用代码 1.代码1.代码 require_once(../webhdfs/src/org/apache/hadoop/WebHDFS.php);require_once(../webhdfs/src/org/apache/hadoop/tools/Curl.php); require_o…

什么是人才储备?如何做人才储备?

很多小伙伴都会有企业面试被拒的情况&#xff0c;然后HR会告诉你&#xff0c;虽然没有录用你&#xff0c;但是你进入了他们的人才储备库&#xff0c;那么这个储备库有什么作用和特点呢&#xff1f;我们如何应用人才测评系统完善人才储备库呢&#xff1f; 人才储备一般有以下三…

Python打发无聊时光:12.用PyQt实现简易的心电起搏器界面

第一步&#xff1a;装PyQt库 pip install PyQt5 第二步&#xff1a;复制代码 import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout,QWidget, QLabel, QProgressBar, QSlider, QLineEdit, QHBoxLayout) from PyQt5.QtCore import …

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

目录 软件分层 介绍 举例 类的继承 虚拟文件系统 线程接口封装 虚拟地址空间 总结 为什么是层状的 软件分层 网络协议 原因 梳理协议顺序 相连节点 协议分层 引入 示例 实际上 逻辑上 制定出协议 软件分层 介绍 通过将软件系统划分为不同的层次,每一层都有…

uniApp 调整小程序 单个/全部界面横屏展示效果

我们打开uni项目 小程序端运行 默认是竖着的一个效果 我们打开项目的 pages.json 给需要横屏的界面 的 style 属性 加上 "mp-weixin": {"pageOrientation": "landscape" }界面就横屏了 如果是要所有界面都横屏的话 就直接在pages.json 的 gl…

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度&#xff0c;常用于增加或减少颜色的饱和度。 快捷键&#xff1a;O 在特别的灰度图像上&#xff0c;则可用于调整对比度&#xff0c;这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

源码解析篇 | YOLOv8官方源码项目目录结构解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv8是一种目标检测算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的第8个版本。YOLOv8相比于之前的版本&#xff0c;在检测精度和速度上都有所提升&#xff0c;它在各种场景下都表现出色…

Git源码管理

参考视频&#xff1a;16-git的日志以及版本管理_哔哩哔哩_bilibili 参考博客&#xff1a;Git && Docker 学习笔记-CSDN博客 目录 简介 个人操作初始化 初始化git目录 查看生成的git目录文件 配置git工作目录的用户信息 查看工作区的状态&#xff0c;生成文件的…

C++面试干货---带你梳理常考的面试题(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 1.C和C的区别 1.语法和特性&#xff1a;C是一种过程式编程语言&#xff0c;而C是一种面向对象编程语言。C在C的基础上增加…

Java智慧云HIS医院信息化系统源码 更具灵活性、扩展性

目录 什么是云HIS 趋势与转变 HIS上云后有哪些好处 解决方案 云HIS组成 1、门诊挂号 2、住院管理 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 什么是云HIS 云HIS是一种基于云计算技术的医院信息管理系统。云HIS可以帮助医院管理各类医院信息&a…

Linux系统中安装redis+redis后台启动+常见相关配置

1、下载Redis Redis官网&#xff1a;https://redis.io/ 历史版本&#xff1a; http://download.redis.io/releases 2、连接Linux&#xff08;或者VMwear&#xff09; 我们安装的是linux版本的redis 打开xftp我们需要先将我们的Redis上传到服务器上 解压到这里 解压的指令 …

Spring MVC源码中设计模式——适配器模式

适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 应用场景&#xff1a; 1、系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要…

[c++] 继承和多态整理一

1 private 和 protected 继承&#xff0c;子类指针不能赋值给父类指针 如下代码&#xff0c;有一个基类 Base&#xff0c;Derived1&#xff0c;Derived2&#xff0c;Derived3 3 个子类继承了基类 Base&#xff0c;分别是 private 继承&#xff0c;protected 继承&#xff0c;p…

基于springboot+vue的纺织品企业财务管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Socket网络编程(五)——TCP数据发送与接收并行

目录 主要实现需求TCP 服务端收发并行重构启动main方法重构重构分离收发消息的操作重构接收消息的操作重构发送消息TCPServer调用发送消息的逻辑监听客户端链接逻辑重构Socket、流的退出与关闭 TCP 客户端收发并行重构客户端 main函数重构客户端接收消息重构客户端发送消息重构…

Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录 概述安装LinuxWindows 配置参数集群参考配置文件配置步骤流程启动 概述 Zookeeper&#xff1a; 为分布式框架组件提供协调服务的中间件 【类似&#xff1a;文件系统通知机制】 负责存储上下层应用关系的数据以及接收观察者注册监听&#xff0c;一旦观察查关心的数据发…

笔记73:ROS中的各种消息包

参考视频&#xff1a; 33.ROS 的标准消息包 std_msgs_哔哩哔哩_bilibili 34. ROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs_哔哩哔哩_bilibili 标准消息包&#xff1a;std_msgs常用消息包&#xff1a;common_msgs导航消息包&#xff1a;nav_msgs几何消息包&#xf…

实战分享:Tomcat打破双亲委派模型,实现Web应用独立与安全隔离的奥秘

目录 一、JVM 类加载机制 二、Tomcat 类加载器 2.2 findClass 介绍 3.2 loadClass 介绍 三、web应用隔离 3.1 Spring 加载问题 在开始文章内容之前&#xff0c;先来看三个问题 假如在 Tomcat 上运行了两个 Web 应用程序&#xff0c;两个 web 应用中有同名的Servlet&#xf…

C++数据结构与算法——二叉树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

AGI概念与实现

AGI AGI&#xff08;Artificial General Intelligence&#xff09;&#xff0c;中文名为“通用人工智能”或“强人工智能”&#xff0c;是指通过机器学习和数据分析等技术&#xff0c;使计算机具有类似于人类的认知和学习能力的技术. 多模态的大模型 &#xff08;Multimodal…