一、引入
随着用户的输入或外部条件的变化而变化的SQL语句,称之为动态SQL。
原本的查询条件只要有一个条件没填上就无法查询
增加了if标签如下:
二、if标签
if标签
用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL。
where标签
会自动判断where中的条件是否成立,只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头的AND和OR
set标签
动态的在首行插入SET关键字,并会删除额外的逗号(用在update语句中)
(一)动态查询
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.EmpMapper">
<!--查询-->
<!--id:与原本查询的方法名相同-->
<!--resultType:单挑记录封装的类型(该类型的全类名)此时查询返回的是一个Emp,所以拷贝emp的全类名-->
<select id="list" resultType="org.example.pojo.Emp">
select *
from emp
<where>
<if test="name != null">
name like concat('%',#{name},'%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="begin != null and end != null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
</mapper>
运行结果:
(二)动态更新
EmpMapper.xml映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.EmpMapper">
<!--动态更新-->
<update id="update2">
update emp
<set>
<if test="username != null">username = #{username},</if>
<if test="name != null">name = #{name},</if>
<if test="gender != null ">gender = #{gender},</if>
<if test="image != null ">image = #{image}, </if>
<if test="job != null "> job = #{job}, </if>
<if test="entrydate != null ">entrydate = #{entrydate},</if>
<if test="deptId != null ">dept_id = #{deptId}, </if>
<if test="updateTime != null">update_time = #{updateTime}</if>
</set>
where id = #{id}
</update>
</mapper>
EmpMapper.java:
package org.example.mapper;
import org.apache.ibatis.annotations.*;
import org.example.pojo.Emp;
import java.time.LocalDate;
import java.util.List;
@Mapper
public interface EmpMapper {
//动态查找
public void update2(Emp emp);
}
测试文件:
package org.example;
import org.apache.ibatis.annotations.Param;
import org.example.mapper.EmpMapper;
import org.example.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class SpringbootMybatisCrudsApplicationTests {
@Autowired
private EmpMapper empMapper;
//动态更新员工,更新ID为18的员工
@Test
public void testUpdate2(){
//构造员工对象
Emp emp = new Emp();
emp.setId(18);
emp.setUsername("Tom123");
emp.setName("汤姆狗");
emp.setEntrydate(LocalDate.of(2000,1,1));
emp.setUpdateTime(LocalDateTime.now());
emp.setDeptId(1);
empMapper.update2(emp);
}
}
结果:
三、foreach标签
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.EmpMapper">
<!--collection:遍历的集合-->
<!--item:遍历出来的元素-->
<!--open:遍历开始前拼接的集合片段-->
<!--close:遍历结束后拼接的集合片段-->
<!--separator:分隔符-->
<!--批量删除员工数据-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
</mapper>
EmpMapper.java:
//批量删除员工
public void deleteByIds(@Param("ids") List<Integer> ids);
测试:
@Test
//批量删除员工
public void testDeleteByIds(){
List<Integer> ids = Arrays.asList(13,14,15);
empMapper.deleteByIds(ids);
}
结果:
四、sql、include
在开发后期,会涉及到修改表名和表的字段名,复用性会变差。
sql
抽取sql片段,include
在原代码中重新引入该片段