MyBatis框架的动态sql技术,是一种根据特定条件动态拼装sql语句的功能,它存在的意义是为了解决拼接sql语句字符串的痛点问题
9.1、if
if标签可以通过test属性的表达式进行判断,如果表达的结果为true,则标签内的内容会执行;反之不会被执行
/** * 根据条件查询员工信息 * @param emp * @return */ List<Emp> getEmpByCondition(Emp emp); |
<!--List<Emp> getEmpByCondition(Emp emp);--> <select id="getEmpByCondition" resultType="emp"> select * from emp where 1=1 <if test="empName != null and empName !=''"> and emp_name = #{empName} </if>
<if test="age != null and age !=''"> and age = #{age} </if>
<if test="sex != null and sex !=''"> and sex = #{sex} </if> </select> |
@Test public void testGetEmpByCondition(){ Emp emp = new Emp(null,null,22,null); List<Emp> emps = empMapper.getEmpByCondition(emp); emps.forEach(System.out::println); } |
9.2、where
where和if一般是结合使用:
⑴ 如果where标签中的if条件满足,则where标签会自动添加where关键字
⑵会自动将条件最前方多余的and去掉,注意:where标签不能去掉条件最后多余的and
⑶如果where标签中的if条件都不满足,则where标签没有任何功能,则不添加where关键字
<!-- List<Emp> getEmpByCondition(Emp emp);--> <select id="getEmpByCondition" resultType="emp"> select * from emp <where> <if test="empName != null and empName !=''"> emp_name = #{empName} </if>
<if test="age != null and age !=''"> and age = #{age} and </if>
<if test="sex != null and sex !=''"> and sex = #{sex} </if> </where> </select> |
9.3 trim
trim用于去掉或者添加标签中的内容
<!-- List<Emp> getEmpByCondition(Emp emp);--> <!-- prefix:在trim标签中的内容的前面添加某些内容 prefixOverrides:在trim标签中的内容的前面去掉某些内容 suffix:在trim标签中的内容的后面添加某些内容 suffixOverrides:在trim标签中的内容的后面去掉某些内容 --> <select id="getEmpByCondition" resultType="emp"> select * from emp <trim prefix="where" prefixOverrides="and"> <if test="empName != null and empName !=''"> emp_name = #{empName} </if>
<if test="age != null and age !=''"> and age = #{age} </if>
<if test="sex != null and sex !=''"> and sex = #{sex} </if> </trim> </select> |
9.4、choose、when、otherwise
choose、when、otherwise相当于if ...else if...else
switch case default
<!-- List<Emp> getEmpByChoose(Emp emp);--> <select id="getEmpByChoose" resultType="emp"> select * from emp <where> <choose> <when test="empName != null and empName !=''"> emp_name = #{empName} </when> <when test="age != null and age !=''"> and age = #{age} </when> <when test="sex != null and sex !=''"> and sex = #{sex} </when> </choose> </where> </select> |
9.5、foreach
循环:批量,有规律
⑴批量的添加
/** * 批量添加员工信息 * @param emps */ void insertMoreEmp(@Param("emps") List<Emp> emps); |
<!-- collection:设置要循环的数组或者集合 separator:设置每次循环的数据之间的分隔符 index:用一个字符串表示数组或者集合中的每一个下标 item:用一个字符串表示数组或者集合中的每一个数据 open:循环的所有内容以什么开始 close:循环的所有内容以什么结束 --> <!--void insertMoreEmp(@Param("emps") List<Emp> emps);--> <insert id="insertMoreEmp"> insert into emp values <foreach collection="emps" item="emp" separator="," > (null,#{emp.empName},#{emp.age},#{emp.sex}) </foreach> </insert> |
@Test public void testInsertMoreEmp(){ Emp emp1 = new Emp(null,"小明",22,"男"); Emp emp2 = new Emp(null,"小红",22,"男"); Emp emp3 = new Emp(null,"小马",22,"男"); List<Emp> emps = Arrays.asList(emp1,emp2,emp3); empMapper.insertMoreEmp(emps); } |
⑵批量删除
第一种
/** * 批量删除员工信息 * @param empIds * @return */ Integer deleteMoreEmp(@Param("empIds") Integer[] empIds); |
<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);--> <delete id="deleteMoreEmp"> delete from emp where emp_id in( <foreach collection="empIds" item="empId" separator=","> #{empId} </foreach> ) </delete> |
@Test public void testDeletMoreEmp(){ Integer[] empIds = new Integer[]{10,11,12}; Integer integer = empMapper.deleteMoreEmp(empIds); if(integer>0){ System.out.println("删除成功"); }else { System.out.println("删除失败"); } } |
第二种
<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);--> <delete id="deleteMoreEmp"> delete from emp where emp_id in <foreach collection="empIds" item="empId" separator="," open="(" close=")"> #{empId} </foreach> </delete> |
第三种
<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);--> <delete id="deleteMoreEmp"> delete from emp where <foreach collection="empIds" item="empId" separator="or" > emp_id = #{empId} </foreach> </delete> |
9.6、sql片段
sql片段,可以记录一段公共的sql语句片段,在使用的地方通过include标签进行引入
<!--sql片段--> <sql id="empColumns"> emp_name,age,sex </sql> |
<include refid="empColumns"></include> |