文章目录

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

前言

动态 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 字段传递值,如果不传递值,那么这个字段的值就为创建表时定义的默认值,也可以传递值。然后我们运行一下看能达到效果吗?

这里为什么会报错呢?因为 标签是属于 JavaScript 的,所以我们需要使用到 ")

public Integer insertByCondition(UserInfo userInfo);

有人会问了,使用 标签和不使用作用不是一样的吗?对于当前插入数据操作作用是一样的,但是如果我们进行的是修改操作的话,因为我们不知道用户需要修改什么信息,所以我们在写修改操作的话,就需要将所有的字段的修改操作都写上,但是如果我们不使用 标签的话,并且用户在修改的时候,某个信息没有修改话,后端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 语句写在 标签中。

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

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

insert into userinfo(username,`password`,age,

gender,

phone)

values(#{username},#{password},#{age},

#{gender},

#{phone})

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