Mybatis最入门---动态查询(where,trim,set)

首先,请大家先回顾一下,我们前文在讲述<if>时说至少有一个where 固定条件,并且在缺失固定条件是SQL的执行结果是0个符合条件的数据。可现实情况是,我们真的有时候无法确定输入条件中是不是至少有一个有效。本文,我们就来解决这个问题。

准备工作:

a.操作系统 :win7 x64

b.基本软件:MySQL,Mybatis,spring,SQLyog

-------------------------------------------------------------------------------------------------------------------------------------

一。<where>标签

1.复制上文工程,重命名为Mybatis08工程,工程结构图如下:

2.修改UserInfoMapper.xml,具体内容如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="findUserInfoByUnoQuantity" parameterType="Map"  
  2.         resultMap="UserInfoResult">  
  3.         select * from userinfo  
  4.         <where>  
  5.             <if test="department!=null">  
  6.             <span style="white-space:pre">    </span>department like #{department}  
  7.             </if>  
  8.             <if test="gender!=null">  
  9.                 AND gender=#{gender}  
  10.             </if>  
  11.             <if test="position!=null">  
  12.                 AND position like #{position}  
  13.             </if>  
  14.         </where>  
  15.     </select>  
【解释】
a.select之后没有直接写Sql语句的where,而是使用<where>标签

b.按照标准写法,第一个<if>标签内的AND应该不写,但是,就算开发中书写也不会报错。这就是where标签帮助我们自动的移除了第一个AND链接。但是,第二个之后的<if>标签内,必须有AND链接。

c.如果没有一个条件符合,则返回所有条目。

d.<if>标签的其他用法请参考前文,这里不再赘述

3.修改单元测试方法,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testSeletOne() {  
  3.         try {  
  4.   
  5.             Map<String, Object> map = new HashMap<String, Object>();  
  6.             map.put("department""1");  
  7.             map.put("gender""1");  
  8.             map.put("position""工程师");  
  9.             Departments d = new Departments("2""%售%");  
  10.             map.put("d", d);  
  11.             UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);  
  12.             List<UserInfo> UIList = userInfo.findUserInfoByUnoQuantity(map);  
  13.             for (UserInfo ui : UIList) {  
  14.                 System.out.println(ui.toString());  
  15.             }  
  16.         } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
4.运行单元测试方法,观察输出即可。

5.结论:where 元素知道只有在一个以上的<if>条件有值的情况下才去插入“WHERE”子句。而且,若内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

--------------------------------------------------------------------------------------------------------------------------------------------------------

二.<trim>标签

1.该标签的功能与<where>类似,并且额外的提供了前缀后缀功能。具体用法如下:

2.修改Mapper文件,具体内容如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="findUserInfoByTrim" parameterType="Map"  
  2.         resultMap="UserInfoResult">  
  3.         select * from userinfo  
  4.         <trim prefix="where" prefixOverrides="and|or">  
  5.             <if test="department!=null">  
  6.                 AND department like #{department}  
  7.             </if>  
  8.             <if test="gender!=null">  
  9.                 AND gender=#{gender}  
  10.             </if>  
  11.             <if test="position!=null">  
  12.                 AND position like #{position}  
  13.             </if>  
  14.         </trim>  
  15.     </select>  

【解释】

a.我们使用<trim>替代<where>标签。

b.属性“prefix”表示:加入前缀where

c.属性“prefixOverrides”表示:自动覆盖第一个“and”或者“or”

d.后缀的用法类似;

3.增加对应接口,修改单元测试方法调用接口,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testSeletOne() {  
  3.         try {  
  4.   
  5.             Map<String, Object> map = new HashMap<String, Object>();  
  6.             map.put("department""1");  
  7.             map.put("gender""1");  
  8.             map.put("position""工程师");  
  9.             Departments d = new Departments("2""%售%");  
  10.             map.put("d", d);  
  11.             UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);  
  12.             List<UserInfo> UIList = userInfo.findUserInfoByTrim(map);  
  13.             for (UserInfo ui : UIList) {  
  14.                 System.out.println(ui.toString());  
  15.             }  
  16.         } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  
4.运行单元测试方法,观察控制台输出即可。
-------------------------------------------------------------------------------------------------------------------------------------

三。<set>标签

1.注意:此标签用于update语句。请各位看官注意观察书写方法。

2.修改Mapper文件,具体内容如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <update id="updateUserInfoBySet" parameterType="userInfo">  
  2.         update userInfo  
  3.         <set>  
  4.             <if test="mobile!=null">  
  5.                 mobile=#{mobile},  
  6.             </if>  
  7.             <if test="gender!=null">  
  8.                 gender=#{gender},  
  9.             </if>  
  10.             <if test="position!=null">  
  11.                 position = #{position},  
  12.             </if>  
  13.         </set>  
  14.         where userid=#{userid}  
  15.     </update>  
【解释】

a.SQL语句的set被<set>标签替代。

b.每个<if>中语句最后都带有逗号,如果有写过SQL语句的同学就一定知道,最后的逗号是不能有的,因此,这里的<set>标签能够帮助我们自动的移除最后一个<if>中的逗号。

c.<trim>是一个非常强大的标签,因此,我们也可以通过<trim>来实现<set>的功能,如下:【这种写法的运行效果与<set>等价】

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <update id="updateUserInfoBySet" parameterType="userInfo">  
  2.         update userInfo  
  3.         <trim prefix="SET" suffixOverrides=",">  
  4.             <if test="mobile!=null">  
  5.                 mobile=#{mobile},  
  6.             </if>  
  7.             <if test="gender!=null">  
  8.                 gender=#{gender},  
  9.             </if>  
  10.             <if test="position!=null">  
  11.                 position = #{position},  
  12.             </if>  
  13.         </trim>  
  14.         where userid=#{userid}  
  15.     </update>  

3.增加对应接口,修改单元测试方法调用接口,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testUpdate() {  
  3.         try {  
  4.   
  5.             UserInfo ui = new UserInfo("admin""3""经理""77778888","0""admin@email.com"null);  
  6.             UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);  
  7.             int re = userInfo.updateUserInfoBySet(ui);  
  8.             if(re==1){  
  9.                 System.out.println("更新成功");  
  10.             }  
  11.             sqlSession.commit();  
  12.         } catch (Exception e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  
4.运行单元测试方法,观察控制台输出即可

--------------------------------------------------------------------------------------------------------------------------------------------------------

至此,Mybatis最入门---动态查询(choose,when,otherwise)结束


特别备注:

经过上面的叙述与使用,发现<if><where><trim><set>这几个标签能够帮助我们解决绝大多数的增改删查问题。所以,请各位看官之后多多练习吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值