zoukankan      html  css  js  c++  java
  • 巧用selectKey

    在Ibatis中,insert()的返回值为一个Object的主键,其实这个Object的主键是这样的来的:如果在bean的xml文件中设置了插入的keyProperty,则insert()方法返回的就是这个主键的值。
     
    <insert id="insertUser" parameterClass="po.User">
         <selectKey resultClass="int" keyProperty="userId" >
             SELECT user_account_s.nextval AS userid FROM dual
         </selectKey>
      insert into user_account(userid, username, password, groupname)
              values(#userId#, #userName#, #password#, #groupName#)
     </insert>
    此时插入到数据库中的某表userid字段的值即使sequence的值。但要注意的是,配置中出现的红色加粗字体一定要对应到bean中的属性字段,也即要与bean中的属性字段名称相同,否则则会抛出异常。
    如果是SQL SERVER数据库,则进行如下配置:
    <insert id="insertUser" parameterClass="po.User">
        insert into user_account(userid, username, password, groupname)
              values(#userId#, #userName#, #password#, #groupName#)
         <selectKey resultClass="int" keyProperty="userId" >
             SELECT @@IDENTITY as userid
         </selectKey>
     </insert>
    如果是MYSQL 数据库,则进行如下配置:

    <insert id="MS-SYS-SEQ-INSERT">

         <![CDATA[
             insert into sys_seq(name) values (#name#)
         ]]>
         <selectKey resultClass="long" keyProperty="id">
             <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
         </selectKey>
        </insert>
     
     
    映射xml 文件中配置为:

    <insert id="addStudent" parameterClass="Student">
    <selectKey resultClass="int" keyProperty="id">
    select seq_student.
    nextval as value from dual
    <!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
    <!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
    <!-- mssql:select @@IDENTITY as value -->
    <!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
    <!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
    有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->
    </selectKey>
    insert into tbl_student(id,name,birth,score) values (#id#,#name#,#birth#,#score#)
    </insert>

    selectKey元素部分其实既可以放在insert语句之前也是可以放在其后的,放在之前的话就用nextval,放在之后的话就用currval。如果放在之前用currval就会报错提示要先进行nextval操作再currval。在创建数据表时新建了sequences,将selectKey放在insert语句之前时,发现每次执行插入数据操作,主键id都会自增两次,而increment by也必须为1以上。所以有点纳闷,放在之前岂不是没什么用,为什么大家都还放在之前?原来我用powerdesigner建表及序列时忆自动地新建了一个触发器,在每次执行插入操作之前都会自动将序列值加1……我只能将其放在之后使用currval,这样就保证了主键每次自动增1,并且可以正常地返回插入数据记录的主键值。

    <insert id="addStudent" parameterClass="Student">
    insert into tbl_student(id,name,birth,score) values (#id#,#name#,#birth#,#score#)
    <selectKey resultClass="int" keyProperty="id">
    select seq_student.currval as value from dual
    </selectKey>

    </insert>

  • 相关阅读:
    python修改pip源
    python if条件判断dataframe是否为空
    bowtie和bowtie2使用条件区别及用法
    bat批处理for循环嵌套
    常用的数据标准化方法
    python学习——利用循环实现分类散点图绘制
    python学习——通过命令行参数根据fasta文件中染色体id提取染色体序列
    python学习——把读取fasta文件的代码封装成函数
    python学习——把计算GC含量的代码封装成函数
    python学习——使用argparse参数解释器传递命令行参数
  • 原文地址:https://www.cnblogs.com/mm0712/p/6118043.html
Copyright © 2011-2022 走看看