当前位置: 首页 > news >正文

Mybatis之动态SQL

动态sql是Mybatis的强大功能之一,能够完成不同条件下不同的sql拼接。

标签

如图是gitee上创建仓库的页面:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
可以分为两种字段,必填字段和非必填字段,在创建仓库时无法确定用户是否会传入”仓库介绍“字段,如果用户不填写,那么前端传过来的就是Null, 在sql中""和null是不相等的,因此需要使用标签来判断。

语法格式:


  • 中的test会产生一个boolean类型的结果,如果为true,那么执行if标签的内容;如果为false,那么不执行if里面的内容。
  • test中的参数,是传入对象的属性,不是数据库字段

咱们这里使用的数据表和前几篇一致,为articleinfo和userinfo表
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
需求:在用户注册环节,photo字段非必填。

photo字段可以标签,当photo字段不为空,则添加;为空就不添加。并且要注意 , 放的位置,不能跟着password后面,因为如果photo字段为空,就会造成sql语法错误

int addUser(Userinfo userinfo);
<insert id="addUser">insert into userinfo (username, password<if test="photo!=null">, photo</if>)values (#{username}, #{password}<if test="photo!=null">, #{photo}</if>)
</insert>
@Test
void addUser() {Userinfo userinfo = new Userinfo();userinfo.setUsername("张三");userinfo.setPassword("2345");userinfo.setPhoto(null); //在sql中”“不等于NulluserMapper.addUser(userinfo);System.out.println(userinfo);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标签

在用户注册的时候,只有一个photo字段是非必填项,如果所有字段都是非必填项,可以考虑使用标签结合标签,对多个字段都采取动态生成的方式。
标签中有如下属性:

  • prefix: 表示整个语句块,以prefix的值作为前缀
  • suffix: 表示整个语句块,以suffix为值作为后缀
  • prefixOverrides: 表示整个语句块要去除掉的前缀
  • suffixOverrides: 表示整个语句块要去除掉的后缀
int addUser2(Userinfo userinfo);
<insert id="addUser2" useGeneratedKeys="true" keyColumn="id">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if><if test="password != null">password,</if><if test="photo != null">photo,</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="photo != null">#{photo},</if></trim>
</insert>
@Test
void addUser2() {Userinfo userinfo = new Userinfo();userinfo.setUsername("王五");userinfo.setPassword("45667");userinfo.setPhoto(null);userMapper.addUser2(userinfo);System.out.println(userinfo);
}

image.png
在上面的sql动态解析时,会将第一个做如下处理:

  1. 基于prefix,开始部分加上(
  2. 基于suffix,结束部分加上)
  3. 多个组织的语句都以,结尾,在最后拼接好的字符串是以,结尾,会基于suffixOverrides去掉最后一个,

标签

顾名思义和mysql中的where作用一样,都是用来条件查询。

需求:跟据前端提供的用户名和密码(都是非必传的参数)查询用户信息

List<Userinfo> selectByParam(@Param("username") String username,@Param("password") String password);
<select id="selectByParam" resultType="com.example.demo.entity.Userinfo">select * from userinfo<where><if test="username != null">username = #{username}</if><if test="password != null">and password = #{password}</if></where>
</select>
@Test
void selectByParam() {List<Userinfo> list = userMapper.selectByParam(null, "admin");System.out.println(list);
}

image.png

  • where标签通常需要配合if标签一起使用
  • where标签会删除最前面的and关键字(所以上面的例子中就把password前面的and关键字去除)
  • where标签如果里面没有内容,那么他不会生成where sql语句

标签

顾名思义和mysql的set作用一样,都是用来更新数据。

需求:前端传递Userinfo给后端(部分属性是非必填),请根据id修改用户信息

int update(Userinfo userinfo);
<update id="update">update userinfo<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="photo != null">photo = #{photo}</if></set>where id = #{id}
</update>
@Test
void update() {Userinfo userinfo = new Userinfo();userinfo.setUsername("张三");userinfo.setPassword(null);userinfo.setPhoto("bbb.png");userinfo.setId(1);userMapper.update(userinfo);System.out.println(userinfo);
}

image.png

  • set标签通常配合 if 标签一起使用
  • set标签会自动去除最后一个逗号

标签

顾名思义用来循环遍历的,标签有如下属性:

  • collection: 绑定方法参数中的集合,如List,Set,Map
  • item: 遍历时的对象
  • open:语句块开头的字符串
  • close: 语句块结束的字符串
  • separator: 每次遍历之间间隔的字符串

需求:根据多个文章id删除文章数据

int dels(List<Integer> list);
<delete id="dels">delete from userinfowhere id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach>
</delete>
@Test
void dels() {List<Integer> list = new ArrayList<>();list.add(1);list.add(3);int dels = userMapper.dels(list);Assertions.assertEquals(2, dels);
}

image.png

相关文章:

  • 基于SSM的医院交互系统的设计与实现
  • Oracle官网 账号及密码 -- 笔记
  • 测试新手百科:Postman简介、安装、入门使用方法详细攻略!
  • Hadoop3.x完全分布式环境搭建Zookeeper和Hbase
  • 工作中常用的RabbitMQ实践
  • GPT-4 变懒了?官方回复
  • Linux 网络协议
  • 秋招春招,我没有拿到一个offer怎么办?
  • 关于IDEA中maven的作用以及如何配置MAVEN
  • springboot(ssm滁州市特产销售系统 特产商城系统Java系统
  • SQLMap介绍
  • 低多边形3D建模石头材质纹理贴图
  • 【微服务】springboot整合quartz使用详解
  • 无人零售店,凭借黑科技引领,它的前景如何?
  • GDPU 数据结构 天码行空13
  • 网络传输文件的问题
  • 时间复杂度分析经典问题——最大子序列和
  • JavaScript HTML DOM
  • jQuery(一)
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Spring声明式事务管理之一:五大属性分析
  • 电商搜索引擎的架构设计和性能优化
  • - 概述 - 《设计模式(极简c++版)》
  • 经典排序算法及其 Java 实现
  • 如何解决微信端直接跳WAP端
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 软件开发学习的5大技巧,你知道吗?
  • 想写好前端,先练好内功
  • 用Visual Studio开发以太坊智能合约
  • 中文输入法与React文本输入框的问题与解决方案
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ‌移动管家手机智能控制汽车系统
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (11)MATLAB PCA+SVM 人脸识别
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (9)目标检测_SSD的原理
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第30天)二叉树阶段总结
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (回溯) LeetCode 40. 组合总和II
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)visual stdio 书签功能介绍
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .net连接oracle数据库
  • .Net语言中的StringBuilder:入门到精通
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [c#基础]DataTable的Select方法