zoukankan      html  css  js  c++  java
  • [oracle] 如何使用myBatis在数据库中插入数据并返回主键

    在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数。

    ① oracle使用 selectKey。

    U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列sequence,
    Nextval是获取自增的id
    <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.

  • 相关阅读:
    运营总监招聘-e袋洗招聘-拉勾网
    中国服饰行业十大趋势
    赢在形象力之色彩
    百度系统部 在 北京市海淀区西二旗首创空间大厦 招聘 Python-交付运维系统研发工程师
    时间规划师
    使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道
    传统线下零售商已经过时了,细分电商领域的机会仍待挖掘 | 36氪
    艺术私学----免费摄影、绘画、时尚造型课程体验_豆瓣
    艺术私学------绘画免费体验课程_豆瓣
    艺术私学------绘画免费体验课程_豆瓣
  • 原文地址:https://www.cnblogs.com/avivaye/p/4179820.html
Copyright © 2011-2022 走看看