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官网查看

相关推荐
钮钴禄·爱因斯晨5 分钟前
聚焦操作系统中的PV操作
数据库·算法·系统架构·c#
2301_813599555 分钟前
CSS中relative与absolute的区别_详解相对与绝对定位应用场景
jvm·数据库·python
0xDevNull10 分钟前
Java 深度解析:for 循环 vs Stream.forEach 及性能优化指南
java·开发语言·性能优化
qq_3721542314 分钟前
c++怎么在写入文件流时通过peek预读功能实现复杂的逻辑判断【实战】
jvm·数据库·python
博风14 分钟前
在tomcat应用里添加了一个线程池对象,向这个线程池发送任务,让其执行。 我希望在tomcat停机时,能等待线程池里的任务执行完了再停机,要如何实现?
java·tomcat
m0_5145205723 分钟前
CSS如何给按钮添加按下缩小的动画_利用-active配合transform
jvm·数据库·python
yejqvow1224 分钟前
CSS如何制作加载时的点点点跳动效果_使用animation循环延迟
jvm·数据库·python
2401_8359568124 分钟前
CSS如何解决CSS引入后的样式覆盖_理解优先级原则避免重写
jvm·数据库·python
爱学的小码25 分钟前
MySQL(进阶)--存储过程和触发器
数据库·oracle
小旭952727 分钟前
MySql调优详解
数据库·mysql·数据库架构