动态sql
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的 , 唯一变化的只要参数 .
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如, 原生的jdbc模糊查询中使用的sql拼接时判断参数问题 , 这时参数是不固定的 , sql也是变化的 .
Mybatis对sql进行灵活操作,可以通过mybatis语法的判断对sql进行灵活封装,拼接
1.1 if语句
1.1.1 需求
查询员工表的员工信息,按多个条件中的某些条件查询(例如传入姓名,薪资等)
思考:
如果传入姓名为空,那么在sql中就不拼接条件,否则就把需要的sql拼接.
1.1.2定义接口
1.1.3 映射文件
1.1.4 测试代码
@Test
public void findEmp() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
try{
EmpMapper m = session.getMapper(EmpMapper.class);
//把参数封装到对象
Emp emp = new Emp();
//依次传入参数看打印的sql语句的变化
emp.setId(1);
emp.seteName("%马%");
emp.setSal(8888);
List<Emp> list = m.findEmpByCond(emp);
System.out.println(list);
}finally{
session.close();
}
}
1.1.5 打印结果:
DEBUG 05-02 19:56:12,515 ==> Preparing: select * from emp where id=? and e_name like ? and sal=? (BaseJdbcLogger.java:145)
DEBUG 05-02 19:56:12,567 > Parameters: 1(Integer), %马%(String), 8888(Integer) (BaseJdbcLogger.java:145)
DEBUG 05-02 19:56:12,586 < Total: 1 (BaseJdbcLogger.java:145)
[Emp [id=1, eName=马云, sal=8888, did=10, dept=null]]
这里的sql语句是使用动态sql中的if判断进行拼接的,这里面的判断条件有些地方还是需要继续修改的.
在mapper.xml中修改判断条件:
-
按照以前的做法,写一个假判断来完成
2 -
使用标签,把所有需要判断的条件放进标签中即可
-
解决办法:
使用标签:
select
*
from emp<!-- 后面多出的and或者or where标签不能解决 可以使用trim标签解决 标签中的可选属性: prefix="":前缀:trim标签体中是整个字符串拼串后的结果。 prefix给拼串后的整个字符串加一个前缀 prefixOverrides="": 前缀覆盖: 去掉整个字符串前面多余的字符 suffix="":后缀 suffix给拼串后的整个字符串加一个后缀 suffixOverrides="" 后缀覆盖:去掉整个字符串后面多余的字符 自定义字符串的截取规则 --> <trim prefix="where" suffixOverrides="and"> <if test="id!=null and id!=''"> id=#{id} and </if> <if test="eName!=null and eName!=''"> e_name like #{eName} and </if> <if test="sal!=null and sal!=''"> sal=#{sal} </if> </trim>