# JDBC 高级

# 获取插入数据的主键

MySQL 支持通过 AUTO_INCREMENT 关键字来实现有它管理/维护主键 ID 的功能。有时你会在向 MySQL 插入一条新数据后向它“询问”该数据的主键。

prepareStatement() 方法有一个两参数重载形式,它的第二个参数形参名为 autoGeneratedKeys。通过向该参数传入 Statement.RETURN_GENERATED_KEYS 表示启用获取主键功能。

在通过 PreparedStatement 对象执行完 execute() / executeUpdate() 后,调用 PreparedStatement 对象的 getGeneratedKeys() 方法,可以获得一个结果集对象。该结果集仅有一行一列,其值为新插入数据的主键 ID 值。

String sql = "xxxx";

PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setXXX(xx, xxx);
pstmt.executeUpdate();

ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
    Long id = rs.getLong(1);
    System.out.println(id);
}

Statement 对象也有类似方法,及相同处理方案。

# 设值 NULL

通过 JDBC 的 PreparedStatement 向数据库表字段设值为 NULL,不能直接使用类似 setString(xxx, nlll) 这样的方法。

JDBC 为此专门提供到了一个 setNull(xxx, Types.XXX) 方法,来为 pst 中第 N 个占位符 的位置写入一个 NULL。

其中第二个参数是该字段的数据库类型。

# 处理 Blob(选学)

BLOB 类型的字段用于存放大量的二进制数据,例如:图片、视频、音频和大型文件等。

MySQL 的 BLOB 类型细分为:

  • TinyBlob,最大 255 字节。
  • Blob,最大 65k。
  • MediumBlob,最大 16M。
  • LongBlob,最大 4G。

JDBC中,插入 Blob 类型必须使用 PrepareStatement,因为 Blob 类型的数据无法使用字符串拼接。

调用 setBlob(int index, InputStream inputStream)