自动返回自增Id到入参对象

【笔记搬迁计划】

Mybatis 配置文件 useGeneratedKeys和keyProperty 参数

https://blog.csdn.net/nininininiabc222/article/details/79990570

Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

    /*
     * 配置 useGeneratedKeys = true
     * */
    <?xml version="1.0" encoding="UTF-8"?>   
    <!DOCTYPE configuration   
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
        "http://mybatis.org/dtd/mybatis-3-config.dtd">   
     
    <configuration>   
        <settings>   
            <setting name="useGeneratedKeys" value="true" />   
        </settings>   
        <typeAliases>   
            <!-- ... -->  
        </typeAliases>   
        <environments default="development">   
           <environment id="development">   
               <dataSource>   
                <!-- ... -->  
               </dataSource>   
           </environment>   
        </environments>   
        <mappers>   
            <mapper resource="mappers/*.xml" />   
        </mappers>   
    </configuration>

 

    /*
     * 使用示例:表对应的 POJO
     * */
    public class User {
        private int id;
        private String name;
        private Integer age;
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id= id;
        }
        //... 省略其它 getter 和 setter
    }
     
    /*
     * 使用示例:mapper
     * keyProperty 指明表的自增主键列
     * */
    <insert id="addUser" parameterType="com.model.User"  keyProperty="id">
        insert into User(name, age) values(#{name}, #{age})
    </insert>

DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。

 

但是,如果是 Oracle 这样不支持自增主键列的数据库,如果把useGeneratedKeys 参数配置为 true,在插入多条数据时则可能会出现 ORA-00933: SQL command not properly ended

这样的错误。这时,可以将 useGeneratedKeys 配置为 false,或者为了保证兼容性,使用 mybatis 提供的 selectKey 手动提供类似自增序列的效果。

<insert id="addUser" parameterType="com.model.User" > 

  <selectKey keyProperty="id" resultType="_long" order="BEFORE">
    select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1

  </selectKey>
  insert into User(id, name, age) values(#{id}, #{name}, #{age})

</insert> eg1: <insert id="xxx" parameterType="yyy"> <selectKey keyProperty="id" resultType="long" order="BEFORE"> select my_seq.nextval from dual </selectKey> ... </insert> eg2: <insert id="xxx" parameterType="yyy" useGeneratedKeys="true"> insert into table(...) values (...) <selectKey resultType="long" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() AS id </selectKey> </insert>

 

posted @ 2020-05-07 22:31  倾国倾城是我大名  阅读(260)  评论(0)    收藏  举报