韩震博客|关注于学习java&php与交流

Mybatis最入门---动态查询

admin 2017年09月20日 java框架知识 831 0

[一步是咫尺,一步即天涯]

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

准备工作:


a.操作系统 :win7 x64

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

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

一。<where>标签

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

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

[html] view plain copy
  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" style="font-family: Consolas, "Courier New", Courier, mono, serif; font-size: 12px; background-color: rgb(231, 229, 220); width: 936.531px; overflow-x: auto; overflow-y: hidden; padding-top: 1px; position: relative; margin: 18px 0px !important;">
[java] view plain copy
  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
  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
  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
  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
  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
  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>这几个标签能够帮助我们解决绝大多数的增改删查问题。所以,请各位看官之后多多练习吧

值得一看的IT学习资讯类网站!http://hongsehuoxian.com
看到这里如果这篇文章真的帮到你了,不妨打赏一下哦!

以上就是红色火线JAVA加油站整理的关于Mybatis最入门---动态查询的文章,
希望可以帮到你,如果你有不同的见解可以留言指正哦,避免让别的java小伙伴在走挫折路。
Mybatis最入门---动态查询(choose,when,otherwise)
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信