MySQL Connector/J 发行说明
当通过安装 query_attributes
组件在服务器上启用查询属性时,Connector/J 支持查询属性(有关详细信息,请参阅 使用查询属性的先决条件)。
通过使用 JdbcStatement
接口的 setAttribute()
方法为查询设置属性。以下是该方法的签名
JdbcStatement.setAttribute(String name, Object value)
以下是将查询属性与 JdbcStatement
一起使用的示例
示例 6.1 将查询属性与普通语句一起使用
conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "myuser", "password");
Statement stmt = conn.createStatement();
JdbcStatement jdbcStmt = (JdbcStatement) stmt;
jdbcStmt.executeUpdate("CREATE TABLE t11 (c1 CHAR(20), c2 CHAR(20))");
jdbcStmt.setAttribute("attr1", "cat");
jdbcStmt.setAttribute("attr2", "mat");
jdbcStmt.executeUpdate("INSERT INTO t11 (c1, c2) VALUES(\n" +
" mysql_query_attribute_string('attr1'),\n" +
" mysql_query_attribute_string('attr2')\n" +
" );");
ResultSet rs = stmt.executeQuery("SELECT * from t11");
while(rs.next()) {
String col1 = rs.getString(1);
String col2 = rs.getString(2);
System.out.println("The "+col1+" is on the "+col2);
}
虽然查询属性在每次查询后都会在服务器上清除,但它们会保留在 Connector/J 端,因此可以为下一次查询重新发送。要清除属性,请使用 JdbcStatement
接口的 clearAttributes()
方法
JdbcStatement.clearAttributes()
以下示例(示例 6.1,“将查询属性与普通语句一起使用” 中代码的延续)展示了如何为语句保留属性,直到将其清除
示例 6.2 查询属性的保留
/* Continuing from the code in the last example, where query attributes have
already been set and used */
rs = stmt.executeQuery("SELECT c2 FROM t11 where " +
"c1 = mysql_query_attribute_string('attr1')");
if (rs.next()) {
String col1 = rs.getString(1);
System.out.println("It is on the "+col1);
}
// Prints "It is on the mat"
jdbcStmt.clearAttributes();
rs = stmt.executeQuery("SELECT c2 FROM t11 where " +
"c1 = mysql_query_attribute_string('attr1')");
if (rs.next()) {
String col1 = rs.getString(1);
System.out.println("It is on the "+col1);
}
else {
System.out.println("No results!");
}
// Prints "No results!" as attribute string attr1 is empty
还可以使用 setAttribute()
方法为客户端和服务器端预处理语句设置属性
示例 6.3 将查询属性与预处理语句一起使用
conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "myuser", "password");
PreparedStatement ps = conn.prepareStatement(
"select ?, c2 from t11 where c1 = mysql_query_attribute_string('attr1')");
ps.setString(1, "It is on a ");
JdbcStatement jdbcPs = (JdbcStatement) ps;
jdbcPs.setAttribute("attr1", "cat");
rs = ps.executeQuery();
if (rs.next()) {
System.out.println(rs.getString(1)+" "+ rs.getString(2));
}
并非所有 MySQL 数据类型都受 setAttribute()
方法支持;仅支持以下 MySQL 数据类型,并且直接从特定 Java 对象或其子类映射
表 6.22 查询属性的数据类型映射
MySQL 数据类型 | Java 对象 |
---|---|
MYSQL_TYPE_STRING |
java.lang.String |
MYSQL_TYPE_TINY |
java.lang.Boolean , java.lang.Byte |
MYSQL_TYPE_SHORT |
java.lang.Short |
MYSQL_TYPE_LONG |
java.lang.Integer |
MYSQL_TYPE_LONGLONG |
java.lang.Long , java.math.BigInteger |
MYSQL_TYPE_FLOAT |
java.lang.Float |
MYSQL_TYPE_DOUBLE |
java.lang.Double , java.math.BigDecimal |
MYSQL_TYPE_DATE |
java.sql.Date , java.time.LocalDate |
MYSQL_TYPE_TIME |
java.sql.Time , java.time.LocalTime , java.time.OffsetTime , java.time.Duration |
MYSQL_TYPE_DATETIME |
java.time.LocalDateTime |
MYSQL_TYPE_TIMESTAMP |
java.sql.Timestamp , java.time.Instant , java.time.OffsetDateTime , java.time.ZonedDateTime , java.util.Date , java.util.Calendar |
当 Java 对象类型没有直接映射到任何 MySQL 数据类型时,将使用通过 .toString()
方法将提供的对象转换为 String
得到的字符串值设置该属性。