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