博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis 动态SQL
阅读量:4178 次
发布时间:2019-05-26

本文共 2544 字,大约阅读时间需要 8 分钟。

MyBatis 动态SQL

Mybatis的强大特性之一便是它的动态SQL。

利用动态SQL可以解决根据不同条件拼接SQL语句这一问题,如果你有过JDBC或其他类似框架的经验,你就能体会到这种根据不同条件拼接 SQL 语句有多么麻烦,拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。所以,动态SQL通俗点说就是用一种比上述方法简单的方式将SQL语句拼接在一起,而且省去了很多麻烦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

常用的四种:
if
choose(when,otherwise)
trim(where)
foreach

1,if

动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:

上述代码里的语句提供了一个可选的查找类型的功能。如果传入的stuid不为空,则执行第一个if,如果传入的stuid为空,这执行第二个if,它有点像Java中的if else语句。

2,choose(when,otherwise)
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch-case 语句。

这里提供了三种方式,符合哪一种就根据哪一种来执行查询操作,但需要注意的是如果有一条符合,则不会去执行下面的语句,比如sname不为空,则执行第一when,后面的将不再执行。

3,trim(where)
前面几个例子已经合宜地解决了一个臭名昭著的动态 SQL 问题。但是看下面的例子。

如果这些条件没有一个能匹配上将会怎样?最终这条 SQL 会变成这样:

SELECT * from student where

这会导致查询失败。如果仅仅第二个条件匹配又会怎样?这条 SQL 最终会是这样:

SELECT * from student where and sname like concat(concat('%',#{
sname}),'%')

很显然,这也是一个错误的SQL语句,所以这个问题不能简单的用条件句式来解决

MyBatis 有一个简单的处理,这在90%的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作

where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。

4,foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。

注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以"list"作为键,而数组实例的键将是"array"。

转载地址:http://jcqai.baihongyu.com/

你可能感兴趣的文章
C编译器、连接器与可执行机器码文件
查看>>
android linker 浅析
查看>>
802.11 traffic id
查看>>
Android系统wifi分析-手动连接过程
查看>>
设置IP别名Shell脚本
查看>>
Source Insight 宏-单行注释
查看>>
levelDB源码分析-Arena
查看>>
levelDB源码分析-SSTable
查看>>
平滑升级Nginx的Shell脚本
查看>>
SSH远程会话管理工具
查看>>
canvas标签设长宽是在css中还是在标签中
查看>>
如何创建一个vue项目
查看>>
webpack和webpack-simple中如何引入css文件
查看>>
vue1.0和vue2.0的区别之路由
查看>>
关于vue-router2.0的学习笔记
查看>>
vue1.0与2.0区别之生命周期
查看>>
vue2.0之非父子组件通信
查看>>
如何建立svn版本库并运行它
查看>>
如何合并svn分支到主干上
查看>>
libusb源码学习:list_entry
查看>>