使用JDBC获取插入记录的自增主键值

173 篇文章 16 订阅
23 篇文章 0 订阅

对于如下的表结构:

mysql> describe persons;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| age   | int(11)      | YES  |     | NULL    |                |
| birth | date         | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

id是自增的,一般我们在做插入操作的时候不会这样写INSERT INTO persons(id, name, age, birth, email) VALUES(?, ?, ? ,? ,?) ,而是省略id参数的设置,使其由MySQL数据库自动生成。
那么我们如何获取MySQL为我们生成的主键呢?

我们可以使用

PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
        throws SQLException;

autoGeneratedKeys:a flag indicating whether auto-generated keys should be returned; one of Statement.RETURN_GENERATED_KEYS or Statement.NO_GENERATED_KEYS.

使用:

@Test
    public void test() {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        int id = 0;
        try {
            connection = JDBCTools.getConnection();
            String sql = "INSERT INTO persons(name, age, birth, email) VALUES(?, ?, ?, ?)";
            statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            statement.setString(1, "xiya");
            statement.setInt(2, 25);
            statement.setDate(3, new Date(new java.util.Date().getTime()));
            statement.setString(4, "5342735@qq.com");
            //int result = statement.executeUpdate("INSERT INTO persons(name, age) VALUES('n3verl4nd',25)");
            //int result = statement.executeUpdate("DELETE FROM persons WHERE id = 6");
            statement.executeUpdate();

            rs = statement.getGeneratedKeys();
            if (rs.next()) {
                id = rs.getInt(1);
                System.out.println("插入数据的主键为:" + id);
            }

            ResultSetMetaData metaData = rs.getMetaData();
            for (int i = 0; i < metaData.getColumnCount(); i++) {
                System.out.println(metaData.getColumnName(i + 1));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                    System.out.println("rs closed");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                    System.out.println("statement closed");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                    System.out.println("connection closed");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //删除插入数据
            testDelete(id);
        }
    }

通过statement.getGeneratedKeys() 获得了新生成的主键的ResultSet对象。
通过

ResultSetMetaData metaData = rs.getMetaData();
            for (int i = 0; i < metaData.getColumnCount(); i++) {
                System.out.println(metaData.getColumnName(i + 1));
            }

的输出结果来看, 该ResultSet 仅包含一列,列名为GENERATED_KEY

MySQL数据库中,在执行插入操作后通过SELECT LAST_INSERT_ID(); 也可以获得自增主键值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

N3verL4nd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值