Mybatis

  在学习完面对一对多和一对一的情况下的SQL后,我们来学习Mybatis的又一强大特性:动态SQL。

什么是动态SQL?

  动态SQL就是指根据不同的条件生产不同的SQL语句。

 

在使用前,我们第一步的步骤依旧是建表:

create table cnblog(
id VARCHAR(20),
title VARCHAR(20),
author VARCHAR(20),
create_time DATE,
views INT
);

 

编写实体类以及接口:

package com.charles.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cnblog {
    private String id;
    private String title;
    private String author;
    private Date create_time;
    private int views;
}
package com.charles.dao;

import com.charles.pojo.Cnblog;

import java.util.List;
import java.util.Map;

public interface CnblogMapper {
    List<Cnblog> queryAllIf(Map map);
}

 

<IF>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.charles.dao.CnblogMapper">

    <select id="queryAllIf" resultType="com.charles.pojo.Cnblog" parameterType="Map">
        SELECT * FROM cnblog
        <!--如果两个都不符合,则会查询所有-->
        <where>
            <if test="title != null">
               AND title = #{title}
            </if>
            <if test="author != null">
                AND author = #{author}
            </if>
        </where>
    </select>

</mapper>

 

choose、when、otherwise

  这个方法与switch类似

    <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 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

  set元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

    <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则是用来自定义where和set,一般很少用。

 

foreach

  动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符。

    <select id="queryForeach" parameterType="map" resultType="com.charles.pojo.Cnblog">
        SELECT * FROM cnblog
        <where>
            <foreach collection="ids" item="id" open="and (" close=")" separator="or">
                id=#{id}
            </foreach>
        </where>
    </select>