最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸!
本篇博客主要讲解如何使用如果标签生成动态的Sql,主要包含以下3个场景:
1。根据查询条件实现动态查询
2.根据参数值实现动态更新某些列
3 .根据参数值实现动态插入某些列
假设有这样1个需求:根据用户的输入条件来查询用户列表,如果输入了用户名,就根据用户名模糊查询,如果输入了邮箱,就根据邮箱精确查询,如果同时输入了用户名和邮箱,就用这两个条件去匹配用户。
首先,我们在接口SysUserMapper中添加如下方法:
/* * *根据动态条件查询用户信息 * * @param sysUser * @return */ListselectByUser (SysUser SysUser);
然后在对应的SysUserMapper.xml中添加如下代码:
& lt;选择id=" selectByUser " resultType=癱om.zwwhnly.mybatisaction.model.SysUser”比; 选择id, user_name, user_password, user_email, create_time 从sys_user 1=1 & lt;如果测试="用户名=null和用户名!=" "比; 和user_name CONCAT (“%”, # {userName}, ' % ') & lt;/if> & lt;如果测试=" userEmail !=null和userEmail !=" "比; 和user_email=# {userEmail} & lt;/if> & lt;/select>
代码简单讲解:
1)如果标签属的测试性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用真或假作为结果。
2)判断条件财产!=null或财产==null,适用于任何类型的字段,用于判断属性值是否为空。
3)判断条件财产!=盎虿撇?=?仅适用于字符串类型的字段,用于判断是否为空字符串。
4)当有多个判断条件时,使用,或或进行连接,嵌套的判断可以使用小括号分组,和相当于Java中的与(,,),或相关于Java中的或(| |)。
所以上面代码的意思就是先判断字段是否为null,然后再判断字段是否为空字符串。
最后,在SysUserMapperTest测试类中添加如下测试方法:
@Test 公共空间testSelectByUser () { SqlSession SqlSession=getSqlSession (); 尝试{ SysUserMapper SysUserMapper=sqlSession.getMapper (SysUserMapper.class);//只按用户名查询 SysUser查询=new SysUser (); query.setUserName(“广告”); ListsysUserList=sysUserMapper.selectByUser(查询); Assert.assertTrue (sysUserList.size()在0);//只按邮箱查询 查询=new SysUser (); query.setUserEmail (“test@mybatis.tk”); sysUserList=sysUserMapper.selectByUser(查询); Assert.assertTrue (sysUserList.size()在0);//同时按用户民和邮箱查询 查询=new SysUser (); query.setUserName(“广告”); query.setUserEmail (“test@mybatis.tk”); sysUserList=sysUserMapper.selectByUser(查询);//由于没有同时符合这两个条件的用户,因此查询结果数为0 Assert.assertTrue (sysUserList.size ()==0); 最后}{ sqlSession.close (); } }
运行测试代码,测试通过,输出日志如下:
调试(主要)-==比;准备:选择id、user_name user_password user_email,从sys_user create_time 1=1和user_name CONCAT (" % " & # 63; ' % ') 调试(主要)-==比;参数:广告(字符串) 跟踪[主要]- & lt;==列:id、user_name, user_password, user_email create_time 跟踪[主要]- & lt;==行:1,管理,123456年,admin@mybatis。tk, 2019-06-27 18:21:07.0 调试(主要)- & lt;==总:1 调试(主要)-==比;准备:选择id、user_name user_password, user_email, create_time从sys_user 1=1和user_email=& # 63; 调试(主要)-==比;参数:test@mybatis.tk(字符串) 跟踪[主要]- & lt;==列:id、user_name, user_password, user_email create_time 跟踪[主要]- & lt;==行:1001年,测试,123456年,test@mybatis。tk, 2019-06-27 18:21:07.0 调试(主要)- & lt;==总:1 调试(主要)-==比;准备:选择id、user_name user_password, user_email, create_time从sys_user 1=1和user_name CONCAT(" % " & # 63; ' % ')和user_email=& # 63; 调试(主要)-==比;参数:广告(字符串),test@mybatis.tk(字符串) 调试(主要)- & lt;==总:0
假设有这样1个需求:更新用户信息的时候不能将原来有值但没有发生变化的字段更新为空或空,即只更新有值的字段。