MyBatis基础使用四
动态SQL
一、多条件查询语句
通过 标签进行的多条件查询,通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中)
<select id="SelectConditionOld" resultType="com.wfy.pojo.Emp">
select * from 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>
问题:if判断是直接拼接在sql查询语句之后,如果输入的数据为null或空字符串,则会拼接一个空的and(若都为空则会拼接一个where)都会导致错误
解决方案:
- 在where判断语句后加上恒等式1=1,第一个if标签内加上and
<select id="SelectConditionOld" resultType="com.wfy.pojo.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="gender !=null and gender !=''">
and gender=#{gender}
</if>
</select>
- 通过
标签进行设置
<select id="SelectConditionTwo" resultMap="DynamicSQLResultMap">
select * from 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>
where标签的功能:
a. 若where标签中有条件成立,会自动生成where关键字
b. 会自动将where标签中内容多余前的and去掉,但是其中内容多余后的and标签无法去除
c. 若where标签中没有任何一个条件成立,则where没有任何功能
- 通过
标签进行设置
<select id="SelectCondition" resultMap="DynamicSQLResultMap">
select * from emp
<trim prefix="where" suffixOverrides="and">
<if test="empName !=null and empName !=''">
emp_name=#{empName} and
</if>
<if test="age !=null and age !=''">
age=#{age} and
</if>
<if test="gender !=null and gender !=''">
gender=#{gender}
</if>
</trim>
</select>
trim标签的功能:
a. prefix、suffix:在标签中内容前或内容后面添加指定内容
b. prefixOverrides、suffixOverrides: 在标签中内容前或内容后面去掉指定内容
、 、 标签进行设置
<select id="SelectByChoose" resultMap="DynamicSQLResultMap">
select * from 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>
这三个标签相当于java中的if....else if....else
when至少设置一个,otherwise至多设置一个
二、批量操作语句
通过foreach标签进行批量操作
- 批量插入对象数组或集合
<insert id="InsertMoreEmp">
insert into emp values
<foreach collection="emps" item="emp" separator=",">
(null,#{emp.empName},#{emp.age},#{emp.gender},null)
</foreach>
</insert>
- 根据id集合或数组等批量删除数据
- 第一种方式:
<delete id="DeleteMoreEmpOne">
delete from emp where emp_id in
(
<foreach collection="empIds" item="empId" separator=",">
#{empId}
</foreach>
)
</delete>
- 第二种方式:
<delete id="DeleteMoreEmpTwo">
delete from emp where emp_id in
<foreach collection="empIds" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</delete>
- 第三种方式:
<delete id="DeleteMoreEmp" >
delete from emp where
<foreach collection="empIds" item="empId" separator="or">
emp_id=#{empId}
</foreach>
</delete>
foreach标签中各各标签的功能:
collection:设置循环的数组或集合
item:用一个字符串来表示数组或集合中的每个数据
separator:设置每次循环的数据之间的间隔符
open:循环的所有内容以什么开始
close:循环的内容以什么结束
补充内容:sql片段
sql片段:可以记录一段sql,在需要使用的地方使用include标签进行引用
<sql id="empColumns">
emp_id,emp_name,age,gender,dept_id
</sql>
<select id="SelectAllEmpBySql" resultMap="DynamicSQLResultMap">
select <include refid="empColumns"></include> from emp
</select>
标签:gender,name,标签,age,基础,emp,使用,MyBatis,where
From: https://www.cnblogs.com/wfy-studying/p/16811692.html