动态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代码的操作基本大致相似。

你可能感兴趣的:(mybatis)