MyBatis在Oracle中插入数据并返回主键的问题解决

 

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

前言:我早期用过这个方法,但是返回的依旧是影响行数,不是主键。

只是这种写法可以达到我要的效果:

用selectKey ,在insert 执行成功后,对象的ID属性已经被 MyBatis 赋值了,可以直接对象.id 取到主键值。 

 

 

 

引言:  在MyBatis中,希望在Oracle中插入数据之时,同时返回主键值,而非插入的条数...

环境:MyBatis 3.2 , Oracle, Spring 3.2

  SQL Snippet in XML Configuration:

[html]  view plain  copy
 
  1. <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">  
  2.     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">  
  3.        SELECT U_USER_INFO_SEQ.Nextval as ID from DUAL  
  4.    </selectKey>  
  5.       
  6.     insert into U_USER_INFO  
  7.     <trim prefix="(" suffix=")" suffixOverrides="," >  
  8.       <if test="id != null" >  
  9.         ID,  
  10.       </if>  
  11.       <if test="userName != null" >  
  12.         USER_NAME,  
  13.       </if>  
  14.       <if test="realName != null" >  
  15.         REAL_NAME,  
  16.       </if>  
  17.     .....  
  18. </insert>  

 

要点是这里使用了selectKey来定义返回新生成的PrimaryKey,这个情况仅仅适用于Oracle。

 

需要注意的地方是在Java代码中使用Integer类型,但是在MyBatis的映射文件中,使用java.math.BigDecimal类型,否则会报类型转换或者不匹配的错误。

 

其他比如MySQL或者SQLServer的情况适用于以下情况:

 

[html]  view plain  copy
 
  1. <insert id="insert" parameterType="Spares"     
  2.         useGeneratedKeys="true" keyProperty="id">    
  3.         insert into spares(spares_id,spares_name,    
  4.             spares_type_id,spares_spec)    
  5.         values(#{id},#{name},#{typeId},#{spec})    
  6.     </insert>    

使用useGeneratedKeys/KeyProperty来实现插入数据的时候,来完成新生成主键的返回。

 

 

其中异常信息的解决:

异常信息:

   org.springframework.jdbc.UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLException: 无效的列类型: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 无效的列类型: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor; nested exception is java.sql.SQLException:
无效的列类型: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor

 

问题解决:

    问题是在Java代码中设置返回的主键数据类型,其中返回的数据类型为java.lang.Integer,而非BigDecimal和Long. 但是在MyBatis中的映射文件中的类型为java.math.BigDecimal.

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: MyBatis可以使用批量插入来实现批量新增数据,而在Oracle数据,可以通过使用序列来自动生成主键,然后将主键插入到相关的表。 在MyBatis,通常使用`insertBatch`语句来实现批量新增,可以通过定义一个`List`来作为参数,每个元素代表一个要新增的对象,然后使用#{属性名}来引用相应的属性值。在执行批量新增时,也可以设置`batch`元素的`size`属性来指定批处理的大小,以优化性能。 此外,为了在新增数据返回主键值,可以使用`selectKey`语句来获取生成的主键值。在Oracle,可以通过设置`selectKey`语句的`order`属性为`BEFORE`来让它在新增数据之前获取主键值,然后将主键值设置到相应的对象。 例如,以下是一个使用MyBatisOracle批量新增并返回主键的示例: ``` <insert id="insertBatch" parameterType="java.util.List"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long"> SELECT SEQ_ID.NEXTVAL FROM DUAL </selectKey> insert into USER (ID, NAME, AGE) values (#{id}, #{name}, #{age}) </insert> ``` 在上述示例,`insertBatch`语句插入一个`List`包含的多个`User`对象,通过`selectKey`语句获取自动生成的主键值并设置到相应的对象。 总之,通过结合MyBatisOracle的相关特性,可以实现批量新增并返回主键的功能,以提高数据插入的性能和效率。 ### 回答2: MyBatis是一种JAVA持久层框架,使用MyBatis可以让程序员将数据库查询语句和JAVA代码相分离,很大程度上减少了编程量和维护成本。Oracle是一种常用的关系型数据库管理系统,是企业应用的首选。 在MyBatis Oracle批量新增数据时,我们需要使用Oracle的SEQUENCE(序列)来生成主键。SEQUENCE是Oracle的一种内部对象,能够生成一个唯一的数字序列,可以用于自动分配主键。我们需要在MyBatis XML配置文件定义一个带有“selectKey”标签的insert语句,这个标签会让MyBatis在执行insert语句之前先查询SEQUENCE,然后将取得的结果作为主键插入数据。 具体操作流程如下: 1. 创建一个Sequence。 CREATE SEQUENCE seq_test MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20; 2.在MyBatis XML配置文件定义一个insert语句,并在该语句下面用“selectKey”标签来声明取得主键的方式。其,“order”属性表示主键生成的顺序,可以选择“before”或“after”;“keyProperty”属性表示主键生成后存储在哪一个对象属性,一般情况下是实体类的主键属性;“resultType”属性表示主键类型。 <insert id="batchInsert" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> insert into table_test (id, name) values(seq_test.nextval, #{item.name}) </foreach> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> SELECT seq_test.currval FROM DUAL </selectKey> </insert> 3.在Java代码调用该insert语句,并将数据存储在List。 List<TestEntity> testList = new ArrayList<>(); for (int i = 0; i < 10; i++) { TestEntity test = new TestEntity(); test.setName("name_" + i); testList.add(test); } testMapper.batchInsert(testList); 4.执行以上代码后,MyBatis会根据insert语句将数据批量插入数据,并通过SEQUENCE生成主键。在insert语句执行完之后,MyBatis会自动查询主键并将其存储在实体类的主键属性。我们可以通过遍历List来获取新插入数据主键值: for (TestEntity test : testList) { System.out.println(test.getId()); } 总之,MyBatisOracle的配合使用可以实现批量新增并返回主键的操作。使用Oracle的SEQUENCE可以保证主键值的唯一性,MyBatis的XML配置文件使用selectKey标签可以获取新插入数据主键值。 ### 回答3: 在 MyBatis ,可以通过使用批量插入操作来实现在 Oracle 数据批量新增并返回主键值。 实现步骤如下: 1. 首先需要在 mapper.xml 文件定义一个 insertList 节点,用于批量插入数据: ``` <insert id="insertList" parameterType="java.util.List"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long"> SELECT SEQ.nextval as id FROM dual </selectKey> insert into table_name (id, col1, col2, col3) values (#{id}, #{col1}, #{col2}, #{col3}) </insert> ``` 其,keyProperty 属性指定主键的属性名称,order 属性指定主键生成的顺序,resultType 属性指定主键数据类型(这里使用了 Long 类型)。 2. 在 Java 代码,通过 sqlSession 的 insert 方法来执行批量新增操作: ``` List<Data> dataList = ...; // 构造待插入数据列表 for (Data data : dataList) { sqlSession.insert("insertList", data); } sqlSession.commit(); // 提交事务 ``` 在执行插入操作时,MyBatis 会自动调用 selectKey 节点指定的 SQL 语句来生成主键值,并将其赋值给对应的属性。最终,主键值会被映射回 Java 对象,以便后续使用。 需要注意的是,在 Oracle 数据,使用批量插入操作时,需要将 autoCommit 属性设置为 false,以确保所有插入操作都在同一事务执行。 总结:通过 MyBatis 的批量插入操作,我们可以很方便地实现在 Oracle 数据批量新增并返回主键值的功能。在实现过程,需要注意正确配置 mapper.xml 文件,并将 autoCommit 属性设置为 false,以确保操作在同一事务执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值