`
hotforcc
  • 浏览: 61238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis selectKey用法问题

阅读更多
今天在用ibatis selectKey 生成 oracle sequence 的时候 发现一个问题。

其实就是相为SHIPMENT_HISTORY表加入一个主键sequence id shipmentHistoryId,加入一条记录,然后返回这个sequence id

xml 代码
 
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">  
  2.      insert into SHIPMENT_HISTORY (SHIPMENT_ID, RECORD_CREATED_DATE, REMARK)  
  3.     values (#shipmentId:DECIMAL#,  #recordCreatedDate:DATE#, #remark:VARCHAR#)  
  4.     <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">  
  5.       select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal from dual  
  6.     <<!---->selectKey>  
  7.  <<!---->insert>  

并且这段statement是由Abator自动生成的,蛮以为肯定不会出错的 。  但是这个 statement在运行的时候报错了 ,说不能插入 能null数值插入到SHIPMENT_HISTORY表中 ,说明这个selectKey就根本没有发挥出作用 。

查找了一下ibatis的中文文档 ,上面由下面的说明如下 :

很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert></insert>的子元素<selectkey></selectkey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:

xml 代码
  1. < !—Oracle SEQUENCE Example -->   
  2. <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">   
  3.    <selectKey resultClass="int" keyProperty="id" >   
  4.      SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL   
  5.    <!----><selectKey>   
  6.    insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)   
  7.    values (#id#,#description#)   
  8. <insert>   
  9. <!---->
  10. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">   
  11.     insert into PRODUCT (PRD_DESCRIPTION)   
  12.     values (#description#)   
  13.     <selectKey resultClass="int" keyProperty="id" >   
  14.       SELECT @@IDENTITY AS ID   
  15.     <<!---->selectKey>   
  16. <insert>   


也就是说对于oracle来说,<selectKey>   statement是必须前置的,并且 必须把sequence id放到insert into 句子中,就会没有问题的。按照上面的更改我自己的xml如下,果然没有问题了

 

xml 代码
 
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">    
  2.      <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">    
  3.            select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal as value  from dual    
  4.      <!----><selectKey>    
  5.    insert into SHIPMENT_HISTORY (SHIPMENT_HESTORY_ID,SHIPMENT_ID, RECORD_CREATED_DATE, REMARK)      value(#shipmentHistoryId:DECIMAL#,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)    
  6. <insert>    

所以对于不同的数据库来说 。<!---->selectKey>   的用法可能是不一样的,网上的由很多资料的解释是根据不同的数据库的驱动,然后<!---->selectKey>   的用法也不一样。但是即使你用Abator来是生成,并且在Abator的配置文件中的

<jdbcconnection driverclass="oracle.jdbc.driver.OracleDriver"></jdbcconnection>

表示这个一个OracleDriver的驱动,但是Abator不会的根据不同的驱动然后生成不同的<!---->selectKey> 语句,所以说你如果用到oracle的时候,只能手工的改动这个statement了。


其实也可以用在insert语句中直接调用SEQUENCE.nextVal的方法来生成sequence id,例如

xml 代码
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">  
  2. insert into SHIPMENT_HISTORY (SHIPMENT_HISTORY_ID,SHIPMENT_ID,RECORD_CREATED_DATE, REMARK)  
  3. Values  
  4. (SHIPMENT_HISTORY_ID_SEQUENCE.nextVal,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)  
  5. <insert>  

这个statement是可以生成sequence并且插入记录的,唯一的缺点就是你不能同时通过

Object newKey = getSqlMapClientTemplate().insert(
"SHIPMENT_HISTORY.abatorgenerated_insert", record);

同时得到newKey这个sequence

总之,相对来说,<!---->selectKey>还是比较好用的,只要你注意你用的数据库的问题(再说,ibatis也没有屏蔽掉数据库之间的差异)

<o:p></o:p>

分享到:
评论

相关推荐

    常用ibatis配置

    在iBatis中,可以使用&lt;selectKey&gt;标签来获取插入记录后的自增ID。例如,文档中显示的是在插入数据后,通过调用数据库的IDENTITY函数获取自增ID值,这个值被设置到resultClass为int类型的keyProperty“id”中。 2. ...

    08_ibatis教程_sql主键生成方式.rar

    Ibatis通过`&lt;selectKey&gt;`标签可以与触发器配合使用,但在设计时需谨慎,因为触发器可能增加数据库的复杂性和维护成本。 7. **Hi-Lo算法**: Hi-Lo算法是一种在应用层面生成主键的方法,主要用于减少对数据库的访问...

    ibatis批处理

    此外,`&lt;selectKey&gt;`标签用于在插入后获取自增主键的值,这对于某些数据库系统(如MySQL)是必要的。 总的来说,iBatis的批处理功能通过在代码和配置文件中灵活运用循环,使得开发者能够有效地处理大批量数据操作,...

    Ibatis简易教程

    iBatis 是一款轻量级的数据持久层框架,它的主要功能是将对象与SQL语句进行映射,简化了数据库操作。...通过学习和实践这些基本操作,你将能够快速掌握iBatis的基本用法,并将其应用到实际项目中。

    spring+ibatis集成文档

    select * from ibatis where name = #{value} &lt;/select&gt; &lt;!-- 根据ID查询记录 --&gt; &lt;select id="getUsersById" resultMap="ibatisTest"&gt; select * from ibatis where id = #{value} &lt;/select&gt; &lt;!-- 插入...

    iBATIS入门实例测试

    本教程将通过一个简单的实例来介绍如何使用iBATIS进行数据库操作。 **一、iBATIS简介** iBATIS(现在称为MyBatis)是由Apache软件基金会维护的一个轻量级的ORM(对象关系映射)框架。它的核心功能是将SQL语句与Java...

    ibatis技术总结

    13. **&lt;selectKey&gt;**:定义主键生成策略,常用于自动填充主键字段。 这些标签共同构成了iBatis的SQL映射规则体系,确保了框架能够正确执行各种数据库操作。 #### 7. SQL参数详解 iBatis支持多种类型的SQL参数,...

    ibatis_数据缓存

    值得注意的是,iBatis并不是以查询参数的Class的hashcode或toString方法作为Key的一部分,而是使用在sqlmap中使用的变量集合。 **缓存功能** - iBatis 支持`queryForObject`和`queryForList`方法的结果缓存,但其他...

    iBATIS DataMapper1.6 中文翻译

    在这个例子中,`&lt;insert&gt;`标签定义了一个插入操作,参数类为`LineItem`,并包含了主键获取的`&lt;selectKey&gt;`标签。通过`Mapper.Instance().Insert()`方法调用,可以完成插入操作并返回主键值。 总的来说,iBATIS ...

    08_传智播客ibatis教程_sql主键生成方式

    在Ibatis配置中,可以通过`&lt;selectKey&gt;`标签来指定使用序列生成主键。 2. **身份列(Identity)**:在MySQL、SQL Server等支持自动增长的数据库中,可以设置某一列为主键并自动递增。在Ibatis中,可以在插入语句后...

    IBatis.net教程

    - SQL描述文档:在XML文件中,可以详细定义SQL语句的结构和行为,比如标签定义了插入操作的SQL语句,并通过&lt;selectKey&gt;标签指定返回插入数据后的主键值。 - 查询操作:如果需要从数据库中查询多行数据,iBATIS同样...

    IBatis3 入门开发

    9. **参数处理**:iBATIS 提供了多种参数处理器,如`@Param`注解和`@SelectKey`等,可以方便地处理各种类型的参数。 10. **性能优化**:通过合理设计SQL语句、使用预编译的PreparedStatement、合理配置缓存等方式,...

    Ibatis3.0 增删改查(三)

    在本教程中,我们将深入探讨Ibatis 3.0框架中的增、删、改、查操作,这是关于Ibatis 3.0系列教程的第三部分。...通过学习这一部分,你应能熟练掌握在Ibatis中进行数据的增删改查操作,并理解其背后的原理和用法。

    最简单的ibatiS实现增删改查

    【标题】:“最简单的ibatis实现增删改查” 在Java开发中,iBATIS(现更名为MyBatis)是一个非常流行的持久层框架,它允许开发者编写SQL语句并与Java对象进行映射,从而简化了数据库操作。本教程将向您展示如何在...

    Ibatis入门教程

    通过本教程的学习,可以了解到Ibatis的基本使用方法,包括如何创建数据库和表、编写存储过程、定义实体类和配置文件,以及如何实现基本的CRUD操作。这对于初学者来说是非常宝贵的实践经验,有助于快速上手并掌握...

    ibatis 缓存配置策略

    首先,iBatis 的 Cache 键(key)是由多个因素组成的,包括对象的hashCode、checksum、查询参数、sqlmap ID、SQL语句以及调用方法名。由于这些因素的多样性,即使是微小的参数变化也会导致不同的Key,从而确保缓存的...

    srping+ibatis整合的小案例

    然后创建接口的实现类`IbatisDAOImpl`,使用`SqlSessionTemplate`注入并调用方法。 ```java public interface IbatisDAO { List&lt;Ibatis&gt; getAllUsers(); Ibatis getUserByName(String name); } public class ...

    ibatis的教程

    当需要返回数据库自动生成的主键值时,可以使用&lt;selectKey&gt;标签来获取,这在SQL Server中常用于获取插入数据后由数据库生成的主键。 当需要获取多行数据时,iBATIS可以返回一个对象集合,每个对象对应于数据表中的...

    iBatis经典示例

    在这种情况下,你可以使用`#{key}`来引用Map中的键值,或者在动态SQL中根据条件改变参数。 TestSiBatis这个文件可能是包含测试代码的Java类,它展示了如何在实际项目中使用iBatis进行数据库操作。通常,这个类会...

Global site tag (gtag.js) - Google Analytics