【MyBatis】动态SQL

【MyBatis】动态SQL_第1张图片

文章目录

  • 前言
  • 增加操作
  • \标签
  • 查询操作
  • \标签
  • 修改操作
  • \标签
  • 删除操作
  • \标签
  • \标签

前言

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。具体的定义大家可以参考官方文档MyBatis动态SQL。这篇文章我们将结合动态SQL完成更加复杂的 SQL 操作。

增加操作

想必大家肯定遇到过注册某个账号的时候需要输入自己的相关信息,其中这些信息包括:必填信息和非必填信息,对于这些必填信息,我们只需要在创建表的时候将这个字段设置为非 null 就可以了,而对于那些非必选的选项,我们又该如何定义呢?

这时就需要我们使用动态标签来判断了,对于这些可以传递值和可以不传递值的字段,我们可以使用 标签来修饰:

@Insert("insert into userinfo(username,`password`,age," +
        "gender," +
        "phone)" +
        "values(#{username},#{password},#{age}," +
        "gender," +
        "#{phone})")
public Integer insertByCondition(UserInfo userInfo);

123 这个标签中 test 表示的是判断,当 test 参数中的判断为真时,那么这个标签的结果就为 标签之间的代码块,在这里就是123;如果 test 中的代码块的判断为假的时候,那么这个 标签的结果就是空。

@Test
void insertByCondition() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("彭于晏");
    userInfo.setPassword("123456");
    userInfo.setAge(18);
    userInfo.setPhone("132131231");
    int ret = userInfoMapper.insertByCondition(userInfo);
    log.info(ret + "被更新");
}

然后我们调用这个方法的时候,可以不为 gender 字段传递值,如果不传递值,那么这个字段的值就为创建表时定义的默认值,也可以传递值。然后我们运行一下看能达到效果吗?

【MyBatis】动态SQL_第2张图片
这里为什么会报错呢?因为 标签是属于 JavaScript 的,所以我们需要使用到 ") public Integer insertByCondition(UserInfo userInfo);

【MyBatis】动态SQL_第3张图片
有人会问了,使用 标签和不使用作用不是一样的吗?对于当前插入数据操作作用是一样的,但是如果我们进行的是修改操作的话,因为我们不知道用户需要修改什么信息,所以我们在写修改操作的话,就需要将所有的字段的修改操作都写上,但是如果我们不使用 标签的话,并且用户在修改的时候,某个信息没有修改话,后端SQL预处理之后是这样的:update userinfo set username=?, password=?, gender=?, phone=? where username=?,前端传递来的参数是这样的:null, null, null, 123456, 小美,也就是用户只是修改了电话号码这个字段,但是因为没有使用 标签,所以其他的字段就会被修改为 null,这就会出现问题了。而使用 标签就会这样处理:update userinfo phone=? where username=?,参数传递:123456, 小美

上面是使用注解的方式来实现 MyBatis 的,实现 MyBatis 不仅可以通过注解来实现,也可以通过 XML 的格式实现。我们看看 XML 如何实现动态 SQL。

首先我们需要告诉 MyBatis 我们的 xml 文件在哪里:

mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

然后在 XML 文件中写入下面代码,SQL 语句写在 标签中。


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatis20240101.mapper.UserInfoMapper">

mapper>

这里 namespace 的值是我们是使用了 MyBatis 框架操作数据库的类的全限定类名称。

<insert id="insertByCondition">
    insert into userinfo(username,`password`,age,
    <if test="gender!=null">
            gender,
    if>
    phone)
    values(#{username},#{password},#{age},
    <if test="gender!=null">
        #{gender},
    if>
     #{phone})
insert>

因为 XML 文件本身就支持 JavaScript,所以我们这里不需要添加

你可能感兴趣的:(MyBatis,mybatis,sql,spring,boot)