zoukankan      html  css  js  c++  java
  • Mybatis的动态SQL讲解

    用mybatis对一张表进行CRUD操作时,进行无条件的查询所用的sql都是很简单的,但是假使有很多条件呢,这些条件都要逐一地写一条sql吗?No,这时就要提到mybatis的动态查询了。

    MyBatis中用于实现动态SQL的元素主要有:

    • if
    • where
    • set
    • choose(when,otherwise)
    • trim
    • foreach

    下面以学生表进行操作:

    1、动态查询

    <!-- mapper的xml中对表字段的一个映射 -->
        <resultMap type="com.java.pojo.Student" id="studentMap">
            <id property="id" column="id"/>
            <result property="sname" column="sname"/>
            <result property="sage" column="sage"/>
            
        </resultMap>
    <!-- 查询语句 -->
        <select id="select" parameterType="com.java.pojo.Student" resultMap="studentMap" >
            select * from student 
            <where>
                <if test="sname !=null">
                    and sname=#{sname}
                </if>
                <if test="sage !=null">
                    and sage=#{sage}
                </if>
            </where>
        </select>

    有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句

    <select id="selectUserByChoose" resultMap="studentMap" parameterType="com.java.pojo.Student">
          select * from student
          <where>
              <choose>
                  <when test="id !='' and id != null">
                      id=#{id}
                  </when>
                  <when test="sname !='' and sname != null">
                      and sname=#{sname}
                  </when>
                  <otherwise>
                      and sage=#{sage}
                  </otherwise>
              </choose>
          </where>
      </select>

    2、动态插入

    <sql id="key">
            <trim suffixOverrides=",">
                <if test="sname !=null">
                    sname,
                </if>
                <if test="sage !=null">
                    sage,
                </if>    
            </trim>        
        </sql>
        
        <sql id="values">
            <trim suffixOverrides=",">
                <if test="sname !=null">
                    #{sname},
                </if>
                <if test="sage !=null">
                    #{sage},
                </if>    
            </trim>
        </sql>
        
        <insert id="add" parameterType="com.java.pojo.Student">
            insert into student(<include refid="key"></include>) values(<include refid="values"></include>)
        </insert>

     prefix:前缀      

     prefixoverride:去掉第一个and或者是or

     suffix:后缀  

     suffixoverride:去掉最后一个逗号(也可以是其他的标记)

     3 、动态更新

    <update id="update" parameterType="com.java.pojo.Student">
            update student
            <set>
                <trim suffixOverrides=",">
                    <if test="sname !=null">
                        sname=#{sname},
                    </if>
                    <if test="sage !=null">
                        sage=#{sage},
                    </if>    
                </trim>
            </set>
            <where>
                and id=#{id}
            </where>
        </update>

     

    4、动态删除

    4.1、按id删除

    <delete id="delete" parameterType="student">
                <if test="id !=null">
                    delete from student 
                    <where>
                        <if test="id !=null">
                            and id=#{id}
                        </if>
                    </where>    
                </if>
    </delete>

    4.2、批量删除

    foreach 属性详解
    collection 表示参数类型 比如是数组或者集合
    open 表示以神符号开始
    close 表示以什么符号结束
    separator 表示分隔符
    item 表示要遍历的名称

    <!-- 动态删除之集合版本 -->
    <delete id="dynaDeleteList">
       delete from student where id in
       <foreach collection="array" open="(" close=")" separator="," item="ids" >
            #{ids}
       </foreach>
    </delete>
    <!-- 动态删除之集合版本 -->
    <delete id="dynaDeleteList">
       delete from student where id in
       <foreach collection="list" open="(" close=")" separator="," item="ids" >
              #{ids}
       </foreach>
     </delete>
  • 相关阅读:
    内网/局域网 DNS获取不正确
    Qt5.7 + D2D渲染引擎。 画面闪烁,几乎没图像显示
    安网路由器 移动宽带和电信宽带混用问题解决
    安网路由器 静态IP和PPOE混用时,如果设置了路由器定时重启可能导致路由器罢工
    Qt5.7+VS2015环境下使用QtCreator编译QtAV视频库
    Android Gradle编译so库或运行时出现 text relocations 崩溃的正确解决方法
    使用Jenkins + shell(gradle)快速搭建 Android 构建机
    Android 获得控件在屏幕中的坐标
    Mac 共享WiFi给任意设备(Android,Iphone等等)
    股票、外汇、期货、数字货币小总结
  • 原文地址:https://www.cnblogs.com/hhhwj/p/11384932.html
Copyright © 2011-2022 走看看