欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-26 09:58:55
引言: 在mybatis中,希望在oracle中插入数据之时,同时返回主键值,而非插入的条数... 环境:mybatis 3.2 , oracle, spring 3.2 sq...

引言: 在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.