mybatis中的动态SQL

动态SQL

根据不同条件生成不同的SQL语句!

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

搭建环境

创建一个基础工程

  1. 导包(lombok偷个懒)
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>
  1. 编写配置文件(数据库)

  2. 编写实体类

    @Data
    public class Blog {
        private String id;
        private String title;
        private String author;
        private Date createTime;
        private int views;
    }
    
  3. 实体类对应Mapper接口和xml文件

IF

<select id="queryBlogIF" parameterType="map" resultType="blog">
    select * from blog where 1=1
    <if test="title != null">
        and title = #{title}
    </if>
    <if test="author != null">
        and author = #{author}
    </if>
</select>

choose (when, otherwise)

只会按第一个满足的条件去查询

<select id="queryBlogChoose" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <choose>
            <when test="title != null">
                title = #{title}
            </when>
            <when test="author != null">
                and author = #{author}
            </when>
            <otherwise>
                and views = #{views}
            </otherwise>
        </choose>
    </where>
</select>

trim (where, set)

where标签可避免下面报错(若第一个条件不满足,直接去掉and)

select * from blog where          and  author = #{author}
<select id="queryBlogChoose" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <choose>
            <when test="title != null">
                title = #{title}
            </when>
            <when test="author != null">
                and author = #{author}
            </when>
            <otherwise>
                and views = #{views}
            </otherwise>
        </choose>
    </where>
</select>

set标签可以去除无效的逗号,若author为空,前面的逗号会被去掉

<update id="updateBlog" parameterType="map">
    update blog
    <set>
        <if test="title != null">
            title = #{title},
        </if>
        <if test="author != null">
            author = #{author}
        </if>
    </set>
    where id = #{id}
</update>

所谓动态SQL,本质还是SQL语句,只是我们可以在SQL层面,执行一个逻辑代码来动态的生成SQL语句

抽取SQL片段

  1. 用sql标签抽取公共部分语句

    <sql id="if-title-author">
        <if test="title != null">
            title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
    </sql>
    
  2. 使用include标签引用即可

    <select id="queryBlogIF" parameterType="map" resultType="blog">
        select * from blog
        <where>
            <include refid="if-title-author"></include>
        </where>
    </select>
    

SQL片段的注意事项:

  • 最好基于单表来定义SQL片段

  • 不要存在where标签

foreach

将多个id用or拼接起来,等价于注释中的sql语句。

<!--select * from blog where 1 = 1 and (id=1 or id=2 or id=3)-->
<select id="queryBlogForeach" parameterType="map" resultType="blog">
    select * from blog
    <where>
        <foreach collection="ids" item="id"
                 open="and (" separator="or" close=")">
            id = #{id}
        </foreach>
    </where>
</select>

动态SQL就是在拼接SQL语句,只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了

建议

  • 先在Mysql中写出完整的SQL,再对应的去修改成动态SQL
上一篇:妈妈再也不用担心我的工厂模式


下一篇:django图书管理系统(作者模块) day05