if
choose (when, otherwise)
trim (where, set)
foreach
- 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;

(1)导包
(2)编写配置文件
(3)编写实体类
- package com.gt.pojo;
-
-
- import lombok.Data;
-
- import java.util.Date;
-
- @Data
- public class Blog {
- private String id;
- private String title;
- private String author;
- private Date createTime;
- private int views;
- }

(4)编写实体类对应Mapper接口和Mapper.xml文件
if
- <select id="getBlogList" parameterType="map" resultType="com.gt.pojo.Blog">
- select id,title,author,create_time createTime,views from blog
- where 1=1
- <if test="title != null">
- and title like #{title}
- if>
- <if test="author != null">
- and author = #{author}
- if>
- select>

choose (when, otherwise)
- <select id="getBlogList" parameterType="map" resultType="com.gt.pojo.Blog">
- select id,title,author,create_time createTime,views from blog
- <where>
- <choose>
- <when test="title != null">
- title like #{title}
- when>
- <when test="author != null">
- and author = #{author}
- when>
- <otherwise>
- and views=#{views}
- otherwise>
- choose>
- where>
- select>

trim (where, set)
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
- <select id="getBlogList" parameterType="map" resultType="com.gt.pojo.Blog">
- select id,title,author,create_time createTime,views from blog
- <where>
- <if test="title != null">
- title like #{title}
- if>
- <if test="author != null">
- and author = #{author}
- if>
- where>
- select>
- <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>
输出结果:

- <trim prefix="WHERE" prefixOverrides="AND |OR ">
- ...
- trim>
- <trim prefix="SET" suffixOverrides=",">
- ...
- trim>
所谓的动态sql。本质还是sql语句,只是我们可以在sql层面,去执行一个逻辑代码