zoukankan      html  css  js  c++  java
  • Mybatis-08

    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>
  • 相关阅读:
    object引入出现滚动条问题
    java
    读大道至简有感
    读大道至简第二章有感
    加和程序的流程图及代码
    Unity编程标准导引Unity中的基本概念2.1界面概览
    Unity编程标准导引2.2Unity中的基本概念
    Unity编程标准导引3.1 Component 组件脚本及其基本生命周期
    Unity编程标准导引3.2 MonoBehavior 组件父类重构
    Unity编程标准导引1.1下载和安装Unity
  • 原文地址:https://www.cnblogs.com/Charles-H/p/Mybatis-08.html
Copyright © 2011-2022 走看看