ibatis insert语句的用法及selectKey的使用

ibatis insert语句的用法及selectKey的使用  

2013-08-24 12:41:07|  分类: ibatis |  标签:insert  ibatis  |举报|字号 订阅

下载LOFTER客户端
在Ibatis中,insert()的返回值为一个Object的主键,其实这个Object的主键是这样的来的:如果在bean的xml文件中设置了插入的keyProperty,则insert()方法返回的就是这个主键的值。
例如,所以我们想要在插入时想要插入一个sequence值到数据库的某个字段(当然,这个字段的类型为Number的),我们可以在xml文件中做如下配置(以下为在DB服务器是Oracle的前提下):
 
    

 id="insertUser" parameterClass="po.User">
      resultClass="int" keyProperty="userId" >
         SELECT user_account_s.nextval AS userid FROM dual
     
  insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)
 
此时插入到数据库中的某表userid字段的值即使sequence的值。但要注意的是,配置中出现的红色加粗字体一定要对应到bean中的属性字段,也即要与bean中的属性字段名称相同,否则则会抛出异常。
如果是SQL SERVER数据库,则进行如下配置:
 
    

 id="insertUser" parameterClass="po.User">
    insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)
      resultClass="int" keyProperty="userId" >
         SELECT @@IDENTITY as userid
     
 
如果是MYSQL 数据库,则进行如下配置:
 
    

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

     
         insert into sys_seq(name) values (#name#)
     ]]>
      resultClass="long" keyProperty="id">
         
     
    


上述是从其它地方copy过来的,这几天被ibatis的插入数据的一些问题困扰了许久,现在总算是对ibatis此方面有所了解掌握了。自己能力还是太差了,学习进度太慢。我用的是ibatis,oracle10数据库。
映射xml 文件中配置为:
 
   

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

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

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

你可能感兴趣的:(ibatis insert语句的用法及selectKey的使用)