MyBatis oracle insert new row always return 错误的主 id 值
MyBatis oracle insert new row always return wrong primary id value
向 oracle DB 插入新行后尝试获取主 ID
<insert id="createActivityLog" parameterType="ActivityLog" >
<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
select ACTIVITY_LOG_SEQ.nextval as id from dual
</selectKey>
insert into ACTIVITY_LOG (
activity_log_id,
notes,
details )
values (
#{id,jdbcType=NUMERIC},
#{notes,jdbcType=VARCHAR},
#{details,jdbcType=VARCHAR}
)
这里是 java 调用
Integer myId=(Integer) activityLogDao.createActivityLog(alog);
新 data/row 可以插入到数据库中,正确的主数据库 key/id 没有问题。但是 myID 总是返回 1(应该是 8971)。我怎样才能得到正确的价值。提前致谢。
版本:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
您的插入 returns 1 表示成功,0 表示失败。如果要使用主键,请使用您用于插入的对象的getId()。
*示例)
activityLogDao.createActivityLog(alog);
Integer myId = alog.getId();
由于<selectKey />
需要额外的查询,一般来说useGeneratedKey
是首选。
我将向您展示如何使用 useGeneratedKeys
进行以下用法。
- 在插入语句中使用
nextval
- 使用
nextval
作为列的默认值
- 使用
identity
列
为了便于解释,我将针对每种情况使用单独的 table。
create sequence test_seq increment by 1 start with 1;
create table user1 (
id int,
name varchar(10)
);
create table user2 (
id int default test_seq.nextval,
name varchar(10)
);
create table user3 (
id int generated always as identity,
name varchar(10)
);
用法 1 的插入语句如下所示。
@Insert({
"insert into user1 (id, name)",
"values (test_seq.nextval, #{name})"})
@Options(useGeneratedKeys = true,
keyProperty = "id", keyColumn = "id")
void insert1(User user);
为了完整起见,这里有一个 XML 版本。
<insert id="insert1" useGeneratedKeys="true"
keyProperty="id" keyColumn="id">
insert into user1 (id, name)
values (test_seq.nextval, #{name})
</insert>
用法 2 和 3 的插入语句基本相同。
请注意,列列表中省略了 id
。
@Insert({"insert into user2 (name) values (#{name})"})
@Options(useGeneratedKeys = true,
keyProperty = "id", keyColumn = "id")
void insert2(User user);
这是一个演示项目:
https://github.com/harawata/mybatis-issues/tree/master/so-66252438
向 oracle DB 插入新行后尝试获取主 ID
<insert id="createActivityLog" parameterType="ActivityLog" >
<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
select ACTIVITY_LOG_SEQ.nextval as id from dual
</selectKey>
insert into ACTIVITY_LOG (
activity_log_id,
notes,
details )
values (
#{id,jdbcType=NUMERIC},
#{notes,jdbcType=VARCHAR},
#{details,jdbcType=VARCHAR}
)
这里是 java 调用
Integer myId=(Integer) activityLogDao.createActivityLog(alog);
新 data/row 可以插入到数据库中,正确的主数据库 key/id 没有问题。但是 myID 总是返回 1(应该是 8971)。我怎样才能得到正确的价值。提前致谢。
版本:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
您的插入 returns 1 表示成功,0 表示失败。如果要使用主键,请使用您用于插入的对象的getId()。
*示例)
activityLogDao.createActivityLog(alog);
Integer myId = alog.getId();
由于<selectKey />
需要额外的查询,一般来说useGeneratedKey
是首选。
我将向您展示如何使用 useGeneratedKeys
进行以下用法。
- 在插入语句中使用
nextval
- 使用
nextval
作为列的默认值 - 使用
identity
列
为了便于解释,我将针对每种情况使用单独的 table。
create sequence test_seq increment by 1 start with 1;
create table user1 (
id int,
name varchar(10)
);
create table user2 (
id int default test_seq.nextval,
name varchar(10)
);
create table user3 (
id int generated always as identity,
name varchar(10)
);
用法 1 的插入语句如下所示。
@Insert({
"insert into user1 (id, name)",
"values (test_seq.nextval, #{name})"})
@Options(useGeneratedKeys = true,
keyProperty = "id", keyColumn = "id")
void insert1(User user);
为了完整起见,这里有一个 XML 版本。
<insert id="insert1" useGeneratedKeys="true"
keyProperty="id" keyColumn="id">
insert into user1 (id, name)
values (test_seq.nextval, #{name})
</insert>
用法 2 和 3 的插入语句基本相同。
请注意,列列表中省略了 id
。
@Insert({"insert into user2 (name) values (#{name})"})
@Options(useGeneratedKeys = true,
keyProperty = "id", keyColumn = "id")
void insert2(User user);
这是一个演示项目:
https://github.com/harawata/mybatis-issues/tree/master/so-66252438