Mybatis中动态SQL语句执行的各类标签详解

Mybatis的其它执行情况可以看我之前的博客,这篇文章主要说Mybatis中动态SQL语句执行的各类标签的详解:

MyBatis自定义映射关系resultMap及各种映射关系

Mybatis特殊SQL的执行

MyBatis的各种查询功能

Mybatis获取参数的两种方式及获取参数值的各种情况

1.Mybatis中动态SQL的简介

简单来说:Mybatis动态SQL本质上映射文件中的一系列标签,功能是方便去拼接sql语句

Mybatis在进行多条件查询时,需要考虑什么时候要把条件加入,什么时候不需要将条件加入

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。

2.Mybatis中动态SQL—if标签

Mapper接口中的方法,实现多条件查询:

List getEmpByCondition(Emp emp);

映射文件:


      if标签可通过test属性(即传递过来的数据)的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行。

可以在where后面添加一个恒成立条件`1=1`
    - 这个恒成立条件并不会影响查询的结果
    - 这个`1=1`可以用来拼接`and`语句

例如:当传输过来的empName为null或者为空字符串时

        - 如果不加上恒成立条件,则SQL语句为`select * from t_emp where and age = ? and sex = ? and email = ?`,此时`where`会与`and`连用,SQL语句会报错。
        - 如果加上一个恒成立条件,则SQL语句为`select * from t_emp where 1= 1 and age = ? and sex = ? and email = ?`,此时不报错。

3.Mybatis中动态SQL—where标签

映射文件:


   where和if一般结合使用:
      - 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
      - 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and/or去掉。

测试类:

    @Test
    public void testGetSQLMapperTest(){
        SqlSession sqlSession=SqlSessionUtils.getSqlSession();
        DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
        List list=mapper.getEmpByCondition(new Emp(null,"张三",null,"",""));

        System.out.println(list);
    }

输出结果,注意对应的sql语句,因为empName=“张三”和数据库中的数值对应,因此第一句if语句执行,where标签自动添加了where关键字,并将第一个if条件最前方多余的and去掉了,当然如果这里是or的话也可以去掉。

Mybatis中动态SQL语句执行的各类标签详解_第1张图片

注意:where标签不能去掉条件后多余的and/or

例如这种用法是错误的,只能去掉条件前面的and/or,条件后面的and/or不行

    
    emp_name = #{empName} and
    
    
        age = #{age}
    

 4.Mybatis中动态SQL—trim标签

- trim用于去掉或添加标签中的内容  
- 常用属性
    - prefix:在trim标签中的内容的前面添加指定内容  
    - suffix:在trim标签中的内容的后面添加指定内容 
    - prefixOverrides:在trim标签中的内容的前面去掉某些内容  
    - suffixOverrides:在trim标签中的内容的后面去掉某些内容
- 若trim中的标签都不满足条件,则trim标签没有任何效果,也就是只剩下`select * from t_emp`

映射文件:

    
    
	select * from t_emp
	
		
			
				emp_name = #{empName}
			
			
				age = #{age}
			
			
				sex = #{sex}
			
			
				email = #{email}
			
			
				did = 1
			
		
	

  相当于`if a else if b else if c else d`,只会执行其中一个;

6.Mybatis中动态SQL--foreach标签

foreach标签
- 属性:  
    - collection:设置要循环的数组或集合  
    - item:表示集合或数组中的每一个数据  
    - separator:设置循环体之间的分隔符,分隔符前后默认有一个空格,如` , `
    - open:设置foreach标签中的内容的开始符  
    - close:设置foreach标签中的内容的结束符

利用foreach实现批量删除

Mapper接口中的方法:

int deleteMoreByArray(Integer[] eids);

映射文件:

	
	
		delete from t_emp where eid in
		
			#{eid}
		
	

测试类,删除eid为6,7,8的数据:

    @Test
    public void testDeleteMoreByArray(){
        SqlSession sqlSession=SqlSessionUtils.getSqlSession();
        DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
        int result=mapper.deleteMoreByArray(new Integer[]{6,7,8});
        System.out.println(result);
    }

利用foreach实现批量添加:

Mapper接口中的方法:

int insertMoreByList(List emps);

映射文件:

 
    
        insert  into  t_emp values
         
             (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
         
    

测试类,添加emp1、emp2、emp3信息成员:

    @Test
    public void testInsertMoreByList(){
        SqlSession sqlSession=SqlSessionUtils.getSqlSession();
        DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
        Emp emp1 =new Emp(null,"a1",23,"男","[email protected]");
        Emp emp2 =new Emp(null,"a2",23,"男","[email protected]");
        Emp emp3 =new Emp(null,"a3",23,"男","[email protected]");
        List emps=Arrays.asList(emp1,emp2,emp3);
        System.out.println(mapper.insertMoreByList(emps));
    }

测试结果.emp1、emp2、emp3已经被添加到数据库中:

Mybatis中动态SQL语句执行的各类标签详解_第2张图片

7.sql片段

sql片段可以记录一段公共sql片段在使用的地方通过include标签进行引入
声明sql片段:标签

eid,emp_name,age,sex,email


引用sql片段:标签

```xml

你可能感兴趣的:(Mybatis,java,数据库,开发语言,mybatis,maven,sql,tomcat)