Mybatis配置useGeneratedKeys 参数

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

配置mybatis的配置文件,设置useGeneratedKeys属性值为true:

 <settings>   
        <setting name="useGeneratedKeys" value="true" />   
  </settings>

编写一个pojo类:

/*
 * 使用示例:表对应的 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
}

此时再UserMapper中插入user表的语句可以这样写:

<insert id="addUser" parameterType="com.model.User"  keyProperty="id">
    insert into User(name, age) values(#{name}, #{age})
</insert>

keyProperty 标记了一个属性, MyBatis会通过 getGeneratedKeys 设置这个属性的值,DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。

这个时候你是否能够感觉到useGeneratedKeys配置与selectKey的作用是那么的类似?那么它俩又有什么关系呢?

        这样的场景,当你使用的关系型数据库时Oracle 这样不支持自增主键列的数据库时,如果把useGeneratedKeys 参数配置为 true,在插入数据时则可能会出现 ORA-00933: SQL command not properly ended 这样的错误。这时,可以将 useGeneratedKeys 配置为 false,那怎么实现获取上次生成id的功能呢?可以使用 mybatis 提供的 selectKey 手动提供类似自增序列的效果。

总结:

        如果数据库支持自增长主键字段(比如mysql、sql server)设置useGeneratedKeys=”true”和keyProperty,这样就可以获得插入的主键id值,并赋值给返回的pojo对象(或者单纯的id值); 

        oracle则不支持自增长id,需要设置useGeneratedKey=”false”,如果设置true则会有报错信息。然后通过nextval函数,如SEQ_table.Nextval生成id,插入更新一条数据时,可以使用selectKey获取id操作。

<insert id="insert">
 <selectKey keyProperty="id" resultType="int" order="BEFORE">
  <if test="_databaseId == 'oracle'">
   select seq_users.nextval from dual  </if>
  <if test="_databaseId == 'db2'">
   select nextval for seq_users from sysibm.sysdummy1"  </if>
 </selectKey>
 insert into users values (#{id}, #{name})</insert>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值