MyBatis动态SQL:打造灵活可变的数据库操作

目录

动态SQL就是根据不同的条件或需求动态地生成查询语句,比如动态搜索条件、动态表或列名、动态排序等。

if标签

在我们填写一些信息时,有些信息是必填字段,有的则是非必填的,这些信息的传入就需要使⽤动态标签 if来判断了

创建这样想学生表就可以进行测试了

sql 复制代码
drop table if exists stu;
create  table stu(
    id int primary key auto_increment,
    name varchar(100) ,
    sex  varchar(10) 

) default charset 'utf8mb4';

下面是xml语句

xml 复制代码
  <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.mybatisdemo.model.User">
        INSERT INTO stu(name
        <if test="sex != null">, sex</if>) VALUES (#{name}
        <if test="sex != null">, #{sex}</if>)
    </insert>


通过结果我们发现,数据已经被插入进入数据库了,并且sex为空。

trim标签

如果所有字段都是⾮必填项,可以考虑使⽤trim 标签结合if 标签,对多个字段都采取动态⽣成的⽅式。

trim标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

通过对前面的xml代码进行修改结果如下:

xml 复制代码
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.example.mybatisdemo.model.User">
        INSERT INTO stu
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="name != null ">name,</if>
            <if test="sex != null">sex</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="name != null">#{name},</if>
            <if test="sex != null">#{sex}</if>
        </trim>


    </insert>


数据添加成功,依旧只添加了姓名。

where标签

根据属性做 where 条件查询,⽤户对象中属性不为 null 的,都为查询条件。

写一个查询方法:

java 复制代码
  @RequestMapping("selectByCondition")
    public List<User> selectByCondition(User user){
        return userService.selectByCondition(user);
    }

xml代码如下:

xml 复制代码
 </insert>
    <select id="selectByCondition" parameterType="com.example.mybatisdemo.model.User"  >
             select id,name,sex from stu
        <where>
            <if test="name != null "> and  name=#{name} </if>
            <if test=" sex != null"> and  sex= #{sex}  </if>
        </where>
    </select>

根据name进行查询

xml 复制代码
<where>标签也可以使⽤ <trim prefix="where" prefixOverrides="and"> 替换。

set标签

根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤set标签来指定动态内容。

UserMapper 接⼝中修改⽤户⽅法:根据传⼊的⽤户 id 属性,修改其他不为 null 的属性:

java 复制代码
int updateById(User user);

在xml中添加更新⽤户 sql:

xml 复制代码
 <update id="updateById" parameterType="com.example.mybatisdemo.model.User" >
        update stu
        <set>

            <if test="name != null">
                name=#{name},
            </if>
            <if test="sex != null">
                sex=#{sex},
            </if>
        </set>
        where id=#{id}
    </update>

查看数据库发现修改成功

xml 复制代码
<set>标签也可以使⽤ <trim prefix="set" suffixOverrides=","> 替换

foreach标签

对集合进⾏遍历时可以使⽤该标签。foreach标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:用于指定循环迭代时元素之间的分隔符

例如一次性删除多个id对应的用户

ArticleMapper 中新增接⼝⽅法:

java 复制代码
int deleteByIds(List<Integer> ids);

UserMapper.xml 中新增删除 sql:

xml 复制代码
  <delete id="deleteByIds">
        delete from stu
        where id in
        <foreach collection="list" item="item" open="(" close=")" separator=","
        >
            #{item}
        </foreach>
    </delete>

我们删除id为1,2,3的用户信息

通过查看数据库我们知道,删除已经成功。

以上就是我记录的一些动态SQL,如果想了解更多可前往mybatis官网查看

相关推荐
我登哥MVP2 分钟前
Spring Boot 从“会用”到“精通”:Model-Map原理
java·spring boot·后端·spring·servlet·maven·mybatis
学代码的真由酱2 分钟前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计
程序猿乐锅7 分钟前
【苍穹外卖|Day02】后台接口自测闭环:Token、DTO 与 yml 配置
java·开发语言
Upsy-Daisy7 分钟前
Hermes Agent 学习笔记 01:一个会记忆、会学习、能长期运行的 AI Agent
人工智能·笔记·学习
心之伊始10 分钟前
Spring Boot Actuator + Micrometer 自定义业务指标:不只是健康检查
java·架构·源码分析·csdn
我命由我1234510 分钟前
工程中安全帽颜色含义
运维·经验分享·学习·职场和发展·求职招聘·职场发展·学习方法
Eason_LYC17 分钟前
【GetShell 实战】CVE-2026-34486 Tomcat 加密拦截器绕过:从漏洞验证到反弹 Shell 全流程
java·渗透测试·tomcat·java反序列化·rce·远程代码执行漏洞·cve-2026-34486
qq_25183645723 分钟前
基于java 税务管理系统设计与实现
java·开发语言
遇事不決洛必達23 分钟前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务
超梦dasgg27 分钟前
Java 生产环境分布式定时任务全解(实战落地版)
java·开发语言·分布式