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.

MyBatis在Oracle中插入数据并返回主键的问题解决,布布扣,bubuko.com

时间: 2024-10-10 15:07:31

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

如何使用myBatis在数据库中插入数据并返回主键

在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列sequence, Nextval是获取自增的id <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType=&quo

Mybatis 插入数据后返回主键值

Oracle中获取刚刚插入记录的主键值: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">    SELECT U_US

Laravel 5 插入数据后返回主键ID

方法一: $info = DB::table('表名')->insertGetId(['imgName' => $fileName]);//图片名入库后返回添加数据行的主键ID 方法二:(适用于Mysql数据库) 执行原生SQL,然后返回新添加的主键ID值 语法:INSERT INTO 表名(字段1, 字段2, 字段3) VALUES (值1, 值2, 值3);SELECT @@IDENTITY AS returnName; #返回刚插入的数据的主键ID并起别名为 "returnNa

向Mysql主键自增长表中添加数据并返回主键

表level,其主键为lid 1.select max(id) from table 查询语句:SELECT MAX(lid) FROM LEVEL 返回插入主键 2.select LAST_INSERT_ID(id) from table 查询语句:SELECT LAST_INSERT_ID(lid) FROM LEVEL; 返回主键列表,最后一个值为插入主键 3.select @@identity from table 查询语句:SELECT @@identity FROM level 返回

mybatis插入数据并返回主键(oracle)

通常我们执行一个inser语句,即使有返回,也只是会返回影响了多少条数据 @insert("insert into t_user (id,name) values (suser.nextval,#{item.name,jdbcType=VARCHAR})") void insert(@Param("item") TUser t); 但在有些时候,我们还需要获得插入数据的主键,在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGenera

mybatis 插入数据并返回主键值

<insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys="true" keyProperty="subjectid" > insert into t_subject ( parentid, subjectname, subjecttype, subjectitem, subjectanser, displaytype) value

基于mybatis向oracle中插入数据的性能对比

数据库表结构: 逐条插入sql语句: <insert id="insert" parameterType="com.Structure"> INSERT INTO STRUCTURE( id, structureNAME, PARENTID, structureType, description, deptId, propertyCompanyId, sort, communityId) VALUES( #{id,jdbcType=VARCHAR}, #

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

mybatis在oracle插入对象后返回主键值

在mybatis中默认插入一条记录后,返回值为插入记录的条数. 现在想获取插入记录后,当前被插入的记录的主键值,需在insert方法中添加如下代码: <insert id="insert" parameterType="cn.com.pm.ppm.model.UserInfo" >   <selectKey resultType="java.math.BigDecimal" order="BEFORE" ke