$ JDBC笔记

$ 概念

$ Schema

在MySQL中schemadatabase是同义词,在SQL语句中可以把关键字database替换为关键字schema。但是在Oracle, DB2等数据库中有所不同。

参考:

$ Connection接口

$ Timeout

Connection.setNetworkTimeout()

参考:

$ 切换Database

使用jdbc接口而不要执行USE <databasename>语句:

Connection.setCatalog();

原因:

  1. 数据库无关性
  2. driver可能需要执行一些其他操作

注意:

  • 不会影响已经存在的或者prepared的statement

参考:

$ 查询

$ 查询元数据

Oracle获取列comment:

OracleConnection oraCon = (OracleConnection)con;
oraCon.setRemarksReporting(true);
DatabaseMetaData dmt = con.getMetaData();    
colRs = dmt.getColumns(null, "dbo", 'Student', null);
while (colRs.next()) {
   System.out.println(colRs.getString("REMARKS");
}

MySQL获取表及列comment:连接参数中指定useInformationSchema=true

参考:

$ Satement

Statement.setMaxRows() 给JDBC驱动程序一个提示,当此Statement生成的ResultSet对象需要更多行时,应该从数据库中获取行数。

Statement.setFetchSize() 将此Statement对象生成的任何ResultSet对象可以包含的最大行数限制为给定数目。

参考:

$ MySQL时区

相关配置参数的组合情况:

useLegacyDatetimeCode=True(默认) useLegacyDatetimeCode=False
useTimezone=False(默认) 将年月日时分秒+"连接时区", 创建时间戳 将年月日时分秒+"配置时区"创建时间戳
useTimezone=True 先将年月日时分秒+"连接时区", 创建时间戳
再进行时区调整, 调整为"配置时区".
将年月日时分秒+"配置时区"创建时间戳

参考:

5.3 Configuration Properties for Connector/J (opens new window)

Chapter 16 Known Issues and Limitations (opens new window)

0078 Java与MySQL时间戳传递/存储/协调问题--userLegacyDatetimeCode--userTimezone--serverTimezone (opens new window)

$ 插入数据

$ Null处理

Statementstmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ...");
while (rs.next()) {
    int num = rs.getInt(1);
    if (rs.wasNull()) {
        // num is null
    } else {
        // num is not null
    }
}

$ 日期类型

JDBC 4.2 以下:

不带时间的DATE类型:

ps.setDate(2, java.sql.Date.valueOf("2013-09-04"));
//endDate是java.util.Date类的实例
ps.setDate(2, new java.sql.Date(endDate.getTime());
ps.setDate(2, new java.sql.Date(System.currentTimeMillis()));
// Since Java 8
ps.setDate(2, java.sql.Date.valueOf(java.time.LocalDate.now()));

带时间的TIMESTAMPDATETIME类型:

ps.setTimestamp(2, java.sql.Timestamp.valueOf("2013-09-04 13:30:00");
ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime()));
ps.setTimestamp(2, new java.sql.Timestamp(System.currentTimeMillis()));
// Since Java 8
ps.setTimestamp(2, java.sql.Timestamp.from(java.time.Instant.now()));
ps.setTimestamp(2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()));

JDBC 4.2 以上:

PreparedStatement.setObject(1 , localDate);
ResultSet.getObject(1 , LocalDate.class);

使用EPOCH_DATE替代日期0000-00-00

LocalDate EPOCH_DATE = LocalDate.ofEpochDay(0); // 1970-01-01 is day 0 in Epoch counting.

$ 参考

更新时间: 8/29/2020, 4:37:23 AM