mybatis的selectkey使用

需求

最近有个需求,每次注册的时候根据注册的角色不同分别在不同的表建立一个新的数据栏并返回其主键,打算使用mybatis的selectkey返回mysql的自增主键,然后根据返回的主键值创建新用户,将其sid或者tid相等(t_Login.sid = t_student.sid或者t_Login.tid = t_teacher.tid)

实现

以学生角色为例

Dao层

1
2
// 返回当前数据库新增的主键
void selectPrimaryKey(Student student);

Mapper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--登陆-->
<insert id="insert" parameterType="com.system.management.dal.model.Login" useGeneratedKeys="true"
keyProperty="loginid">
INSERT INTO t_login (username, password, sid,tid, email) VALUES (#{username,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},#{sid,jdbcType=INTEGER},#{tid,jdbcType=INTEGER}, #{email,jdbcType=VARCHAR})
</insert>

<!--返回主键值 -->
<insert id="selectPrimaryKey" parameterType="com.system.management.dal.model.Student">
<!--插入一个空栏-->
insert into t_student() VALUES()
<!--注意order里的after代表先执行插入操作再返回其主键值-->
<!--注意parameterType中的POJO必须有sid字段,并有get/set方法-->
<!--last_insert_id()会将返回的值赋值给keyProperty,也就是sid-->
<selectKey resultType="java.lang.Integer" keyProperty="sid" order="AFTER">
SELECT last_insert_id()
</selectKey>
</insert>

Service层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Autowired
private StudentMapper stu;

@Autowired
private LoginMapper login;

// 传入一个sid为空的Student对象
@Override
public void registerstu(Student student, Login role) {
stu.selectPrimaryKey(student);
//将Student的Sid值取出来赋值给Login对象
// 传入的student对象,sid已经被之前的sql语句所赋值,所以在此阶段sid是有值的
role.setSid(student.getSid());
//注册
login.insert(role);
}

Controller

1
2
3
4
5
6
7
8
9
10
11
//注册学生老师用户
@RequestMapping("/register")
public String register(Student student, Teacher teacher, Login role, String mes) {
//根据前端的select控件返回的值新增在不同的表
if ("student".equals(mes)) {
service.registerstu(student, role);
} else if ("teacher".equals(mes)) {
teacherService.registertea(teacher, role);
}
return "redirect:/index.html";
}

2021年5月31日 补充

像mybatis返回主键,不论是selectkey方法还是useGeneratedKeys=true,最后返回的主键都是赋值在你传进来的bean对象中,而不是直接用int去接收

1
2
// 主键存放在Participle对象中返回,而不是这个int值
int insertSelective(Participle record);
赏个🍗吧
0%