javaweb_11:动态SQL

12 篇文章 0 订阅

一、引入

随着用户的输入或外部条件的变化而变化的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在原代码中重新引入该片段
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值