现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间。
新建表d_user:
建表成功:
新建实体类User:
创建查询条件实体类ConditionUser:
新建映射文件userMapper.xml:
编写测试类:
运行结果:
注意:
- 在配置文件中编写sql语句时,为防止大于号和小于号在表示大小关系和表示标签符号之间产生混淆,所以通常用>;和<;来代替sql语句中大于号和小于号。
- 在SQL语句中添加动态SQL标签if的原因是,当在后台获取的name属性值为null时,防止生成where name like %null%的条件判断语句,正确的逻辑应该是,当传来的name属性值为null时,取消此筛选条件,即不使用where name like ?的判断条件。在mybatis中,可用的动态SQL标签有:if,choose(when,otherwise),trim(where,set),foreach。
- 在使用模糊查询时,拼接%+#{name}+%的方法有如下几种:
(1).像上述例子中一样,在SQL语句中使用CONCAT关键字。
(2).使用${}代替#{}:
注意,默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句,并且安全地设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。例如:
执行SQL:select from emp where name = #{employeeName}
参数:employeeName=>Smith
解析后执行的SQL:select from emp where name = ?
执行SQL:Select from emp where name = ${employeeName}
参数:employeeName传入值为:Smith
解析后执行的SQL:Select from emp where name =Smith
综上所述,\${}方式可能会引发SQL注入的问题,同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,应尽量使用#{}。当需要直接插入一个不做任何修改的字符串到SQL语句中,例如在ORDER BY后接一个不添加引号的值作为列名,这时候就需要使用${}。
(3).在程序中拼接。