前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
前言:我早期用过这个方法,但是返回的依旧是影响行数,不是主键。
只是这种写法可以达到我要的效果:
用selectKey ,在insert 执行成功后,对象的ID属性已经被 MyBatis 赋值了,可以直接对象.id 取到主键值。
引言: 在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.