(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)是必须有的。