jpa⾃定义sql参数为空的传递_MyBtis的动态SQL
作为⼀名优秀的Java后端⼯程师,不得不说,跟数据库打交道的次数⽐跟⾃⼰⼥朋友(程序猿没有⼥朋友,原谅我这个不那么恰当的⽐喻)⼀起吃饭的次数都多;所以很多程序员对写SQL是深恶痛绝啊,但是回过头来⼀想,程序在跟数据库进⾏交互的时候,不就是靠的SQL来完成的吗?如果连SQL都不写了,那还怎么能更好的了解数据库?怎么跟数据库亲切交流呢?后端⼯程师岂不是要失业了。
基于以上种种,MyBatis作为⼀个优秀、轻巧、灵活的持久层框架,既解决了我们和数据库交互的繁琐的
代码,同时也满⾜了我们写SQL的愿望(真正是因为我们⾃⼰写SQL的可以优化SQL的执⾏效率),其中最⼤的⼀个特点,就是MyBatis的所提供的动态SQL,这也是它有别于其他ORM框架最⼤的⼀个特点,相信⼤家都使⽤过JDBC或其他类似框架的经验,你应该能体会到根据不同条件拼接SQL语句有多么难受;经常会因为⼀个空格或者分号等,导致程序运营错误,动态SQL出现彻底的帮我们摆脱这⼀痛苦。
所以今天这篇⽂章,就来跟⼤家聊⼀聊MyBatis的动态SQL是怎么样⼀回事⼉,是怎么帮⼴⼤程序猿节省出时间去陪⼥朋友的(哦哦哦...我有错了,程序猿没有⼥朋友...)
MyBatis给我们提供很多的动态SQL语句,这⾥我们就说⼏种常⽤的动态SQL:
<if>
<choose>
<trim>
<foreach>
接下来咱们就分别来介绍下这⼏种常⽤的动态SQL。
条件判断语句
⾸先,我们先来说说标签,这个标签从字⾯意义上就可以很直观的看出来,它就是⼀个⽤来做判断的语句,和Java中的if语句⼀样,所以它的作⽤就是⽤来判断我们拼接的SQL中的条件是否成⽴,接下来上代码:
t_user
WHERE 1=1
<if test="userId !=null and userId !=''">
and id = #{userId};
</if>
</select>
在这⾥我们就⽤来是判断传递过来的参数userId是否为空的情况,这⾥⼤家可能注意到⼀个点,就是有个where 1=1 以及标签⾥有个and,这是因为,如果我们在使⽤标签的时候,传递过来的是多个条件,这就需要多个标签了,所以通常情况下我们在每个标签中的条件前⾯加⼀个and将它们拼接起来,因为我们不确定那个标签⾥的条件是满⾜的,随意where后⾯第⼀满⾜的条件前就多了⼀个and关键字,所以就通常情况下就会在where后⾯加上⼀个1=1恒成⽴的条件。
注:这⾥如果⼤家不使⽤ 1=1的话,可以使⽤标签,来替换where 1=1 这个等式,将条件写在标签⾥就可以了。
多条件判断语句
翻译⼀下就是选择的意思,也就是他可以帮我们在多个条件中选择⼀个成⽴的条件,它有点像 Java 中的 switch 语句,⼀个标签中还需要另外两个重要的标签、 在后⾯解释,还是先上代码。
<select parameterType="int" resultType="test.User">
SELECT
*
FROM
t_user
<where>
<choose>
<when test="userId != null and userId != ''">
jpa mybatisand id =#{userId}
</when>
<otherwise>
and id=3
</otherwise>
</choose>
</where>
</select>
这段代码中,我们就直接改掉了标签来代替where 1=1,这⾥解释下。
当test属性的条件满⾜时,是执⾏拼接其内的条件。
所有条件都不满⾜时,拼接其内的条件。
⾃定义元素标签
看标签的名字就能猜个⼋九不离⼗了,这个标签可以⾃定义⼀些动态SQL的功能,怎么个定义法呢?咱们还是先来上代码,⼀睹为快。
t_user
<trim prefix="where" prefixOverrides="and | or">
<if test="userId !=null and userId !=''">
and id = #{userId};
</if>
</trim>
</select>
还记得我们在说标签的时候,说到的标签吗,⽤它可以代替where 1=1的情况,现在我们学习了标签的话,也可以⽤这种⽅式,标签中有四个属性。
prefix 前缀的意思,上图中我们给的值是where意思就是会这个位置拼接上⼀个where关键字,当然也可以是别的关键字,如:set prefixOverrides 前覆盖的意思,上图中它会把标签中的and,关键字⾃动去掉,其他关键字就可以直接⽤|隔开。
suffix 后缀的意思,和前缀相反,可以在SQL末尾添加执⾏的后缀。
suffixOverrides 后缀覆盖的意思,和前缀覆盖相反,通常会把SQL最后⽆⽤的分号⾃动去掉。
以上就是标签的⽤法,它是⼀个⾮常灵活的标签,所以通常有些复杂的SQL的时候,就可以⽤它来处理。
循环标签
这个标签也很容易理解,就是循环的意思,和Java中的for循环类似,只不过它⾥⾯的属性多些。
<insert>
insert into t_user (name,age) values
<foreach collection="userList" item="user" separator=",">
(#{user.username},#{user.age})
</foreach>
</insert>
元素的属性主要有item、index、collection、open、separator、close
collection 表⽰如何来得到这个集合,如果传⼊的直接为⼀个List,那么collection值就为list。
如果直接传⼊的为⼀个array不可变数组,那么collection值就为array,如果传⼊的为⼀个Map,那么collection的值就为map的key。
item 表⽰集合中每⼀个元素进⾏迭代时的别名,⽐如item为value,那么,每次获取的都使⽤#{value}即可。
index 指定⼀个名字,⽤于表⽰在迭代过程中,每次迭代到的位置,⼀般很少使⽤这个。
open 表⽰该语句以什么开始。
separator 表⽰在每次进⾏迭代之间以什么符号作为分隔符。
close 表⽰以什么结束。
标签通常⽤在批量处理的数据的时候,通常是传递⼀些集合或者数组的参数,在拼接SQL的时候,就需要先从这些集合或数组总循环取出这些数据,⽐如:批量插⼊数据,批量删除数据。
好了,到此就把MyBatis最重要也是最核⼼的⼀部分内容常⽤的动态SQL给⼤家介绍了⼀下,其中再说⼀些SQL的事,也会说下相关联的动态SQL标签,这部分知识必须要掌握哦。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论