八、动态SQL

一、动态SQL

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

1.if标签

  • If标签可通过test属性(传递过来的数据)的表达式进行判断。 如果为true标签执行。
  • 在where 后面添加1=1横成立条件

  如果不加这个条件,此刻empName为空的时候,SQL拼接出错select * from t_emp where and age = ? and sex = ? and email = ? 因为where和and连用 

①DynamicSQLMapper接口

/**
 * 多条件查询
 */
List getEmp(Emp emp);

②DynamicSQLMapper映射文件




    

③测试

@Test
public void t1() {
   SqlSession sqlSession = SqlSessionUtils.getSqlSession();
   DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
   Emp emp = new Emp();
   emp.setEmpName("wang");
   List emp1 = mapper.getEmp(emp);
   System.out.println(emp1);
}

2.where标签

  • where和if结合
  • 如果所有if标签都不满足,不会在SQL语句拼接where关键字

    如果有if标签满足。会自动添加where关键字,并把条件前面多余的and/or去掉

  • 
    
    
        
    
    

    3.trim

  • trim用于去掉或添加标签中的内容
  • 常用属性
  • prefix:trim标签内容的前面添加某些内容

    suffix:在trim标签内容后面添加某些内容

    prefixOverrides:在trim标签内容前面去掉某些内容

    suffixOverrides:在trim标签内容后面去掉某些内容

  • 若trim中的标签都不满足条件,则trim标签没有任何效果,也就是只剩下select * from t_emp

在trim前面加上where,去掉最后面的and




    

4.choose、when、otherwise

  • choose、when、otherwise相当于if…else if…else
  • when至少一个,otherwise至多一个



    

只要when有一个条件成立,when后面的都不执行。When条件都不成立,执行otherwise

5.foreach

  • 属性
  • collection:设置要循环的数组或集合

    item:表示集合或数组的每一个数据

    separator:设置循环之间的分隔符,分隔符前后默认有一个空格

    open:设置foreach标签内容开始符

    close:设置foreach标签内容的结束符

  1. 批量删除
  • 通过数组实现批量删除
  • 除了实体类和Map集合之外,其他参数方式手动加上@Param("xxx")

在DynamicSQLMapper接口里

/**
 * 通过数组实现批量删除
 * 除了实体类对象和Map集合,参数其他方式手动加上@Param("eids")
 */
int deleteByArray(@Param("eids") Integer[] eids);

在DynamicSQLMapper映射文件里





    
        delete from t_emp where eid in
        
            #{eid}
        
    

测试

@Test
public void t1() {
   SqlSession sqlSession = SqlSessionUtils.getSqlSession();
   DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
   int deleteCount = mapper.deleteByArray(new Integer[]{5, 6});
   System.out.println("删除成功:"+deleteCount+"条");
}

2.批量删除 

①在DynamicSQLMapper接口

/**
 * 通过List实现批量添加
 */
int insertByList(@Param("emps") List emps);

②在DynamicSQLMapper映射文件

实体类对象可以通过#{属性名}得到属性值,如果传过来的是List,#{item.属性名}




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


 ③测试

   @Test
   public void t1() {
      SqlSession sqlSession = SqlSessionUtils.getSqlSession();
      DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
      Emp emp1 = new Emp(null,"a",1,"男","[email protected]");
      Emp emp2 = new Emp(null,"b",1,"男","[email protected]");
      Emp emp3 = new Emp(null,"c",1,"男","[email protected]");
      List emps = Arrays.asList(emp1,emp2,emp3);
      int i = mapper.insertByList(emps);
      System.out.println("成功添加:"+i+"条");
   }

二、SQL片段 

      eid,emp_name,age,sex,email

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



    eid,emp_name,age,sex,email
    

 

你可能感兴趣的:(sql,mybatis,数据库)