栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

MyBatis-动态SQL

Java 更新时间:发布时间: 百科书网 趣学号
什么是动态SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

 可理解为:动态SQL指的是根据不同的查询条件 , 生成不同的SQL。

常用的有:

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach
前期准备 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目录下,且需要对应接口路径。




    
        insert into blog (id, title, author, create_time, views)
        values (#{id}, #{title}, #{author}, #{createTime}, #{views});
    

Step6:绑定映射器

    

⚠️:数据中的时间的字段和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 where

    title = #{title}


    and author = #{author}

 是不是很像JSTL,不如回顾下:EL表达式和JSTL

where if

当SQL中用到where条件,可以利用where标签:

select * from blog

    
        title = #{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 blog

    
        
            title = #{title}
        
        
            and author = #{author}
        
        
            and views = #{views}
        
    

Foreach

将数据库中前三个数据的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对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。

 


❤️ END ❤️

(" close=")" separator=“or”>
id=#{id}



# 写在最后

其实动态 SQL语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 MyBatis 动态SQL对照着改,防止出错。多在实践中使用才是熟练掌握它的技巧。



 

------

❤️ END ❤️

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/270165.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号