通常我们会将数据库表的主键id设为自增。在插入一条记录时,我们不设置其主键id,而让数据库自动生成该条记录的主键id,那么在插入一条记录后,如何得到数据库自动生成的这条记录的主键id呢?有两种方式:
- 使用
useGeneratedKeys
和keyProperty
属性
<insert id="save" parameterType="com.xia.domo.User" useGeneratedKeys="true" keyProperty="id">
insert into user (username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})
</insert>
- 使用
<selectKey>
子标签
<insert id="save" parameterType="com.xia.domo.User">
<!-- keyProperty代表要返回值的名称 order取值为AFTER表示插入后的行为 resultType 代表返回值的类型-->
<!-- 查询新增的id的返回值 -->
<selectKey keyProperty="id" order="AFTER" resultType="INTEGER">
select last_insert_id()
</selectKey>
insert into user (username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})
</insert>
如果使用的是mysql
这样的支持自增主键的数据库,可以简单的使用第一种方式;对于不支持自增主键的数据库,如oracle,则没有主键返回这一概念,而需要在插入之前先生成一个主键。
此时可以用<selectKey>
标签,设置其order
属性为BEFORE
,并在标签体内写上生成主键的SQL语句,这样在插入之前,会先处理<selectKey>
,生成主键,再执行真正的插入操作。
<selectKey>
标签其实就是一条SQL,这条SQL的执行,可以放在主SQL执行之前或之后,并且会将其执行得到的结果封装到入参的Java对象的指定属性上
。注意<selectKey>
子标签只能用在<insert>
和<update>
标签中。上面的LAST_INSERT_ID()
实际上是MySQL提供的一个函数,可以用来获取最近插入或更新的记录的主键id。
测试代码:
/**
* 保存操作
* @throws IOException
*/
@Test
public void TestSave() throws IOException {
User user = new User();
user.setSex("女");
user.setUsername("屎尧");
user.setAddress("湖北襄阳");
user.setBirthday(new Date());
//1.读取配置文件,形成字节输入流
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
//3.SqlSession对象
SqlSession session = factory.openSession();
//4.获取dao的代理对象
IUserDao mapper = session.getMapper(IUserDao.class);
//5.执行保存方法
System.out.println("前"+user);
mapper.save(user);
session.commit();
System.out.println("后"+user);
//6.释放资源
session.close();
in.close();
}
结果如下: