记录踩坑
有时候我们会面临一种需求:
把一条记录存入数据库后再获取数据库生成的数字主键,mybatis针对这一应用场景封装了selectKey,
我们肯定会这么写
<insert id="add">
insert into student(name,age,birth,schid) values (#{
stu.name},#{
stu.age},#{
stu.birth},#{
stu.schid})
<selectKey resultType="Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
Mapper会这么写
int add(@Param("stu") Student stu);
对不对?看似没有任何问题,可是一运行发现这条语句返回值永远是1…结果发现这个数字是1说明运行成功0说明失败,根本不是返回的我们需要的主键,
那咋办???
我们传入的是个对象,selectKey会直接返回数据库里的主键给我们传入的对象也就是说 我们需要这么改
<insert id="add">
insert into student(name,age,birth,schid) values (#{
stu.name},#{
stu.age},#{
stu.birth},#{
stu.schid})
<selectKey resultType="Integer" order="AFTER" keyProperty="stu.id">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
看到了我resultType改成stu.id了,意思就是查询结果直接映射给了传入的实体类,那么Mapper就void了
void add(@Param("stu") Student stu);
获得实体类的主键直接getId()就好了
看看我service里面的add方法
public int add(Student stu){
SqlSession session =SF.getConnection();
try{
StudentMapper dao =session.getMapper(StudentMapper.class);
dao.add(stu);
session.commit();
return stu.getId();//getter方法获得id
}catch (Exception e){
e.printStackTrace();
if(session!=null)
session.rollback();
return -1;
}finally {
if(session!=null)
session.close();
}
}
总结
引用数据类型传地址过去,myBatis会直接映射修改,避免再犯错,记录下来