# 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)