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

ibatis中主键的返回

阅读更多
spring与ibatis整合后在getSqlMapClientTemplate()方法中提供了一系列CRUD方法,其中insert返回一个Object型的主键,一直用着都很正常,可是在oracle中增加了序列,又修改了配置文件,就一直抛NullPointException
<insert id="addPermission" parameterClass="Permission">
		INSERT INTO P_PERMISSION
		(PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)
		VALUES
		(SEQ_P_PERMISSION.NEXTVAL,#permissionInfo#,#permissionName#,
                 #permissionEnName#,#url#)
</insert>

检查了数遍Dao跟Service,都没问题(就是怕类似少标点这样的小错误),而且数据也可以添加,就觉得应该是配置文件的问题,仔细查看了下文档,原来<insert>中还包含一个<selectKey>可以配置序列
<insert id="addPermission" parameterClass="Permission">
		<selectKey resultClass="int" keyProperty="permissionId">
			SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL
		</selectKey>
		INSERT INTO P_PERMISSION
		(PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)
		VALUES
		(#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)
	</insert>

修改完毕,程序没问题啦。
-----------------分割线--------------------------------------
如果使用后生成主键的数据库,MySql,SQLServer配置文件应为
<insert id="addPermission" parameterClass="Permission">
		
		INSERT INTO P_PERMISSION
		(PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)
		VALUES
		(#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)
        <selectKey resultClass="int" keyProperty="permissionId">
			SELECT @@IDENTITY AS PERMISSIONID
		</selectKey>	
</insert>

当然,前提是PERMISSIONID字段被设置为自增属性
分享到:
评论
6 楼 aaronjiu_00 2008-07-03  
引用
这个应该是数据库的主键的前后生成顺序了,oracle的是前生成,而sqlserver则是后生成,所以应该顺序会有一定的影响的


是的,这是与数据库的主键的生成先后顺序有关的。对于Oracle是pre生成的,对于MySQL、SQLServer等是post生成的,那么为什么使用selectKey呢,如果不使用selectKey会有什么问题呢?
当持久化某个实体对象(如保存一个对象)时,如果我们不用selectKey,那么我们不会立刻得到实体对象的Id属性的,也就是数据表主键

Permission permission = new Permission();
permission.set...

permmisonDao.createPermission(permission);
assertNull(permission);


selectKey元素与其在父元素中的位置有关,Oracle的selectKey在前
<insert id="addPermission" parameterClass="Permission">  
	<selectKey resultClass="int" keyProperty="permissionId">  
		SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL   
	</selectKey>  
	INSERT INTO P_PERMISSION (
		PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
	) VALUES (
		#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
	)   
</insert>


Mysql、SQLServer在后
 <insert id="addPermission" parameterClass="Permission">    
	INSERT INTO P_PERMISSION (
		PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
	) VALUES (
		#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
	)
	<selectKey resultClass="int" keyProperty="permissionId">  
		SELECT LAST_INSERT_ID()   
	</selectKey>
</insert>


像上面这样书写,与selectKey的位置联系得太紧密了,iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。
对于Oracle,表示为
  
<insert id="addPermission" parameterClass="Permission">  
	<selectKey resultClass="int" keyProperty="permissionId" type="pre">  
		SELECT SEQ_P_PERMISSION.NEXTVAL FROM DUAL   
	</selectKey>  
	INSERT INTO P_PERMISSION (
		PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
	) VALUES (
		#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
	)   
</insert>   


Mysql、SQLServer等表示为:
  
<insert id="addPermission" parameterClass="Permission">  
	<selectKey resultClass="int" keyProperty="permissionId" type="post">  
		SELECT LAST_INSERT_ID()
	</selectKey>  
	INSERT INTO P_PERMISSION (
		PERMISSIONID, PERMISSIONINFO, PERMISSIONNAME, PERMISSIONENNAME, URL
	) VALUES (
		#permissionId#, #permissionInfo#, #permissionName#, #permissionEnName#, #url#
	)   
</insert>   

5 楼 ferreousbox 2008-05-26  
这个应该是数据库的主键的前后生成顺序了,oracle的是前生成,而sqlserver则是后生成,所以应该顺序会有一定的影响的
4 楼 verygoodverypowerful 2008-04-24  
kkndone 写道
zelsa 写道
建议:
    <insert id="addPermission" parameterClass="Permission">           
        INSERT INTO P_PERMISSION   
        (PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)   
        VALUES   
        (#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)   
        <selectKey resultClass="int" keyProperty="permissionId">  
            SELECT SEQ_P_PERMISSION.CURRVAL FROM DUAL   
        </selectKey> 
    </insert>

why?

这个我也很想知道为什么,麻烦举例说明
3 楼 Jhonny 2008-04-24  
zelsa 写道
建议:
    <insert id="addPermission" parameterClass="Permission">           
        INSERT INTO P_PERMISSION   
        (PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)   
        VALUES   
        (#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)   
        <selectKey resultClass="int" keyProperty="permissionId">  
            SELECT SEQ_P_PERMISSION.CURRVAL FROM DUAL   
        </selectKey> 
    </insert>


没有什么区别吧,不要用sequence的currval用nextval,sequence第一次被select 的currval为空
2 楼 kkndone 2008-04-24  
zelsa 写道
建议:
    <insert id="addPermission" parameterClass="Permission">           
        INSERT INTO P_PERMISSION   
        (PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)   
        VALUES   
        (#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)   
        <selectKey resultClass="int" keyProperty="permissionId">  
            SELECT SEQ_P_PERMISSION.CURRVAL FROM DUAL   
        </selectKey> 
    </insert>

why?
1 楼 zelsa 2008-04-24  
建议:
    <insert id="addPermission" parameterClass="Permission">           
        INSERT INTO P_PERMISSION   
        (PERMISSIONID,PERMISSIONINFO,PERMISSIONNAME,PERMISSIONENNAME,URL)   
        VALUES   
        (#permissionId#,#permissionInfo#,#permissionName#,#permissionEnName#,#url#)   
        <selectKey resultClass="int" keyProperty="permissionId">  
            SELECT SEQ_P_PERMISSION.CURRVAL FROM DUAL   
        </selectKey> 
    </insert>

相关推荐

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

    在Ibatis中,可以通过`&lt;selectKey&gt;`标签配合`keyProperty`指定主键属性,`resultType`指定返回类型,然后在SQL语句中调用序列生成器。 3. **自增(Identity)**: MySQL、SQL Server等数据库支持字段的自动递增...

    Ibatis查询Id列表.doc

    根据提供的文档信息,我们可以深入探讨Ibatis框架中的一个具体应用场景:如何通过动态SQL查询特定条件下的ID列表。本文将从以下几个方面进行详细解析: ### 一、Ibatis简介 Ibatis是一个基于Java的持久层框架,它...

    Ibatis多表查询

    在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `user`。`book` 表存储书籍的信息,而 `user` 表记录作者信息,其中 `book_oid` 字段作为外键引用 `book` 表...

    ibatis多表查询

    特别地,`users`属性通过`column="oid"`和`select="getUsersByBookId"`来指定,这意味着Ibatis将根据`oid`执行另一个SQL查询(即`getUsersByBookId`),并将返回的结果填充到`Book`对象的`users`属性。 `select`...

    iBatis入门Helloworld

    在实际开发中,可以根据项目需求,利用iBatis的动态SQL、结果映射等功能,构建高效的数据访问层。通过这个简单的"iBatis入门Helloworld"项目,你可以快速掌握iBatis的基础操作,并为进一步学习和应用打下坚实基础。

    IBATISDAO库类操作

    - **插入操作**:`insert()`方法用于将一个对象插入到数据库中,它会自动处理主键生成策略,如果表有自增主键,IBATIS会自动填充。 - **更新操作**:`update()`方法用于更新已存在的记录,它需要传入待更新的对象,...

    ibatis使用指南

    - **插入**:使用`insert`方法,Ibatis会自动生成`insertId`,便于获取新生成的主键。 - **更新**:使用`update`方法,Ibatis会根据传入的对象自动拼接UPDATE语句。 - **删除**:使用`delete`方法,根据传入的...

    iBatis_SqlMap的配置总结[1]

    例如,在Oracle或DB2中,可以使用Sequence获取主键;而在MySQL中,可以使用`LAST_INSERT_ID()`函数。 4. **主键获取策略**: - **先获取主键**:`&lt;selectKey&gt;`可以在插入语句之前配置,如Oracle的Sequence,需要在...

    ibatis文档

    在本文档中,我们将深入探讨iBATIS SQLMap的关键概念、配置与使用方法,以及如何通过SQLMap优化数据库交互。 ### iBATIS SQLMap的核心概念 #### SQLMap的概念 SQLMap是iBATIS框架中的关键组件,它通过XML映射文件...

    ibatis资料(官方文档)

    Ibatis的动态SQL功能强大,允许在SQL语句中使用条件判断、循环等结构,使得SQL更灵活,适应不同场景。 **6. 简单的Java API** Ibatis提供了一个SqlSession接口,通过SqlSessionFactory获取,用于执行SQL操作。...

    iBatis操作MySQL增删改查

    iBatis会自动处理主键生成和参数绑定,提高开发效率。 2. **删除记录**:删除操作分为删除指定记录和删除全部记录。使用`&lt;delete&gt;`标签定义删除语句,可以按ID或其他条件进行删除。在Java代码中,调用Mapper接口的...

    使用ibatis操作两个有关系的表

    这种情况下,通常在子表中有一个外键指向父表的主键。映射方式与一对一类似,只是方向相反。 4. **多对多映射**:最复杂的关系类型,如学生和课程之间的关系。多对多关系需要一个中间表来存储双方的关联信息。在...

    spring mvc+ibatis+oracle单表增删改(有包)

    在单表操作中,可能涉及创建User表,包含id、name、email等字段,以及相关的主键约束和索引。增删改操作会涉及到INSERT、DELETE、UPDATE语句,而查询可能包括简单的SELECT语句,也可能涉及复杂的JOIN、GROUP BY和...

    ibatis技术总结

    3. **添加lib**:将iBatis相关的jar包添加到项目的lib目录下,并在项目的构建路径中添加这些库。常见的iBatis依赖包括`ibatis.jar`和`log4j.jar`等。 4. **编写sqlmapconfig.xml**:这是iBatis的核心配置文件,其中...

    ibatis持久层简单操作

    在实际项目中,结合Spring框架,Ibatis可以更好地融入到企业级应用的开发中,提高开发效率和代码质量。在进行Ibatis操作时,需要注意SQL语句的编写、结果映射的配置以及事务的管理,这将直接影响到应用程序的性能和...

    ibatis实现增删改查功能demo

    - **Delete**:类似地,使用@Delete注解定义删除操作,传入相应的主键或条件,Ibatis会根据这些条件生成并执行删除SQL。 - **Update**:使用@Update注解,编写更新的SQL语句,通过传入的对象属性来确定更新哪些...

    struts+ ibatis上传下载文件

    前端可能使用JavaScript(例如jQuery)来实现分页UI,而Struts1 Action会根据当前页码和每页数量从数据库中查询并返回相应文件记录。 6. **JavaScript库**:描述中提到了现成的JS库,这些库可能用于增强用户体验,...

    iBATIS DataMapper1.6 中文翻译

    在iBATIS DataMapper 1.6.0版本中,有以下几个重要的改进: 1. 解决了带有`group by`的`Select`语句中N+1问题,优化了查询性能,避免了多次数据库访问。 2. 引入了`&lt;include/&gt;`节点,支持SQL片段的重用,提高代码的...

    IBatis.net教程

    - 查询操作:如果需要从数据库中查询多行数据,iBATIS同样可以返回对象或对象集合,每个对象代表数据表中的一行。 ***通过这些特性为.NET开发者提供了一种简化数据库操作、增强代码可读性和可维护性的框架。尽管...

Global site tag (gtag.js) - Google Analytics