MyBatis--动态SQL(if用法)

(ps:基础配置及简单的单表操作不赘述,没基础看不懂自行百度)

  动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

  使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件,它也经常用于UPDATE语句中判断是否更新某一字段,还可以在INSERT语句中用来判断是否插入某个字段的值。

  假设需求:实现一个用户管理高级查询功能,根据输入的条件去检索用户信息,当只输入用户时,需要根据用户名进行模糊搜索;当只输入邮箱时,根据邮箱进行匹配;当同时输入用户名和邮箱时,用这两个条件去查询匹配的用户。

 首先需要在UserMapper接口中增加对应的接口方法,代码如下:

 

1  /**
2      * 根据动态条件查询用户信息
3      * @param user
4      * @return
5      */
6     List<SysUser> selectByUser(SysUser user);

 

 XML文件SQL

 1 <select id="selectByUser" resultType="SysUser">
 2    select id,
 3     user_name userName,
 4     user_password userPassword,
 5     user_email userEmail,
 6     user_info userInfo,
 7     create_time createTime
 8    from sys_user
 9    where 1 = 1 
10    <if test="userName != null and userName !=‘‘">
11    and user_name like concat(%,#{userName},%)
12    </if>
13    <if test="userEmail != null and userEmail !=‘‘">
14       and user_email like concat(%,#{userEmai},%)
15    </if>
16 </select>

 

  • 注意SQL中where关键字后面的条件

    where 1 = 1

  由于两个条件都是动态的,所以如果没有1=1这个默认条件,当两个if判断都不满足时,最后生成的SQL就会以where结束,这样不符合SQL规范,因此就会报错。加上1=1这个条件就可以避免SQL语法错误导致的异常。这种写法并美观,后面可以使用where标签替代这种写法。

  • 注意条件中的and(或or)

  这里的and(或or)需要手动添加,当这部分条件拼接到where 1 = 1 后面时仍然是合法的SQL,因为有默认的1=1这个条件,我们才不需要判断第一个动态条件是否需要加上and(或or),因为这种情况下and(或or)是必须有的。

 

MyBatis--动态SQL(if用法)

上一篇:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:解决办法


下一篇:Oracle GoldenGate 12.3.0.1.4 in Oracle 12.2 之03(预安装)