目录
1.<if test=" ">
2.<choose>
3.<trim>
4.<foreach>
5.<set>
6.<where>
1.什么是mybatis动态sql
MyBatis动态SQL是指在进行数据库操作时,根据不同的条件动态生成SQL语句的功能。传统的SQL语句是静态的,即固定不变的字符串。而使用动态SQL可以根据不同的条件来拼接生成不同的SQL语句,从而实现更加灵活和可复用的数据库访问。
动态SQL使得在不同的条件下执行不同的查询、插入、更新或删除操作变得非常方便。它能够避免因为大量的if-else语句导致代码冗长和维护困难的问题。
mybatis动态sql标签以及属性的作用
<if test=" "> | 用于在SQL语句中添加条件判断 行该if块内的SQL语句 |
<choose> | 标签没有特定的属性,只需将
|
<trim> | 用于去除或添加SQL语句中的特定部分,
|
<foreach> | 用于循环遍历集合,并将集合元素作为参数传递给SQL语句的占位符
|
<set> | 标签的作用是生成UPDATE语句中的SET子句,并根据条件动态拼接需要 更新的字段和对应的值。它通常和 |
<where> | 作用是生成SQL语句中的WHERE子句,并根据条件动态拼接查询条件。它通 常和 |
这些标签可以组合使用,以根据不同的条件生成不同的SQL语句,可以根据具体需求进行设置,以实现动态生成符合条件的SQL语句。通过灵活应用这些属性,可以使得SQL语句更加可读性高、可维护性强,并且适应不同的业务场景。
2.示例代码
<if test=" ">
<select id="getSupplierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
SELECT * FROM t_supplier
WHERE 1=1
<if test="supCode!= null">
AND supCode= #{supCode}
</if>
<if test="supName!= null">
AND supName= #{supName}
</if>
</select>
通过这样的配置,我们可以根据传入的参数动态生成符合条件的SQL语句。使用<if>
标签时,需要注意将它放置在适当的位置,以确保生成的SQL语句的语法正确。在示例中,我们将<if>
标签放在WHERE子句中,并使用1=1作为初始条件,这样可以确保WHERE子句始终以AND开头。
<choose>
<select id="getSupllierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
SELECT * FROM t_supplier
WHERE
<choose>
<when test="supCode!= null">
supCode= #{supCode}
</when>
<when test="supName!= null">
supName= #{supName}
</when>
<otherwise>
id= '1'
</otherwise>
</choose>
</select>
<choose>
标签来处理多条件判断。首先,它会尝试匹配第一个<when>
标签中的条件表达式,如果满足条件,则执行对应的SQL语句;如果不满足,则继续匹配下一个<when>
标签,直到找到满足条件的分支。如果所有的<when>
标签都不满足条件,则会执行<otherwise>
标签内的SQL语句。
<trim>
<select id="getSupllierAllByidsupCodesupName" resultType="Supplier" parameterType="Supplier">
SELECT * FROM t_supplier
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="id!=null">
AND id=#{id}
</if>
<if test="supCode!=null">
AND supCode=#{supCode}
</if>
<if test="supName!=null">
AND supName=#{supName}
</if>
</trim>
</select>
首先,我们指定prefix="WHERE"
,这样生成的SQL语句会以WHERE关键字开头,使用prefixOverrides="AND | OR "
来去除生成的SQL语句中多余的AND或OR连接词,保证生成的WHERE子句的语法正确。
<foreach>
<delete id="delManySupllierById" parameterType="java.lang.Integer">
DELETE FROM t_supplier WHERE id IN
<foreach collection="ids" item="id"
open="(" separator="," close=")">
#{id}
</foreach>
</delete>
在<foreach>
标签中,我们指定了item="id"
,表示在每次迭代中,将当前遍历到的元素赋值给名为id
的变量。collection="ids"
表示要遍历的集合对象是ids
,即传入的用户ID列表。在<foreach>
标签内部,我们使用open="("
、separator=","
和close=")"
来指定循环生成的SQL代码的开头、分隔符和结尾。这样,在生成的SQL语句中,会将用户ID列表拼接成类似 (1, 2, 3)
的形式批量删除。
<set>
<update id="updSupplier" parameterType="Supplier">
UPDATE t_supplier
<set>
<if test="supName!= null">
supName= #{supName},
</if>
<if test="supCode!= null">
supCode= #{supCode},
</if>
</set>
WHERE id = #{id}
</update>
<set>
标签来生成UPDATE语句中的SET子句,用于指定要更新的字段和对应的值。在<set>
标签内部,我们使用了多个<if>
标签来根据条件判断是否需要更新相应的字段。注意每个被更新的字段后面都需要有逗号作为分隔符。这样,在执行UPDATE语句时,只会更新非空字段对应的值。最后,我们通过WHERE id = #{id}
来指定更新的条件。
<where>
<select id="getSupllierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
SELECT * FROM t_supplier
<where>
<if test="supName!= null">
AND supName= #{supName}
</if>
<if test="supCode!= null">
AND supCode= #{supCode}
</if>
</where>
</select>
注意,通过使用<where>
标签,可以自动去除多余的AND连接词。如果没有任何条件满足,最终生成的SQL语句中不会出现WHERE关键字,而只会保留原始的SELECT语句。
3.Mybatis 动态sql 的好处
-
简化条件拼接:动态SQL使得条件拼接变得更加灵活和直观。可以根据不同的条件动态生成查询语句,避免了手动拼接字符串的复杂性和潜在的安全风险。
-
提高代码可读性:通过使用动态SQL,可以将不同的条件判断以结构化的方式呈现,使得SQL语句更易于理解和维护。可读性提高了代码的可维护性和可扩展性。
-
减少数据库负担:动态SQL可以根据具体的条件生成精确的SQL语句,避免了不必要的查询或更新操作,减少了数据库的负担和网络传输数据量。
-
增强性能优化:动态SQL可以根据不同的条件生成不同的执行计划,从而实现更好的性能优化。可以针对特定的查询场景生成最优化的SQL语句,提升查询效率。
-
支持批量操作:动态SQL支持批量操作,可以循环遍历集合对象,并根据集合元素生成相应的SQL代码。这在处理批量插入、更新或删除等操作时非常实用,能够大大提高数据库操作的效率。
总之,动态SQL是MyBatis强大的特性之一,它能够根据不同的条件动态生成SQL语句,提高代码的灵活性、可读性和性能优化能力。通过合理使用动态SQL,可以简化开发工作、减少数据库负担,同时提升应用程序的性能和可维护性。