• 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>
  • 相关阅读:
    安卓跑马灯
    utf-8加密用于汉字加密(避免乱码)
    设置将edittext的光标到最后
    自定义UIProgressView,实现渐变色进度条,带动画的
    UIImageView帧动画,包含暂停和继续功能
    UIImageView关键帧动画,监听动画结束的回调
    自定义UICollectionViewFlowLayout实现横向滚动时,离中心点越近,item越大,离中心店越远,item越小的效果
    iOS中UIView的Pan手势和UIScrollView滚动手势的冲突解决方案
    使用Cocoapods创建私有库的流程
    git代码仓库迁移的步骤
  • 原文地址:https://www.cnblogs.com/Charles-H/p/Mybatis-08.html
Copyright © 2020-2023  润新知