mybatis3 mysql自动生成主键_mybatis的selectKey用来给不支持自动生成主键的数据库用,什么意思?...

本文介绍了MyBatis如何处理主键自增问题,特别是针对不支持自动生成主键的数据库。在MySQL中,可以通过设置useGeneratedKeys和keyProperty自动获取自增主键。而在Oracle中,由于不支持auto_increment,可以利用selectKey元素配合序列先获取主键,再进行插入操作。通过对示例的解释,详细说明了selectKey元素的工作原理和配置方式。
摘要由CSDN通过智能技术生成

在项目中的表格主键我们大多使用自增的字段id来表示,但是不同的数据库对自增这个问题的解决方式是不同的,如MySql本身是支持自增的,对字段添加auto_increment配置即可,但是Oracle并不支持自增,必须借助序列来解决,而selectKey就是帮助MyBatis来解决这个问题的。那我们来看下MyBatis在插入数据的时候是如何解决主键自增问题的。

看下Mybatis中insert语句与主键有关的两个属性配置:如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server 数据库),那么你可以设置 useGeneratedKeys=”true”,而且设置 keyProperty 到你已经做好的目标属性上。例如在MySql中创建表格User,设置id字段为自增:

CREATE TABLE `user` (

`Id` int(11) NOT NULL auto_increment,

`account` varchar(25) default NULL,

`password` varchar(25) default NULL,

`username` varchar(25) default NULL,

PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

那么插入数据的配置语句可以修改为:

useGeneratedKeys=”true” keyProperty=”id”>

insert into user (account,username,password)

values (#{account},#{username},#{password})

MyBatis 有另外一种方法来处理数据库不支持自动生成类型,或者可能 JDBC 驱动不支持自动生成主键时的主键生成问题。 如Oracle中不支持关键字auto_increment,所以不能设置字段为自增,那么在插入数据的时候不能自动生成主键值,就需要使用selectKey,语句如下:

select idseq.nextVal from dual

insert into User

(id, account,username, password) values

(#{id}, #{account},#{username}, #{password})

在上面的示例中,

selectKey 元素将会首先运行, User的 id 会被设置,然后插入语句会被调用。这给你了一个简单的行为在你的数据库中来处理自动生成的主键,而不需要使你的 Java 代码变得复杂。

selectKey 元素描述如下:

keyProperty="id"

resultType="int"

order="BEFORE"

statementType="PREPARED">

来个实际的例子验证下:

Oralce数据库中有表格t_user和序列idseq,表格的数据如下:

idseq的当前值是4,状态如下:

user的映射文件中有如下配置:

当我们执行如下代码后,看下数据的变化:

代码中在执行addUser之前没有设置user对象的id属性,配置中通过执行selectKey会为user对象设置id属性的值,所以看到控制台输出的id分别为:

而数据库中也会增加相应的值,表格数据变化如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值