Mybatis的动态sql详解,区别于传统的sql拼写

STM32 无线充电接收端硬件设计:从 LC 谐振到 PWM 控制的 5 大关键电路解析 本文深入解析了基于STM32的无线充电接收端硬件设计,重点探讨了LC谐振倍压整流、INA282电流采样、IR2104S半桥驱动、超级电容保护及STM32最小系统等5大关键电路。针对超级电容的恒功率充电需求,详细介绍了PID控制算法优化及PCB设计实战要点,帮助工程师提升无线充电系统的效率和可靠性。 阅读详情

刚用到新框架的时候,总是要熟悉新框架的一些事情

比如Mybatis的动态sql就和之前的那些拼写sql不同,下面根据网上看的来总结一下:

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。

MyBatis中用于实现动态SQL的元素主要有:

 

  • if
  • choose(when,otherwise)
  • trim
  • where
  • set
  • foreach
if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。先来看如下一个例子:
Xml代码   收藏代码
  1. <select id="dynamicIfTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog where 11 = 1  
  3.     <if test="title != null">  
  4.         and title = #{title}  
  5.     </if>  
  6.     <if test="content != null">  
  7.         and content = #{content}  
  8.     </if>  
  9.     <if test="owner != null">  
  10.         and owner = #{owner}  
  11.     </if>  
  12. </select>  
这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用JDBC的时候, 如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。

choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的,通常都是与when和otherwise搭配的。看如下一个例子:
Xml代码   收藏代码
  1. <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog where 11 = 1   
  3.     <choose>  
  4.         <when test="title != null">  
  5.             and title = #{title}  
  6.         </when>  
  7.         <when test="content != null">  
  8.             and content = #{content}  
  9.         </when>  
  10.         <otherwise>  
  11.             and owner = "owner1"  
  12.         </otherwise>  
  13.     </choose>  
  14. </select>  
when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出otherwise中的内容。所以上述语句的意思非常简单, 当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满足的时候就输出otherwise中的内容。

where语句的作用主要是简化SQL语句中where中的条件判断的,先看一个例子,再解释一下where的好处。
Xml代码   收藏代码
  1. <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog   
  3.     <where>  
  4.         <if test="title != null">  
  5.             title = #{title}  
  6.         </if>  
  7.         <if test="content != null">  
  8.             and content = #{content}  
  9.         </if>  
  10.         <if test="owner != null">  
  11.             and owner = #{owner}  
  12.         </if>  
  13.     </where>  
  14. </select>  
 where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能,示例代码如下:
Xml代码   收藏代码
  1. <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog   
  3.     <trim prefix="where" prefixOverrides="and |or">  
  4.         <if test="title != null">  
  5.             title = #{title}  
  6.         </if>  
  7.         <if test="content != null">  
  8.             and content = #{content}  
  9.         </if>  
  10.         <if test="owner != null">  
  11.             or owner = #{owner}  
  12.         </if>  
  13.     </trim>  
  14. </select>  
 
set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。下面是一段示例代码:
Xml代码   收藏代码
  1. <update id="dynamicSetTest" parameterType="Blog">  
  2.     update t_blog  
  3.     <set>  
  4.         <if test="title != null">  
  5.             title = #{title},  
  6.         </if>  
  7.         <if test="content != null">  
  8.             content = #{content},  
  9.         </if>  
  10.         <if test="owner != null">  
  11.             owner = #{owner}  
  12.         </if>  
  13.     </set>  
  14.     where id = #{id}  
  15. </update>  
 上述示例代码中,如果set中一个条件都不满足,即set中包含的内容为空的时候就会报错。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
Xml代码   收藏代码
  1. <select id="dynamicForeachTest" resultType="Blog">  
  2.     select * from t_blog where id in  
  3.     <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}  
  5.     </foreach>  
  6. </select>  
 上述collection的值为list,对应的Mapper是这样的
Java代码   收藏代码
  1. public List<Blog> dynamicForeachTest(List<Integer> ids);  
 测试代码:
Java代码   收藏代码
  1. @Test  
  2. public void dynamicForeachTest() {  
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();  
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);  
  5.     List<Integer> ids = new ArrayList<Integer>();  
  6.     ids.add(1);  
  7.     ids.add(3);  
  8.     ids.add(6);  
  9.     List<Blog> blogs = blogMapper.dynamicForeachTest(ids);  
  10.     for (Blog blog : blogs)  
  11.         System.out.println(blog);  
  12.     session.close();  
  13. }  
 
2.单参数array数组的类型:
Xml代码   收藏代码
  1. <select id="dynamicForeach2Test" resultType="Blog">  
  2.     select * from t_blog where id in  
  3.     <foreach collection="array" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}  
  5.     </foreach>  
  6. </select>  
 上述collection为array,对应的Mapper代码:
Java代码   收藏代码
  1. public List<Blog> dynamicForeach2Test(int[] ids);  
 对应的测试代码:
Java代码   收藏代码
  1. @Test  
  2. public void dynamicForeach2Test() {  
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();  
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);  
  5.     int[] ids = new int[] {1,3,6,9};  
  6.     List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);  
  7.     for (Blog blog : blogs)  
  8.         System.out.println(blog);  
  9.     session.close();  
  10. }  
 
3.自己把参数封装成Map的类型
Xml代码   收藏代码
  1. <select id="dynamicForeach3Test" resultType="Blog">  
  2.     select * from t_blog where title like "%"#{title}"%" and id in  
  3.     <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}  
  5.     </foreach>  
  6. </select>  
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
Java代码   收藏代码
  1. public List<Blog> dynamicForeach3Test(Map<String, Object> params);  
  对应测试代码:
Java代码   收藏代码
  1. @Test  
  2. public void dynamicForeach3Test() {  
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();  
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);  
  5.     final List<Integer> ids = new ArrayList<Integer>();  
  6.     ids.add(1);  
  7.     ids.add(2);  
  8.     ids.add(3);  
  9.     ids.add(6);  
  10.     ids.add(7);  
  11.     ids.add(9);  
  12.     Map<String, Object> params = new HashMap<String, Object>();  
  13.     params.put("ids", ids);  
  14.     params.put("title", "中国");  
  15.     List<Blog> blogs = blogMapper.dynamicForeach3Test(params);  
  16.     for (Blog blog : blogs)  
  17.         System.out.println(blog);  
  18.     session.close();  
  19. }  
 来源博客 : http://haohaoxuexi.iteye.com/blog/1333271

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python) 阅读详情

相关推荐

从零开始玩转机械臂:用Matlab+Robotics Toolbox实现四自由度机械臂运动仿真

本文详细介绍了如何利用Matlab及其Robotics Toolbox工具箱,从零开始构建并仿真一个四自由度机械臂。通过D-H参数建模、正向运动学验证、交互式操控以及轨迹规划等实践步骤,帮助初学者在虚拟环境中直观理解机器人运动学核心概念,为后续硬件实现奠定坚实基础。

weixin_29055699的博客 325

mybatis if条件判断

一、字符串(string)非空判断 <if test="name!=null and name!=''"> AND name = #{name} </if> 二、集合(list)非空判断 <if test="list!=null and list.size()!=0"> AND THIRD_DPT IN <foreach collection="list" item="item" open="(" separator=...

JacaCao的博客 6577

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1617

Mybatis学习

MyBatis 是一个支持自定义SQL存储过程以及高级映射的持久层框架。MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO映射成数据库中的记录。sql语句可以进行灵活的修改,在使用JDBC的时候,sql语句和java代码是融合在一起,mybatis是将sql语句和java代码分开来,sql代码写xml文件里,此时sql语句的修改会非常方便。

trh_csdn的博客 3406

【SEED Labs 2.0】V*N Tunneling Lab

本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。本实验工作量较大,但难度不大,重点在于搞清是谁发给谁,走的什么路径。另外,本次实验由于网络中的设备较多,修改了环境变量方便分清哪个窗口是哪个设备。这样操作起来就方便多了。...

Chenyang的博客 6981

Ollama-OCR实战:5分钟搞定PDF文档转Markdown(附qwen2.5vl模型配置)

本文详细介绍了如何利用Ollama本地部署多模态大模型qwen2.5vl,结合OCR技术,实现PDF文档到Markdown的端到端智能转换。通过解析传统OCR的局限与AI方案的优势,并提供从环境搭建、提示词工程到处理复杂表格的完整实战指南,帮助用户高效构建自动化文档处理流水线,彻底重塑文档处理工作流。

yog99的博客 606

mybatis常用判断语法(标签)

作为java开发,我们常用的判断有if、switch语句,其实在MyBatis中也有对应的标签,用于动态生成sql语句。 1. if判断 <where> <if test="null != statusCode and 0 != statusCode"> AND b.STATUS_CODE = #{statusCode, jdbcType=VARCHAR} </if> </where> 一般来说,很多程序猿朋友会在&lt

aw277866304的博客 9227

Dify智能体开发:Dify文件上传

相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。

王国平的博客 2591

Mybatis <if>标签不起作用案列

1. 在传过来的参数不为-1时,我的判断起作用了,但是若传过来的是0时,if判断不起作用了。 </where> order by releaseDate desc <!--分页查询--> <if test="start!=null and start!='' and size!='' an...

z_ssyy的博客 2727

企业如何开展BI建设--指标体系建设

很多企业的数字化转型工作都是从做BI项目开始的,很多企业认为,BI就是做指标大屏,所以做了很多的驾驶舱,也做了很多指标,有从系统取的,有手工填报的,甚至手工填报的比例占到了70%,最终BI沦为了填报系统,业务认为BI就是把从线下的微信沟通转到了线上录入展示,并没有给业务代来任何提升,久而久之,BI大屏就没人关心,公司高层也认为数据都是填报的,都经过了加工处理,这种数据不可信,不能反映业务开展的实际。其实在BI系统建设之前,我们首先要做的就是要梳理企业的指标,到底我们要展示哪些指标?

263

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 837

MyBatis的动态SQL详解

基础部分可以查看我的另一篇博客:http://elim.iteye.com/blog/1333271   MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有:   if choose(when,otherwise) trim where set foreach if就是简...

Elim的博客 779

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MyBatis 动态SQL 详解!

动态 SQL 是指在 SQL 语句中,根据不同的条件或参数,生成不同的 SQL 语句。💡

qq_56158663的博客 1716

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1638

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mybatis的动态SQL

Test public void insertMoreByList(){ User user1 = new User("a1","男","北京");

m0_73971785的博客 1275

MyBatis详解

1、简介 1.1、什么是MyBatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 Maven仓库 <!-- https://mvnrepository.com/artifact

可小辉的博客 4万+

SSM——MyBatis动态SQL

动态SQL指在不同条件下做对sql语句的拼装。根据不同情况,去拼接不同的SQL语句。Mybatis框架的动态sql技术是一种根据特定条件动态拼接SQl语句的功能,他存在的意义是为了解决拼接SQL语句字符串时的痛点问题。比如我们在用淘宝之类的软件在进行商品属性选择的时候,我们会发现我们可以选择的商品的属性有很多条件,其中一些条件可以选择也可以不选择,那么如果使用传统的方式进行查询,反而在拼接sql的时候会造成一些列的问题。

2301_78566776的博客 1389

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2134

MyBatis之动态SQL编写指南

实际开发中SQL语句往往需要根据不同条件动态生成(如多条件查询、动态排序、批量操作等),MyBatis的动态SQL通过标签化语法,实现了SQL的灵活拼接,避免了手动拼接SQL的繁琐和SQL注入风险。本文我将系统讲解MyBatis动态SQL的核心标签(`if`、`choose`、`foreach`等),并结合实例解析其用法和最佳实践,带你掌握动态SQL的编写技巧。

aa_hdkf_vg的博客 1174

MyBatis之动态SQL

动态SQL是一种根据运行时条件动态生成和执行SQL语句的技术。与静态SQL(在代码中固定写死的SQL)不同,动态SQL允许程序根据不同输入或条件动态灵活构建SQL,适用于需要灵活查询、参数化条件或复杂业务逻辑的场景。通过条件判断、循环等逻辑,灵活拼接SQL字段,避免硬编码复杂的查询或更新逻辑。多条件查询、批量操作、动态字段更新等。

2301_77021913的博客 1224

MyBatis——#{} 和 ${} 的区别和动态 SQL

动态更新操作也是,当后面有值的时候就更新,没有值的时候就不更新,<set> 标签的作用和 where 类似,也是后面有值的话就生成 set 关键字并且去除右边的逗号,但是后面设置的内容也不能全部是空,此时就算没有生成 set 标签,但是前面还有一个 update 关键字,最后的 SQL 语句还是有问题。我们在填一些表单的时候应该会见到下面这种,有的是必填项,有的是选填项,对于选填项来说,如果没有填,肯定是需要赋一个默认值的,比如 null,那么就需要动态 SQL 来实现这样的功能。

2202_76097976的博客 4150

【mybatis】连接池与动态SQL

在不同条件下拼接不同的sql。Mybatis框架的动态sql技术是一种根据特定条件动态拼接SQl语句的功能,他存在的意义是为了解决拼接SQL语句字符串时的痛点问题。比如我们在用淘宝之类的软件在进行商品属性选择的时候,我们会发现我们可以选择的商品的属性有很多条件,其中一些条件可以选择也可以不选择,那么如果使用传统的方式进行查询,反而在拼接sql的时候会造成一些列的问题。

m0_75163045的博客 1028

MyBatis条件查询效率对比:传统写法vs动态SQL

更糟糕的是,字符串拼接容易导致SQL注入风险,需要额外注意参数过滤。在数据库查询中,条件判断是常见的需求,其中大于等于(>=)操作符使用频率很高。今天我们就来聊聊在MyBatis中实现大于等于条件查询的两种方式:传统Java拼接SQL和动态SQL,看看它们在实际开发中的表现差异。虽然简单场景下两种方式差别不大,但随着项目规模扩大,动态SQL的价值会越来越明显。传统方式:Java代码中需要大量字符串拼接,一个复杂查询可能占用数十行代码,修改时需要同时改动Java和SQL部分。简单固定条件:两种方式都可以。

AmberLeopard26的博客 663

Mybatis 动态sql

MyBatis动态SQL技术能够根据参数条件动态生成SQL语句,提供了XML配置和注解两种实现方式。XML配置方式通过<if>、<choose>、<foreach>等标签实现条件拼接,支持复杂逻辑和SQL复用;注解方式则更简洁,适合简单场景。XML配置具有结构清晰、便于维护的优点,但需要额外文件;注解方式开发便捷但可读性较差。建议根据项目复杂度选择:复杂逻辑用XML,简单操作用注解,保持团队风格统一。两种方式各有优势,可灵活组合使用。

weixin_62316729的博客 1313

MyBatis (五)动态SQL

动态 SQL 是 MyBatis 的核心特性之一,允许根据条件动态拼接 SQL 语句。通过条件判断、循环等逻辑,灵活生成不同场景下的 SQL,解决传统 JDBC 中硬编码 SQL 的繁琐问题。

小安同学的博客 2038

mybatis动态SQL语句

1. mybatis 与 JDBC对比 传统JDBC动态SQL 在学习mybatis动态SQL语句之前,先来回忆一下JDBC的SQL操作。看看传统的JDBC操作是多么的难受,手动控制一些参数条件。 StringBuffer sql = new StringBuffer(); ArrayList<Object> obj = new ArrayList<>(); sql.append("select * from smbms_provider"); boolean f = false;

weixin_43808717的博客 914
上一篇: mysql水平分表和垂直分表和数据库分区
下一篇: Maven pom.xml 配置详解
Java_Mr_Zheng
博客等级 码龄11年 18粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值