2021-04-06

											动态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中修改判断条件:

  1. 按照以前的做法,写一个假判断来完成
    2在这里插入图片描述

  2. 使用标签,把所有需要判断的条件放进标签中即可

  3. 在这里插入图片描述
    解决办法:
    使用标签:

    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>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值