zoukankan      html  css  js  c++  java
  • mybatis判断用insert还是update

    下边看一下mybatis的映射文件。

    <insert id="AddTeacher" parameterType="com.mycompany.entity.Teacher">
    <selectKey keyProperty="count" resultType="int" order="BEFORE">
    select count(*) from Teacher where teacher_id = #{teacherId}
    </selectKey>
    <if test="count > 0">
    update event
    <set>
    <if test="teacherName!= null" >
    teacher_name= #{teacherName},
    </if>
    </set>
    <where>
    teacher_id = #{teacherId}
    </where>
    </if>
    <if test="count==0">
    insert into teacher(teacher_id,teacher_name) values (#{teacherId},#{teacherName})
    </if>
    </insert>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    可以看到mybatis的实现思路也是先查询Id是否存在,在根据count判断是insert还是update。

    说明
    1.实现原理是selectKey做第一次查询,然后根据结果进行判断,所以这里的order="BEFORE"是必须的,也是因BEFORE,所以没法通过<bind>标签来临时存储中间的值,只能在入参中增加属性来存放。

    2.就上面这个例子而言,就要求实体类中包含count属性(可以是别的名字)。否则selectKey的结果没法保存,如果入参是个Map类型,就没有这个限制。

    3.这种方式只是利用了selectKey会多执行一次查询来实现的,但是如果你同时还需要通过selectKey获取序列或者自增的id,就会麻烦很多(oracle麻烦,其他支持自增的还是很容易),例如我在上一篇中利用selectKey 获取主键Id。

    4.建议单独查看学习一下selectKey的用法。
    ————————————————
    版权声明:本文为CSDN博主「老贼大魔王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_36637705/article/details/78530442

  • 相关阅读:
    CVS,GIT,Mercurial和SVN比较
    ubuntu-使用终端配置网络
    编写简单的hashCode方法
    编写高质量equals方法
    文件上传和下载
    Java常用命令
    增删查改-MySQL
    Newton迭代法-C++
    二分法-C++
    适配器模式
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/14545490.html
Copyright © 2011-2022 走看看