拓展阅读

calcite简介和使用 quick-sql 查询

背景

有时候我们通过 jdbc 查询数据,希望拿到一些基本的信息。

mysql 数据

  [plaintext]
1
2
3
4
5
6
7
8
mysql> select * from user_info; +----+------+----------------------------+ | id | name | update_time | +----+------+----------------------------+ | 1 | u-1 | 2024-03-21 17:26:45.000000 | | 2 | u-2 | 2024-03-21 17:26:46.000000 | +----+------+----------------------------+ 2 rows in set (0.00 sec)

java 代码

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.github.houbb.calcite.learn.mysql; import com.alibaba.druid.pool.DruidDataSource; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; /** * druid 整合 mysql 使用 */ public class DruidMySQLExampleResult { public static void main(String[] args) { // 初始化 Druid 数据源 DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"); dataSource.setUsername("admin"); dataSource.setPassword("123456"); String sql = "select id userId, update_time userUpdateTime, name from user_info"; try (PreparedStatement preparedStatement = dataSource.getConnection().prepareStatement(sql)) { // 执行查询 ResultSet resultSet = preparedStatement.executeQuery(); // 共计返回列数 int count = resultSet.getMetaData().getColumnCount(); // 处理结果集 while (resultSet.next()) { for(int i = 1; i <= count; i++) { Object value = resultSet.getObject(i); String columnName = resultSet.getMetaData().getColumnName(i); String columnLabel = resultSet.getMetaData().getColumnName(i); System.out.println(columnName+","+columnLabel+","+value); } System.out.println("\r\n"); } } catch (SQLException e) { throw new RuntimeException(e); } } }

效果:

  [plaintext]
1
2
3
4
5
6
7
8
id,id,1 update_time,update_time,2024-03-21 17:26:45.0 name,name,u-1 id,id,2 update_time,update_time,2024-03-21 17:26:46.0 name,name,u-2

chat

Q: 这个名称是固定的,我希望知道有哪些别名。

要知道ResultSet中包含的列的别名,你可以使用ResultSetMetaData对象。

ResultSetMetaData对象提供了关于ResultSet中列的元数据信息,包括列的数量、名称、类型等。

下面是一个示例代码,演示如何使用ResultSetMetaData来获取列的别名:

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
try (Statement statement = connection.createStatement()) { ResultSet resultSet = statement.executeQuery("SELECT status AS logStatus, user_id AS userId FROM log"); // 获取ResultSet的元数据 ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); // 遍历元数据,获取列的别名 for (int i = 1; i <= columnCount; i++) { String columnName = metaData.getColumnLabel(i); // 获取列的别名 System.out.println("Column " + i + " Alias: " + columnName); } }

在这个示例中,我们使用getColumnLabel(int column)方法来获取列的别名。这样就能够遍历所有列,获取它们的别名,并打印出来。

Q: metaData.getColumnName(i) 获取的是什么?

metaData.getColumnName(i)方法用于获取ResultSetMetaData对象中第i列的列名。列名是指在SQL查询中指定的列的名称,而不是别名。

例如,如果你的SQL查询是这样的:SELECT status AS logStatus, user_id AS userId FROM log,那么statususer_id是列的名称,logStatususerId是别名。

所以,metaData.getColumnName(i)会返回列的名称,而metaData.getColumnLabel(i)会返回别名。

Q: 如果查询没指定 AS 别名,getColumnLabel(int column) 会返回什么?

如果查询中没有指定AS别名,那么getColumnLabel(int column)方法将会返回列的名称。

在SQL查询中,列名是指查询结果中的列的标识,如果没有为列指定别名,那么列名就是默认的标识。

例如,如果你的SQL查询是这样的:SELECT status, user_id FROM log,那么statususer_id就是列的名称,如果调用getColumnLabel(1),它将返回"status",调用getColumnLabel(2),它将返回"user_id"

当没有指定别名时,getColumnLabel(int column)会返回列的名称,而getColumnName(int column)也会返回相同的结果,因为在这种情况下,列的名称就是其标识。

参考资料