【PostgreSQL 数据库】MyBatis Insert 获取插入行的主键

MyBatis 的 insert 方法返回的是受影响的记录行数。如果需要在 insert 时获取表字段自动生成的主键值可以在 insert 标签中增加设置两个属性:

  • useGeneratedKeys=”true”

  • keyProperty=”主键需要填充到实体的属性名”

keyProperty 不是必填的,MyBatis 会默认添加到实体对应的主键属性上。

具体使用方法

1
2
3
4
5
6
7
8
9
User user = new User();
user.setUserName("测试用户");
int i = userMapper.addUser(user);
System.out.println("受影响的行数:" + i);
System.out.println("对象新内容:" + user); // 主键通过 user.getUserCode() 获取

// 结果:
受影响的行数:1
对象新内容:User{userCode='3', userName='测试用户'}

UserMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "/mybatis-3-mapper.dtd">
<mapper namespace="mapper.UserMapper">

<resultMap id="UserMap" type="entity.User">
<id column="user_code" property="userCode" />
<result column="user_name" property="userName" />
</resultMap>
<!-- 插入 -->
<insert id="addUser" parameterType="entity.User" useGeneratedKeys="true" keyProperty="userCode" >
insert into t_user_1(user_name) values (#{userName})
</insert>
</mapper>

UserMapper.java

1
2
3
public interface UserMapper {
int addUser(User user);
}

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User {

@Getter
@Setter
private String userCode; // 主键字段

@Getter
@Setter
private String userName;

@Override
public String toString() {
return "User{" + "userCode='" + userCode + '\'' + ", userName='" + userName + '\'' + '}';
}
}

备注

这种方法经测试在 PostgreSQL 数据库中,主键通过函数生成和通过序列生成这两种方式都是可以支持的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 主键为 UUID
CREATE TABLE public.t_user_1
(
user_code character varying(32) NOT NULL DEFAULT sys_guid(), -- 用户编码
user_name character varying(20), -- 用户姓名
CONSTRAINT t_user_1_pkey PRIMARY KEY (user_code)
);

-- 主键来自序列
CREATE TABLE public.t_user_2
(
user_code serial, -- 用户编码
user_name character varying(20), -- 用户姓名
CONSTRAINT t_user_2_pkey PRIMARY KEY (user_code)
);