MyBatis学习(三)
动态SQL语句
MyBatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题
if
if,通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中)
<!-- 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>
</select>
where
where标签
a>若where标签中有条件成立,会自动生成where关键字
b>会自动where标签中内容前多余的and去掉,但是其中内容后多余的and无法去掉
c>若where标签中没有任何一个条件成立,则where标签没有任何功能
<!-- List<Emp>getEmpByCondition(Emp emp); -->
<select id="getEmpByConditionOne" 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>
trim
虽然where标签可以把内容前的and去掉,但是如果是最后的条件并且不符合以及有and,那么where条件是不能处理的
trim
prefix、suffix:在标签中内容前面或内容后面添加指定内容
prefixOverrides、suffixOverrides:在标签中内容前面或内容后面去掉指定内容
<!-- List<Emp>getEmpByCondition(Emp emp); -->
<select id="getEmpByCondition" resultType="Emp">
select * from t_emp
<trim prefix="where" suffixOverrides="and"><!-- prefix 前缀 suffix 后缀 Overrides 去掉-->
<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>
</trim>
</select>
这里trim配置的属性反而又有点Thymeleaf的视图处理模板,所以编程的技术就是慢慢累计,概念也总是互通的
choose、when、otherwise
choose(if)、when(else if)、otherwise(else)
相当于java中的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 != null and empName !=''">
emp_name = #{empName}
</when>
<when test="age != null and age != ''">
age = #{age}
</when>
<when test="gender != null and gender != ''">
gender = #{gender}
</when>
</choose>
</where>
</select>
foreach
批量添加
<!-- void insertMoreEmp(@Param("emps")List<Emp>emps); -->
<insert id="insertMoreEmp" useGeneratedKeys="true" keyProperty="empId">
insert into t_emp values
<!-- collection表示集合名 item表示项(元素) separator表示分隔符 -->
<foreach collection="emps" item="emp" separator=","><!-- separator分隔符 -->
(null,#{emp.empName},#{emp.age},#{emp.gender},null)<!-- 集合有多少元素就insert into values多少次 -->
</foreach>
</insert>
void insertMoreEmp(@Param("emps") List<Emp>emps);
SqlSession sqlSession = SqlsessionUtil.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
Emp emp1 = new Emp(null,"小明1",20,"男");
Emp emp2 = new Emp(null,"小明2",20,"男");
Emp emp3 = new Emp(null,"小明3",20,"男");
List<Emp> list = Arrays.asList(emp1, emp2, emp3);
mapper.insertMoreEmp(list);