一、动态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映射文件

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

③测试

@Testpublic 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去掉

  • select * from t_empand emp_name = #{empName}and age = #{age}and sex = #{sex}and email = #{email}

    3.trim

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

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

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

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

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

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

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

4.choose、when、otherwise

  • choose、when、otherwise相当于if…else if…else
  • when至少一个,otherwise至多一个
select * from t_empemp_name = #{empName}age = #{age}sex = #{sex}email = #{email}did = 1

只要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}

测试

@Testpublic 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,"男","123@321.com");Emp emp2 = new Emp(null,"b",1,"男","123@321.com");Emp emp3 = new Emp(null,"c",1,"男","123@321.com");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,emailselect from t_empand emp_name = #{empName}and age = #{age}and sex = #{sex}and email = #{email}