在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>

最新文章

  1. Struts2之HelloWorld
  2. ST
  3. POJ 3294 Life Forms 后缀数组+二分 求至少k个字符串中包含的最长子串
  4. 【安装mysql数据库】
  5. 如何让你的Apache支持include文件解析和支持shtml的相关配置
  6. [原创]oracle 顺序号生成函数。仿Sequence
  7. Spring 官方下载地址(非Maven)
  8. 锁&#183;——lock关键字详解
  9. bisect 二分查找
  10. QT 获取电脑时间
  11. 电脑同时安装Python2和Python3以及virtualenvwrapper(转)
  12. Qt添加驱动——Qt数据库之添加MySQL驱动插件
  13. cocos代码研究(21)Widget子类Text,TextAtlas,TextBMFont学习笔记
  14. windows下gitlab配置 生成ssh key
  15. MySql的数据目录
  16. Python基础-简介二
  17. QT容器map的插入,修改,遍历
  18. Ajax中post请求和get请求的区别
  19. windows网络服务之配置网络负载均衡(NLB)群集
  20. 文本编辑器 未完成 Treap

热门文章

  1. bzoj 2815 [ZJOI2012]灾难(构造,树形DP)
  2. Java 核心技术-集合-集合框架
  3. [转载] Zookeeper中的 ACL(Access Control List)访问控制列表
  4. Spark系列(三)SparkContext分析
  5. AlertDialog
  6. 转载 ASP.NET常用的正则表达式
  7. hdoj 2829 Lawrence 四边形不等式优化dp
  8. 高效使用Bitmaps(一) 大Bitmap的加载
  9. Android 图片加载[常见开源项目汇总]
  10. 使用jdbc连接上oracle的两种方法