zoukankan      html  css  js  c++  java
  • MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素:

    详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

    本章内容简单描述这些动态 SQL 在使用的过程中需要注意的地方。

    choose, when, otherwise

    比如我们要实现如下功能:

    • 当学生姓名不为空,则只用学生姓名作为条件查询
    • 当学生性别不为空,则只用学生性别作为条件查询
    • 当学生姓名和学生性别都为空,则要求学生学生证件号不为空

    针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

    <select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from t_student
        <where>
            <choose>
                <when test="name != null and name != ''">
                    AND name LIKE CONCAT('%', #{name}, '%')
                </when>
                <when test="sex != null">
                    AND sex = #{sex}
                </when>
                <otherwise>
                    AND selfcard_no is not null
                </otherwise>
            </choose>
        </where>
    </select>

    trim, where, set

    比如下面的动态 SQL 有什么问题?

    <select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
        SELECT id, name, sex, selfcard_no, note
        FROM t_student
        WHERE
        <if test="ids != null and ids.size() > 0">
          id IN
          <foreach collection="ids" item="item" open="(" close=")" separator=",">
            #{item}
          </foreach>
        </if>
        <if test="name != null and name != ''">
          AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="sex != null">
          AND sex = #{sex}
        </if>
        <if test="selfcardNo != null">
          AND selfcard_no = #{selfcardNo}
        </if>
    </select>

    如果这些条件没有一个能匹配上会发生什么?最终这条 SQL 会变成这样:

    SELECT id, name, sex, selfcard_no, note
    FROM t_student
    WHERE

    这样会导致 SQL 语句执行失败。如果仅仅第二个条件匹配又会怎样?这条 SQL 最终会是这样:

    SELECT id, name, sex, selfcard_no, note
    FROM t_student
    WHERE
    AND name LIKE CONCAT('%', 'a', '%')

    这个查询也会失败。

    MyBatis 提供了 <where> 元素可以解决上面的问题,将上面的动态 SQL 改成如下形式。

    <select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap">
        SELECT id, name, sex, selfcard_no, note
        FROM t_student
        <where>
            <if test="ids != null and ids.size() > 0">
                AND id IN
                <foreach collection="ids" item="item" open="(" close=")" separator=",">
                    #{item}
                </foreach>
            </if>
            <if test="name != null and name != ''">
                AND name LIKE CONCAT('%', #{name}, '%')
            </if>
            <if test="sex != null">
                AND sex = #{sex}
            </if>
            <if test="selfcardNo != null">
                AND selfcard_no = #{selfcardNo}
            </if>
        </where>
    </select>

    foreach

    实现批量新增功能,动态 SQL 如下:

    <insert id="batchInsertByNoAutoInc" parameterType="list">
        <selectKey keyProperty="id" resultType="long" order="BEFORE">
            select if(max(id) is null, 1, max(id) + 2) as newId from t_student
        </selectKey>
        insert into t_student (name, sex, selfcard_no, note)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.name,jdbcType=VARCHAR},
            #{item.sex,jdbcType=TINYINT},
            #{item.selfcardNo,jdbcType=BIGINT},
            #{item.note,jdbcType=VARCHAR}
            )
        </foreach>
    </insert>

    批量新增的操作需要确保 list 中必须有值。

    MyBatis 实用篇

    MyBatis 概念

    MyBatis 示例-简介

    MyBatis 示例-类型处理器

    MyBatis 示例-传递多个参数

    MyBatis 示例-主键回填

    MyBatis 示例-动态 SQL

    MyBatis 示例-联合查询

    MyBatis 示例-缓存

    MyBatis 示例-插件

    求关注,求点赞,《架构学习》持续更新、完善、纠正 https://www.yuque.com/yinjianwei/vyrvkf
  • 相关阅读:
    Jsoup爬取带登录验证码的网站
    HDFS的java客户端编写
    【Eclipse】Elipse自定义library库并导入项目
    一个爬取https和http通用的工具类(JDK自带的URL的用法)
    爬取网站图片保存到本地
    java在CMD窗口执行程序的时候输入密码(隐藏一些敏感信息)
    htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
    利用Jsoup模拟跳过登录爬虫获取数据
    jsoup抓取网页报错UnsupportedMimeTypeException
    Java爬虫(二)
  • 原文地址:https://www.cnblogs.com/yinjw/p/11757136.html
Copyright © 2011-2022 走看看