动态SQL

85 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能

,它存在的意义是为了解决 拼接SQL语句字符串的痛点问题

if和where标签

<select id="getEmpByCondition1" 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>
<!--    if通过test属性中的表达式判断标签中的内容是否邮箱 是否会拼接到sql中
2.where
a.若where标签中有条件成立 会自动生成where关键字
b.会自动将where标签中内容前多余的and去掉,但是内容后多余的and无法去掉
c.若where标签中没有任何一个条件成立,则where没有任何功能-->
    <select id="getEmpByCondition" resultType="Emp">
        select * from t_emp
        <where>
        <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>
        </where>
    </select>

在使用 if拼接查询出现条件都对却查不出数据的情况

image-20221013211738353.png

上网查找资料最后发现应该是数据库的编码问题更改jdbc.properties中的jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=UTF-8

再次查询出现数据

image-20221013211750104.png

trim标签

<!--    3.trim prefix,suffix 在标签中内容前面或后面添加指定内容
perfixOverrides,suffixOverrides:在标签中内容前面或后面去掉指定内容-->
<select id="getEmpByCondition" resultType="Emp">
    select * from t_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>
####  foreach批量处理
<!--      void insertMoreEmp(@Param("emps") 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>
<!--    void deleteMoreEmp(@Param("empIds") Integer empIds);-->
    <delete id="deleteMoreEmp1">
        delete from t_emp where emp_id in
        <foreach collection="empIds" item="empId" separator="," open="(" close=")">
            #{empId}
        </foreach>
    </delete>
    <delete id="deleteMoreEmp">
        delete from t_emp where
        <foreach collection="empIds" item="empId" separator="or">
            emp_id = #{empId}
        </foreach>
    </delete>
<!--    foreach
collection设置要循环的数组或集合
item 用一个字符串表示数组或集合中的每一个数据
separator 设置每次循环的数据之间的分隔符
open 循环的所有内容以什么开始
close 循环的所有内容以什么结束-->

插入的格式

image-20221013222801664.png 删除的第一种格式

image-20221013222830788.png

删除的第二种格式

image-20221013222830788.png

sql标签

<!--sql片段
可以记录一段sql,在需要用的地方使用include标签进行引用
 <sql id="empColumns">
        emp_id,emp_name,age,gender,dept_id
    </sql>
    <include refid="empColumns"></include>-->

引入效果

image-20221013222830788.png