在实际项目开发中很多情况下是需要获取新插入的数据的主键值。
在此已MySQL数据库的自增主键为例进行说明:
背景介绍:基础信息和数据库表结构信息请参见前面的文章。
1、mapper映射文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="UserSpace"> <!-- 添加用户,返回主键 --> <insert id="addUserRetPrim" parameterType="com.wp.model.User"> <selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() </selectKey> insert into user(username, sex, age, birthday, address) values(#{userName}, #{sex}, #{age}, #{birthDay}, #{address}) </insert> </mapper>
注意:
【selectKey】标签用于设置主键的返回方式。
“resultType”:设置主键的返回类型。
“order”:表示主键返回的时间。取值为:AFTER/BEFORE。“AFTER”表示在执行完成insert语句后返回此主键。“BEFORE”表示在指定insert语句之前返回此主键。
“keyProperty”:表示在模型对象中的主键属性名称。在此模型对象中必须有此属性的get、set方法。
【SELECT LAST_INSERT_ID()】是mysql查询最近插入数据库的主键语句。
2、测试文件:
package com.wp.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.wp.model.User;
import com.wp.util.DateUtil;
public class UserTest2 {
@Test
public void testAddUserRetPrim() {
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
Date birthDay = DateUtil.parseStrToFullDate("1993-10-04", "yyyy-MM-dd");
User user = new User("李太白", 1, 306, birthDay, "北京市西城区西直门");
System.out.println("插入前主键:" + user.getId());
session.insert("UserSpace.addUserRetPrim", user);
session.commit();
System.out.println("end....");
session.close();
System.out.println("插入后主键:" + user.getId());
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、测试结果及数据库结果: