【JavaEE】之MyBatis插入数据后获取自增主键

时间:2021-02-10 13:39:11

  很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作。针对这个问题,有两种解决方案:

  • 先插入,后查询。我们可以先插入一条数据,然后根据插入的数据的各个字段值,再次访问数据库,从数据库中将刚刚插入的数据查询出来。当然,这种方法是很笨的,不提倡使用。
  • MyBatis为我们提供了一种在插入数据后获取自增主键的方式,通过这种方式,我们可以在插入一条数据之后直接从插入的POJO对象中取出id即可。这种方式简单且效率高、节省代码量,因此提倡使用。

  Mapper.xml文件中的代码如下:

<mapper namespace="testuser">
    <insert id="insertUser" parameterType="com.itgungnir.hellomybatis.bean.User">
        <!-- 将插入数据的主键返回,返回到User对象中 -->
        <!-- keyProperty:将查询到的主键值设置到parameterType对象的哪个属性中 -->
        <!-- order:SELECT LAST_INSERT_ID()语句的执行顺序(相对于insert语句来说的执行顺序) -->
        <!-- resultType:指定SELECT LAST_INSERT_ID()语句的结果类型 -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            <!-- SELECT LAST_INSERT_ID():得到刚insert到数据表中的记录的主键值,只适用于自增主键 -->
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user(name) VALUES(#{name})
    </insert>
</mapper>

  测试代码中这样写:

public void insertUser(){
    SqlSession session = null;
    try {
        // MyBatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream is = Resources.getResourceAsStream(resource);
        // 创建会话工厂,传入MyBatis配置文件的信息
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        // 通过工厂得到SqlSession
        session = factory.openSession();
        // 要添加到数据库中的作为参数的员工对象
        User user = new User();
        user.setName("111111");
        // 通过SqlSession操作数据库,查询结果是与映射文件中的resultType相匹配的数据类型
        // 第一个参数:映射文件中Statement的id,等于namespace+"."+statementid
        // 第二个参数:指定和映射文件中的SQL语句匹配的parameter type类型的参数
        session.insert("testuser.insertUser", user);
        // 提交事务
        session.commit();
        // 打印主键
        System.out.println(user.getId());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 释放资源(会话资源)
        if (session != null) {
            session.close();
        }
    }
}