动态sql语句

动态sql语句标签:
bind
choose
foreach
if
include
set
trim
where

where标签
需要根据条件进行判断查询,此时则需要执行动态的sql语句。
问题描述:
假如映射文件配置接口方法,需要插入一个参数为Employee对象。我们需要根据对象中的某些条件,来执行对应的sql语句。如下表为一个emploee对象的数据库字段和数据,假如我们需要查询出emploee中的字段。如果id不为空,则查询条件要加上id属性。如果姓名不为空,则查询条件需要加上姓名。如果年龄不为空,则需要叫上年龄作为条件查询。
id name age
1 zs 18
2 ls 16
3 ww 23

解决办法:显然,我们需要通过动态的拼接sql语句进行执行。
Mybatis提供了if功能,允许动态的sql功能。

<select id="方法名" resultType="">
        select * from employee where
        <if test="id!=null">
            id=#{id} and
        </if>
        <if test="name!=null">
            name=#{name} and
        </if>
        <if test="age!=null">
            age=#{age}
        </if>
    </select>

看上述代码。通过if动态的拼接sql语句,即可按照条件执行动态的sql语句。但是我们会发现一个问题。假如第三个条件不满足,显然此时的sql语句的结尾会多一个and。这样动态的拼接sql语句显然会很麻烦。
于是,Mybatis便提供了一种方法。通过 where标签。可以帮助我们自动的截取掉多余的and。

if标签

<select id="方法名" resultType="">
        select * from employee
        <where>
        <if test="id!=null">
            and id=#{id}
        </if>
        <if test="name!=null">
            and name=#{name}
        </if>
        <if test="age!=null">
            age=#{age}
        </if>
        </where>
    </select>

如上述情况。当sql语句前边有多余的and时,where会帮助我们自动的截取掉多余的and。(注意,只能截取前边多余的and,不能截取后边多余的and)。
但是问题又来了。假如三种条件都不满足。那么查询的sql语句便多了一个where字段。此时需要通过另外一种方式。

trim标签

    <select id="方法名" resultType="">
        select * from employee where
        <trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
        <if test="id!=null">
            and id=#{id}
        </if>
        <if test="name!=null">
            and name=#{name}
        </if>
        <if test="age!=null">
            age=#{age}
        </if>
        </trim>
    </select>

通过trim标签进行字符串的截取。
trim的标签

标签说明
prefix(智能的添加)可以动态的添加where
prefixOverrides(智能的去掉)去除前边的多余的字符。可以去掉此案例中前边多余的and
suffix添加一个后缀,与prefix相对
suffixOverrides去除后边多余的字符,与prefixOverrides相对

foreach标签
假如需要查询SQL语句:
select * from employee id IN (1,2,3,4,5。。。)
此时我们传入的参数是一个list集合(集合的元素中值为1,2,3,4,5.。。。)。显然的集合中有多少个元素我们不知道,但是需要遍历集合中所有的元素进行查询。
此时就需要用到foreach进行集合的遍历。

foreach标签

标签说明
item为每次从集合中取到的值设置一个变量名
index若集合为map类型的时候,则index表示索引下标
open表示sql语句以什么开始,即加上前缀
close与open的作用相对
separator表示每次遍历集合中的元素以什么分隔

choose标签
可以替代上述的if进行条件判断。其中when表示判断if。另外choose的otherwise标签可表示else的功能。

set标签
主要用于更新操作,替代set字段。与上述的where标签作用类似。

bind标签
基本不用,做模糊查询的时候使用,加入模糊查询%a%。此时可以将a通过bind标签绑定为一个变量temp,此时sql语句中,就可以通过temp表示%a%。

include标签
需要通过和sql标签配合使用。
sql标签是在select同级别下使用。可以将一个常用的sql语句,表示为一个变量。
include则在动态sql语句中,通过include标签即可导入sql标签的sql语句。

注:mybatis的动态sql中,支持静态方法,方法,构造器,运算符的使用。与java代码的操作基本大致相似。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的代码。MyBatis动态SQL语句是指在编写SQL语句时可以根据不同的条件动态生成不同的SQL语句。 MyBatis提供了以下几种方式来实现动态SQL语句: 1. if元素:通过if元素可以根据条件判断来生成不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句。 2. choose、when、otherwise元素:通过choose、when、otherwise元素可以实现类似于switch语句的功能,根据不同的条件选择不同的SQL语句片段。例如: ``` <select id="getUserList" parameterType="User" resultType="User"> SELECT * FROM user WHERE 1=1 <choose> <when test="name != null"> AND name = #{name} </when> <when test="age != null"> AND age = #{age} </when> <otherwise> AND status = 'ACTIVE' </otherwise> </choose> </select> ``` 上述示例中,如果传入的User对象中name属性不为空,则会生成AND name = #{name}这段SQL语句;如果name为空而age不为空,则会生成AND age = #{age}这段SQL语句;如果name和age都为空,则会生成AND status = 'ACTIVE'这段SQL语句。 3. foreach元素:通过foreach元素可以实现对集合类型的参数进行遍历,并生成相应的SQL语句片段。例如: ``` <select id="getUserList" parameterType="List" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 上述示例中,如果传入的List参数中包含[1, 2, 3]三个元素,则会生成SELECT * FROM user WHERE id IN (1, 2, 3)这段SQL语句。 这些是MyBatis动态SQL语句的几种常用方式,通过它们可以根据不同的条件生成不同的SQL语句,提高了SQL语句的灵活性和可复用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值