mybatis动态SQL,各标签使用总结

mybatis动态SQL标签: if where choose otherwise trim set foreach

1. if标签:

条件判断标签,通过判断参数取值来决定是否使用某个查询条件,基本用法如下:

  <select id="testWhere" resultMap="BaseResultMap" parameterType="map">
    select *from employee where  1=1
      --判断age是否等于22
    <if test='age =="22"'>
       and age = #{age}
    </if>
       --name不等于空且不能等于null
    <if test="name != null and name != ''">
       and name like %${name}%
    </if>
</select>

这里 where后面1=1,是为了解决当两个条件都不为true时,sql语句不合法导致报错的问题,也可以通过下面的where标签解决

2. where标签

  1. sql中不用写where
  2. where标签可以过滤掉条件语句中第一个and或or
  <select id="testWhere" resultMap="BaseResultMap" parameterType="map">
    select *from employee
    <where> --执行时,where标签会自动转化为一个where
    <if test="age != null and age != ''">
        age = #{age}
    </if>
    <if test="name != null and name != ''">
        --如果age条件为false,where标签会去掉这个and,让语句正确执行
       and name like %${name}%
    </if>
    </where>
</select>

3. choose、otherwize标签

有时候,我们并不想应用所有的条件,而只是想从多个选项中选一个,而if标签是只要条件为真就会执行sql拼装.这时就需要使用choose标签,choose与java的switch功能类似;

mybatis会依次顺序判断各choose中的条件,当when某个条件满足时,就会跳出choose,即只选择第一个满足条件的when,如果choose中的条件都不满足,则执行otherwise中的语句;

总结:choose otherwise 类似于java的 switch…in case…default

4. trim标签:

trim标签用于控制sql语句的前缀及后缀,其具体属性如下:

属性描述
prefix指定sql语句拼接的前缀
subfix指定sql语句拼接的后缀
prefixOverrides指定sql语句前面要去除的关键字或字符,如AND 逗号 括号等
suffixOverrides指定sql语句后面要去除的关键字或字符

使用方法举例:

使用trim标签去掉多余and或or

使用trim去掉多余的逗号:

5. set标签

在动态 update 语句中可以使用 set 元素动态更新列

如在update语句中,如果使用if标签,当前面的if条件为false时,就会出现多余逗号的错误,此时用set就可以解决这个问题,如:

6. foreach标签

动态sql的一个常用操作时要求对一个集合进行遍历,通常是在IN条件语句中,如:

foreach标签的属性如下:

属性描述
collection表示迭代集合的名称,一般可为list、set、array、map,该参数为必选参数
item本次迭代获取的元素,如collection为list、set、array则item为其中元素,若为map,则item为key-value中的alue,必填参数
open表示该语句以什么开始,最常见的是左括号“(” , 可选参数
close表示该语句以什么结束,最常见的是右括号“)” , 可选参数
separator分隔符,mybatis会在每次迭代后给item后添加一个分隔符,一般为逗号,可选参数
index在list set 数组中,index表示当前迭代元素的下标,在map中index表示key-value中的key,可选参数

在来一个集合为map的例子:

--字典表插入一条数据
<select id = "insertKeyMap" parameterType="map">
	insert into t_key_value(key,value) values
	<foreach collection="map" item="value" index="key" separator=",">
		(#{key},#{value})
	</foreach>
</select>
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis 是一种优秀的 ORM 框架,它的优势之一就是可以执行动态 SQL。动态 SQL 允许你在运行时创建 SQL 语句,根据不同的情况动态地拼接 SQL 语句,这使得 SQL 语句的编写更加灵活。 在 MyBatis ,动态 SQL 的执行原理如下: 1. MyBatis 会解析 Mapper 文件SQL 语句,根据其的动态 SQL 片段,生成相应的 SQL 语句。 2. 在执行 SQL 语句之前,MyBatis 会将 SQL 语句的占位符替换为具体的参数。 3. MyBatis使用 JDBC 执行生成的 SQL 语句,执行查询或者更新操作。 MyBatis 提供了以下几种动态 SQL 语句: 1. if 元素:用于根据条件判断是否包含某一部分 SQL 语句。 2. choose 元素:类似于 Java 的 switch 语句,用于从多个选项选择一个。 3. when 元素:用于在 choose 元素定义选项。 4. otherwise 元素:用于在 choose 元素定义默认选项。 5. trim 元素:用于从 SQL 语句的开头或结尾去除指定的字符串。 6. where 元素:用于在 SQL 语句添加 WHERE 子句。 7. set 元素:用于在 SQL 语句添加 SET 子句。 8. foreach 元素:用于对集合进行遍历,并生成对应的 SQL 语句。 以上这些元素可以组合使用,从而生成更加复杂的 SQL 语句。使用动态 SQL,可以大大提高 MyBatis 的灵活性和可扩展性。 ### 回答2: MyBatis动态SQL的执行原理如下: MyBatis是一款基于Java的持久层框架,它的动态SQL功能是通过使用XML或注解来定义SQL语句,以及使用动态标签和OGNL表达式来实现动态SQL的执行。 首先,MyBatis会解析XML配置文件或注解定义的SQL语句,并将其转化为内部存储结构,通常是一棵解析树。这个过程通常在应用程序启动时完成,以提高后续SQL的执行效率。 在执行SQL语句时,MyBatis会先根据动态标签判断条件来确定是否需要执行该SQL语句。动态标签例如`<if>`、`<choose>`、`<when>`、`<otherwise>`等,通过判断条件来决定是否包含或执行对应的SQL片段。 在动态标签,我们可以使用OGNL(对象图导航语言)表达式来实现更灵活的判断逻辑。OGNL可以访问和操作对象的属性、方法等,并支持一些基本的判断和计算操作,如判断集合是否为空、字符串是否相等等。 执行动态SQL时,MyBatis还会将动态SQL的动态标签和OGNL表达式进行解析和执行,根据判断结果来拼接最终的SQL语句。这个过程通常发生在SQL语句被执行之前。 最后,MyBatis使用JDBC连接数据库,并将最终生成的SQL语句发送到数据库服务器执行。数据库服务器返回执行结果后,MyBatis会将结果转换为Java对象,并返回给应用程序进行后续处理。 总结来说,MyBatis动态SQL的执行原理是通过解析和执行动态标签和OGNL表达式来生成最终的SQL语句,并将其发送到数据库服务器执行。这种动态化的特点使得开发者能够根据不同的条件和场景生成不同的SQL语句,从而提高应用程序的灵活性和性能。 ### 回答3: MyBatis动态SQL的执行原理如下: 1. 解析mapper文件:MyBatis通过解析mapper文件,将其SQL语句解析为对应的对象模型。 2. 处理动态标签MyBatis动态SQL采用了一些特殊的标签,如if、choose、when、otherwise等,用于根据不同的条件生成不同的SQL语句。在执行前,MyBatis会根据传入的参数动态处理这些标签,生成最终的SQL语句。 3. 参数绑定:MyBatis会将传入的参数与SQL语句的占位符进行绑定。根据参数的类型,MyBatis会调用对应的类型处理器将参数转换成SQL语句的具体数。 4. 执行SQL语句:MyBatis会将生成的SQL语句交给对应的数据库驱动程序执行。数据库驱动程序会将SQL语句发送到数据库服务器,数据库服务器解析执行SQL语句,并返回执行结果。 5. 结果映射:MyBatis会根据mapper文件的配置,将数据库返回的结果映射为Java对象。MyBatis提供了丰富的结果映射方式,包括基本类型、POJO对象、集合等。 总的来说,MyBatis动态SQL的执行原理可以归纳为解析mapper文件、处理动态标签、参数绑定、执行SQL语句和结果映射。通过这一步骤,MyBatis实现了动态生成SQL语句、参数绑定和结果映射的功能,为开发者提供了方便灵活的SQL操作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值