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

    if 标签----》必须结合 test 属性联合使用。

    ====》对应的动态 SQL

    <select id="selectByStudentSelective" resultMap="BaseResultMap" parameterType="com.homejim.mybatis.entity.Student">
    select
    <include refid="Base_Column_List" />
    from student
    where 1=1
    <if test="name != null and name !=''">
    and name like concat('%', #{name}, '%')
    </if>
    <if test="sex != null">
    and sex=#{sex}
    </if>
    </select>

    <update id="updateByPrimaryKeySelective" parameterType="com.homejim.mybatis.entity.Student">
    update student
    <set>
    <if test="name != null">
    `name` = #{name,jdbcType=VARCHAR},
    </if>
    <if test="phone != null">
    phone = #{phone,jdbcType=VARCHAR},
    </if>
    <if test="email != null">
    email = #{email,jdbcType=VARCHAR},
    </if>
    <if test="sex != null">
    sex = #{sex,jdbcType=TINYINT},
    </if>
    <if test="locked != null">
    locked = #{locked,jdbcType=TINYINT},
    </if>
    <if test="gmtCreated != null">
    gmt_created = #{gmtCreated,jdbcType=TIMESTAMP},
    </if>
    <if test="gmtModified != null">
    gmt_modified = #{gmtModified,jdbcType=TIMESTAMP},
    </if>
    </set>
    where student_id = #{studentId,jdbcType=INTEGER}

    <insert id="insertSelective" parameterType="com.homejim.mybatis.entity.Student">
    insert into student
    <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="studentId != null">
    student_id,
    </if>
    <if test="name != null">
    `name`,
    </if>
    <if test="phone != null">
    phone,
    </if>
    <if test="email != null">
    email,
    </if>
    <if test="sex != null">
    sex,
    </if>
    <if test="locked != null">
    locked,
    </if>
    <if test="gmtCreated != null">
    gmt_created,
    </if>
    <if test="gmtModified != null">
    gmt_modified,
    </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
    <if test="studentId != null">
    #{studentId,jdbcType=INTEGER},
    </if>
    <if test="name != null">
    #{name,jdbcType=VARCHAR},
    </if>
    <if test="phone != null">
    #{phone,jdbcType=VARCHAR},
    </if>
    <if test="email != null">
    #{email,jdbcType=VARCHAR},
    </if>
    <if test="sex != null">
    #{sex,jdbcType=TINYINT},
    </if>
    <if test="locked != null">
    #{locked,jdbcType=TINYINT},
    </if>
    <if test="gmtCreated != null">
    #{gmtCreated,jdbcType=TIMESTAMP},
    </if>
    <if test="gmtModified != null">
    #{gmtModified,jdbcType=TIMESTAMP},
    </if>
    </trim>
    </insert>

    注:

    prefix:在trim标签内sql语句加上前缀。

    suffix:在trim标签内sql语句加上后缀。

    suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。

    prefixOverrides:指定去除多余的前缀内容

    ====================》》

    choose 标签   【choose when otherwise 标签可以帮我们实现 if else 的逻辑。一个 choose 标签至少有一个 when,最多一个otherwise

    ===》对应的SQL

    <select id="selectByIdOrName" resultMap="BaseResultMap" parameterType="com.homejim.mybatis.entity.Student">
    select
    <include refid="Base_Column_List" />
    from student
    where 1=1
    <choose>
    <when test="studentId != null">
    and student_id=#{studentId}
    </when>
    <when test="name != null and name != ''">
    and name=#{name}
    </when>
    <otherwise>
    and 1=2
    </otherwise>
    </choose>
    </select>

    where标签----》【

    • 当条件都不满足时:此时 SQL 中应该要不能有 where , 否则导致出错

    • 当 if 有条件满足时:SQL 中需要有 where, 且第一个成立的 if 标签下的 and | or 等要去掉

    这时候, 我们可以使用 where 标签

    ---》对应的 SQL

    <select id="selectByStudentSelectiveWhereTag" resultMap="BaseResultMap" parameterType="com.homejim.mybatis.entity.Student">
    select
    <include refid="Base_Column_List" />
    from student
    <where>
    <if test="name != null and name !=''">
    and name like concat('%', #{name}, '%')
    </if>
    <if test="sex != null">
    and sex=#{sex}
    </if>
    </where>
    </select>

    foreach 标签

    foreach 中有以下几个属性

    • collection: 必填, 集合/数组/Map的名称.

    • item: 变量名。即从迭代的对象中取出的每一个值

    • index: 索引的属性名。当迭代的对象为 Map 时, 该值为 Map 中的 Key.

    • open: 循环开头的字符串

    • close: 循环结束的字符串

    • separator: 每次循环的分隔符

    默认情况:集合collection=list, 数组是collection=array

    推荐:使用 @Param 来指定参数的名称, 如我们在参数前@Param("ids"), 则就填写 collection=ids

    2. 多参数

    多参数请使用 @Param 来指定

    ---------》对应SQL

    <select id="selectByStudentIdList" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from student
    where student_id in
    <foreach collection="list" item="id" open="(" close=")" separator="," index="i">
    #{id}
    </foreach>
    </select>

    foreach 实现批量插入

    -----》对应的SQL

    <insert id="insertList">
    insert into student(name, phone, email, sex, locked)
    values
    <foreach collection="list" item="student" separator=",">
    (
    #{student.name}, #{student.phone},#{student.email},
    #{student.sex},#{student.locked}
    )
    </foreach>
    </insert>

    bind 标签

    <if test="name != null and name !=''">
    and name like concat('%', #{name}, '%')
    </if>

    《《《=====》》》

    <if test="name != null and name !=''">
    <bind name="nameLike" value="'%'+name+'%'"/>
    and name like #{nameLike}
    </if>

  • 相关阅读:
    有关Lucene的问题(7):用Lucene构建实时的索引
    Lucene学习总结之九:Lucene的查询对象(1)
    有关Lucene的问题(6):Lucene的事务性
    Lucene学习总结之九:Lucene的查询对象
    面向连接的Socket Server的简单实现
    Lucene 原理与代码分析完整版
    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题
    k8spod的状态为evicted的情况分析
    centos7环境 的 k8s安装helm 3.7.1
    VMware虚拟机中CentOS7的硬盘空间扩容
  • 原文地址:https://www.cnblogs.com/KL2016/p/14620796.html
Copyright © 2011-2022 走看看