MyBatis在Oracle中插入数据并返回主键的问题解决
2016-04-12 13:03
701 查看
引言: 在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数...
环境:MyBatis 3.2 , Oracle。 Spring 3.2
SQL Snippet in XML Configuration:
要点是这里使用了selectKey来定义返回新生成的PrimaryKey,这个情况只适用于Oracle。
须要注意的地方是在Java代码中使用Integer类型。可是在MyBatis的映射文件里。使用java.math.BigDecimal类型,否则会报类型转换或者不匹配的错误。
其它比方MySQL或者SQLServer的情况适用于下面情况:
当中异常信息的解决:
异常信息:
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.
环境:MyBatis 3.2 , Oracle。 Spring 3.2
SQL Snippet in XML Configuration:
<insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id"> SELECT U_USER_INFO_SEQ.Nextval as ID from DUAL </selectKey> insert into U_USER_INFO <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > ID, </if> <if test="userName != null" > USER_NAME, </if> <if test="realName != null" > REAL_NAME, </if> ..... </insert>
要点是这里使用了selectKey来定义返回新生成的PrimaryKey,这个情况只适用于Oracle。
须要注意的地方是在Java代码中使用Integer类型。可是在MyBatis的映射文件里。使用java.math.BigDecimal类型,否则会报类型转换或者不匹配的错误。
其它比方MySQL或者SQLServer的情况适用于下面情况:
<insert id="insert" parameterType="Spares" useGeneratedKeys="true" keyProperty="id"> insert into spares(spares_id,spares_name, spares_type_id,spares_spec) values(#{id},#{name},#{typeId},#{spec}) </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.
相关文章推荐
- Oracle客户端和服务端编码方式修改
- 存储过程中创建临时表,为何没有权限?
- Oracle认证考试介绍
- oracle 中sum和count的区别
- win7安装oracle 10g时发生“程序异常终止。发生内部错误”的提示
- Oracle建立表空间和用户
- DML
- oracle误删数据表还原的二种方法(oracle还原)
- oracle EM中accessibility mode为disable解决方案
- ORACLE ADR 不能直接执行repair failure,需要先执行advice failure,生成修复脚本
- oracle 索引 状态 unusable,usable ,disable,enable
- Oracle 函数
- 分析函数KEEP关键字释义
- mysql、sql server、oracle的连接信息
- centos7更改机器名后oracle无法使用
- 在oracle下如何创建database link全面总结
- 【oracle】dblink创建
- Oracle 10g R2 RAC手动打补丁PSU(10.2.0.5.19)
- Oracle修改最大连接数
- Windows8 64安装Oracle 11g说明