欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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