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>
|