mybatis插入数据时返回主键(mysql数据库)
程序员文章站
2022-06-02 19:05:40
...
第一种方式使用useGeneratedKeys属性
User类
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
...
mapper文件
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user(username, birthday, sex, address)
values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
- 在insert标签中需要将useGeneratedKeys属性设置为true
- keyProperty属性值是主键对应的pojo中的属性
- 返回的主键会放置在入参对象中的id属性上
mapper接口
public interface UserMapper {
void insertUser(User user) throws Exception;
}
测试代码
@Test
public void testInserUser () throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("张三");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("武汉");
userMapper.insertUser(user);
sqlSession.commit();
System.out.println(user.getId());
sqlSession.close();
}
上面的测试代码中入参是一个user对象,返回的主键是在该对象的id属性中,所以使用user.getId()可以获取到该主键。
第二种方式selectKey标签(mysql)
mapper配置文件
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username, birthday, sex, address)
values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
- keyProperty属性值也是返回的主键值是与对象中的哪一个参数对应
- resultType是返回的主键类型
- select LAST_INSERT_ID()是mysql中的一个函数,用于自动返回下一个主键
- order属性,可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用,order属性的设置主要是和使用的数据库有关。
oracle的返回主键
上面的案例中是使用的mysql数据库,如果是使用的oracle就不一样,由于oracle不是像mysql一样使用主键自增长,而是使用序列。
<insert id="insertUser" parameterType="User">
<selectKey keyColumn="id" keyProperty="id" order="BEFORE" resultType="long">
select SEQ_ID.nextval from dual;
</selectKey>
insert into user(username, birthday, sex, address)
values (#{username}, #{birthday}, #{sex}, #{address})
</insert>
- order设置为了before,前面说order的设置与使用的数据库有关,如果是使用的mysql,设置为after,也就是说是先插入数据,然后返回主键,是因为mysql有主键自增长的功能。这里使用的是oracle,主键是需要自己先生成的,然后再插入到数据库中,所以order需要设置为before。
- 返回主键是使用select SEQ_ID.nextval from dual;和mysql不同。
转载于:https://my.oschina.net/guowei11/blog/3086508