mybatis学习七

2020/04/23
3)多对多查询
这种查询可以解耦为一对多,解耦后具体做法和一对多查询一样,就不再详述了hhhhhhh。

-------------------------华丽的分割线,开始mybatis的动态sql章节
所谓动态sql就是根据条件执行某语句,条件不满足则不执行。
和编程语言一样,具有if、where、when等元素,只不过是以标签的形式出现。同时mybatis还具有一些特殊的帮助执行动态sql的标签。常用 <if>、<choose>、<when>、<otherwise>、<trim>、<where>、<set>、<foreach> 和 <bind> 等元素。
接下来分类型进行介绍。
1)<if>标签
先放示例xml代码:
//传入的是一个User对象,这个对象拥有uname、usex、uid等属性。
select * from user where 1=1
        <if test="uname!=null and uname!=''">
            and uname like concat('%',#{uname},'%')
        </if >
        <if test="usex !=null and usex !=''">
            and usex=#{usex}
        </if >
----
从上面的代码中可以看出,<if>标签通常与test属性连用以便测试条件是否成立。具体含义与任何的编程语言一样,就不过多解释了233333,仅需要记住其与 test属性连用即可。

2)<choose>标签
该标签与java中的switch关键字的功能类似,用于设置不同条件不同的执行sql。同样的,既然其类似switch,而switch关键字一般与case、default关键字搭配使用,那么<choose>标签必定需要另外的标签协作以完成功能,与其协作的标签在mybatis中为<when>、<otherwise>标签。
示例如下:
//传入参数同上
select * from user where 1=1
    <choose>
        <when test="uname!=null and uname!=''">
            and uname like concat('%',#{uname},'%')                       -------①
        </when>
        <when test="usex!=null and usex!=''">
            and usex=#{usex}                                                          -----------②
        </when>
        <otherwise>
            and uid > 10                                                                    ---------③
        </otherwise>
    </choose>
----
在上面的语句中,
三条语句的优先级为①>②>③。也就是说只要满足①执行的条件,②③就不会执行,;同理,当①的条件不满足而②的条件满足时则只执行②,就算③的条件满足也不会再执行③。

3)<trim>标签    //这个标签的功能有待进一步实践了解。
<trim> 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix。
可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides。正因为 <trim> 元素有这样的功能,所以也可以非常简单地利用 <trim> 来代替 <where> 元素的功能。
首先举出示例:
//传参同上。
select * from user
    <trim prefix="where" prefixOverrides = "and | or">
        <if test="uname!=null and uname!=''">
            and uname like concat('%',#{uname},'%')
        </if>
        <if test="usex!=null and usex!=''">
            and usex=#{usex}
        </if>
    </trim>

4)<where>标签
<where> 元素的作用是会在写入 <where> 元素的地方输出一个 where 语句,另外一个好处是不需要考虑 <where> 元素里面的条件输出是什么样子的,MyBatis 将智能处理。如果所有的条件都不满足,那么 MyBatis 就会查出所有的记录,如果输出后是以 and 开头的,MyBatis 会把第一个 and 忽略。
当然如果是以 or 开头的,MyBatis 也会把它忽略;此外,在 <where> 元素中不需要考虑空格的问题,MyBatis 将智能加上。
示例如下:
//传参同上
select * from user
    <where>
        <if test="uname != null and uname ! = ''">
            and uname like concat('%',#{uname},'%')
        </if>
        <if test="usex != null and usex != '' ">
            and usex=#{usex}
        </if >
    </where>
---
该示例相当于插入了一个where,同时,如果第一个<if>条件满足,mybatis先将会删去语句开头的‘and’,然后再添上后续语句。

5)<set>标签
该标签和SQL语句中的‘set’作用一样,只不过mybatis里面的<set>标签可以搭配其他标签如<if>一起使用,达到批量条件‘set’的目的。
同样还是上例子:
<!--使用set元素动态修改一个用户-->
<update id="updateUserBySet" parameterType="com.po.MyUser">     
    update user
    <set>
        <if test="uname!=null">uname=#{uname}</if>
        <if test="usex!=null">usex=#{usex}</if>
    </set>
    where uid=#{uid}
</update>
---------------
可以看出该标签用于<update>标签中,该示例所起的具体作用不再详述,比较简单。

6)<foreach>标签
该标签主要用于遍历,拥有item、index、collection、open、close、separator等属性。
①item属性就相当于java中的:
for item : items
这样的效果,是遍历列表中当前遍历到的元素,必需。
②index属性指向目前遍历到的在被遍历列表中的位置,非必需。
③collection属性指明传入参数的类型,如果是List类型则collection值为list;如果是Array数组,则其值为array;如果是Map类型,collection的值为map的第一个key,此时index不再对应遍历元素的下标,而是对应于遍历到的key字面值,同样的item此时对应当前遍历到的键对应的值。此属性必需。
④open、close、separator属性分别为遍历的起始符、终止符、每次遍历分隔符。
举例:
<select id="selectUserByForeach" resultType="com.po.MyUser" parameterType=
    "List">
        select * from user where uid in
        <foreach item="item" collection="list"
        open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
-----
上栗中传入一个id的列表类型参数,sql语句含义为:查询表user中uid在传入的list中的项。

7)<bind>标签
该标签主要用于字符串拼接。具体如下例子:
//传入的参数同上
<bind name="paran_uname" value="'%' + uname + '%'"/>    
            select * from user where uname like #{paran_uname}
------
在上面的代码中,bind标签中的value属性的值中的‘uname’是传入参数user的一个属性名。
通过<bind>标签可以将若干个字符串属性值连接在一起,并且赋予该多个字符串连接的新字符串以新的名字(通过name属性实现)。这样后,在后面sql中就可以直接借助这个新名字来使用多个串接的字符串。
该标签主要用于防止数据库注入。

 

#####至此,mybatis学习告一段落,学到这里应该只能算个入门,后续想要精进还需要更多的精力与时间。

共勉。

参考文献:

http://c.biancheng.net/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值