一、动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题。
1、if、where和trim
(1)if:
通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行
//根据条件查询员工信息
List<Emp> getEmpByCondition(Emp emp);
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
select * from t_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="gender != null and gender != ''">
and gender = #{gender}
</if>
</select>
(2)where:
where和if一般结合使用:
a.若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
b.若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉
注意:where标签不能去掉条件最后多余的and
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
select * from t_emp
<where>
<if test="empName != null and empName != ''">
emp_name = #{empName}
</if>
<if test="age != null and age != ''">
and age = #{age}
</if>
<if test="gender != null and gender != ''">
and gender = #{gender}
</if>
</where>
</select>
(3)trim
trim用于去掉或添加标签中的内容
常用属性:
prefix:在trim标签中的内容的前面添加某些内容
prefixOverrides:在trim标签中的内容的前面去掉某些内容
suffix:在trim标签中的内容的后面添加某些内容
suffixOverrides:在trim标签中的内容的后面去掉某些内容
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="Emp">
select * from t_emp
<trim prefix="where" suffixOverrides="and">
<if test="empName != '' and empName != null">
emp_name = #{empName} and
</if>
<if test="age != '' and age != null">
age = #{age} and
</if>
<if test="sex != '' and sex != null">
gender = #{gender}
</if>
</trim>
</select>
2、choose、when、otherwise
相当于if…else if…else
when至少设置一个,otherwise最多设置一个
<!--List<Emp> getEmpByChoose(Emp emp);-->
<select id="getEmpByChoose" resultType="Emp">
select * from t_emp
<where>
<choose>
<when test="empName != '' and empName != null">
emp_name=#{empName}
</when>
<when test="age != '' and age != null">
age=#{age}
</when>
<when test="gender != '' and gender != null">
gender=#{gender}
</when>
</choose>
</where>
</select>
3、foreach
collection:设置要循环的数组或集合
item:用一个字符串表示数组或集合中的每一个数据
separator:设置每次循环的数据之间的分隔符
open :循环的所有内容以什么开始
close:循环的所有内容以什么结束
批量添加员工信息:
<!--void insertMoreEmp(List<Emp> emps);-->
<insert id="insertMoreEmp">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.empName},#{emp.age},#{emp.gender},null)
</foreach>
</insert>
@Test
public void testInsertMoreEmp(){
SqlSession sqlSession= SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
Emp emp1 =new Emp(null,"小明1",21,"男");
Emp emp2 =new Emp(null,"小明2",22,"男");
Emp emp3 =new Emp(null,"小明3",22,"男");
List<Emp> list =Arrays.asList(emp1,emp2,emp3);
mapper.insertMoreEmp(list);
}
批量删除员工信息:
第一种写法:
<!--void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">
delete from t_emp where emp_id in
(
<foreach collection="empIds" item="empId" separator="," >
#{empId}
</foreach>
)
</delete>
第二种写法:
<!--void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">
delete from t_emp where emp_id in
<foreach collection="empIds" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</delete>
第三种写法:
<!--void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">
delete from t_emp where
<foreach collection="empIds" item="empId" separator="or">
emp_id=#{empId}
</foreach>
</delete>
@Test
public void testDeleteMoreEmp(){
SqlSession sqlSession= SqlSessionUtil.getSqlSession();
DynamicSQLMapper mapper=sqlSession.getMapper(DynamicSQLMapper.class);
Integer[] empIds =new Integer[]{6,7};
mapper.deleteMoreEmp(empIds);
}
4、sql片段
可以记录一段sql,在需要用的地方使用include标签进行引用
设置sql片段:
<sql id="empColumns">
emp_id,emp_name,age,gender,dept_id
</sql>
引用sql片段:
select <include refid="empColumns"></include> from t_emp