6.8 Использование атрибутов запроса
Connector/J поддерживает атрибуты запроса, если они включены на сервере путём установки компонента query_attributes (см. для получения подробностей).
Атрибуты запроса устанавливаются с помощью метода setAttribute() интерфейса JdbcStatement. Вот сигнатура метода:
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, поэтому могут быть повторно отправлены для следующего запроса. Для очистки атрибутов используйте метод clearAttributes() интерфейса JdbcStatement:
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, атрибут устанавливается со строковым значением, полученным из преобразования предоставленного объекта в String с помощью метода .toString().
© 2025 Oracle
Licensed under the GPLv2 License.