
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
可理解为:动态SQL指的是根据不同的查询条件 , 生成不同的SQL。
常用的有:
我们使用一张博客表,建表如下:
CREATE TABLE `blog` ( `id` varchar(50) NOT NULL COMMENT '博客id', `title` varchar(100) NOT NULL COMMENT '博客标题', `author` varchar(30) NOT NULL COMMENT '博客作者', `create_time` datetime NOT NULL COMMENT '创建时间', `views` int(30) NOT NULL COMMENT '浏览量' ) ENGINE=InnoDB DEFAULT CHARSET=utf8环境准备 Step1:导入Lombok
不熟悉的话参考:Lombok
Step2:POJO@Data
public class Blog {
private String id;
private String title;
private String author;
private Date createTime;
private int views;
}
Step3:IDutil工具类
博客的ID使用UUID随机生成:
public class IDUtils {
public static String getId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
⚠️:如果随即生成ID,其中会出出现“-”,所以需要利用replace替换掉。
Step4:映射器接口public interface BlogMapper {
//先写一个方法,用于测试环境
int AddBlog(Blog blog);
}
Step5:XML映射器
⚠️:将XML映射器文件建在resource目录下,且需要对应接口路径。
Step6:绑定映射器insert into blog (id, title, author, create_time, views) values (#{id}, #{title}, #{author}, #{createTime}, #{views});
⚠️:数据中的时间的字段和POJO中定义的不一样,所以在核心配置文件中还需要开启驼峰命名自动映射。
Step7:测试程序
@org.junit.Test
public void TestAdd() {
SqlSession sqlSession = MyBatisUtils.GetSqlSession();
BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
Blog blog = new Blog();
blog.setId(IDUtils.getId());
blog.setTitle("MyBatis初始");
blog.setAuthor("JOEL");
blog.setCreateTime(new Date());
blog.setViews(123);
blogMapper.AddBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("MyBatis创建项目");
blogMapper.AddBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("MyBatis配置解析");
blogMapper.AddBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("MyBatis进阶");
blogMapper.AddBlog(blog);
sqlSession.commit();
sqlSession.close();
}
if
使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。比如:
select * from blog where autor = 'JOEL'
根据一个参数查询很方便,那如果是多个呢?
需求:根据标题或作者查询博客。
这是就需要判断,判断给的值是否为空来动态添加SQL语句:
select * from blog wheretitle = #{title} and author = #{author}
是不是很像JSTL,不如回顾下:EL表达式和JSTL
where if当SQL中用到where条件,可以利用where标签:
select * from blogtitle = #{title} and author = #{author}
这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
set if同理,上面的对于查询 SQL 语句包含 where 关键字,如果在进行更新操作的时候,含有 set 关键词,我们怎么处理呢?
update blog
title = #{title},
author = #{author}
where id = #{id};
⚠️逗号要加在上一个的末尾。
choose when otherwise有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句
select * from blogForeachtitle = #{title} and author = #{author} and views = #{views}
将数据库中前三个数据的id修改为1,2,3(id太长,先改过来);
需求:我们需要查询 blog 表中 id 分别为1,2,3的博客信息
SQL语句:select * from blog where id = "1" or id = "1" or id = "1"
select * from blog写在最后id=#{id}
其实动态 SQL语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 MyBatis 动态SQL对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。
(" close=")" separator=“or”>
id=#{id}
# 写在最后 其实动态 SQL语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 MyBatis 动态SQL对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。 ------ ❤️ END ❤️