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

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

环境: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.

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐