JDBC 中关于 ResultSet.getXXX( ) 方法的理解
最近在写orm框架,遇到了原生JDBC中的 getInt( )、getFloat( )、getDouble( )、getString( )、getObject( ) 等这类方法,发现与原先的理解有些偏差,特此记录一下这几个常用的方法参数在不同 sql 查询下的含义。
这几个方法都同时存在重载,重载的形式也如出一辙,如下:
getXXX(int columnIndex) { } getXXX(String columnLabel) { }
当然,当重载的形式是 getXXX(String columnLabel) { } 这种时,毫无疑问是传递数据库中某表的列名,直接获取列名对应的值即可,这种毫无疑问,没有什么分歧。
但是,当重载形式为 getXXX(int columnIndex) { } 这种时,就可能会产生一些疑惑?我们可能会理解为,这里面的 columnIndex ( 列索引 ) 指的是数据库某表中对应的列索引。
当然按照这种想法写出来的代码是没有什么问题的,毕竟源码的解释也是这样说的:
@param columnIndex the first column is 1, the second is 2, ...
下面,请看我的测试代码,你就会恍然大悟,原来不是这样的!
(1)我们在这里首先创建一个数据库和一个用于测试的表
create database testjdbc; use testjdbc; create table user( id bigint comment ID, name varchar(255) comment 姓名, sex varchar(255) comment 性别, age int comment 年龄 ); insert into user values (111111, "Tom", "男", 18);
(2)我们创建测试类,进行测试
public class JDBCTest { public static void main(String[] args) throws Exception { String sql1 = "select * from user"; testMethod(sql1, 1); testMethod(sql1, 2); System.out.println("<============>"); String sql2 = "select age from user"; testMethod(sql2, 1); System.out.println("<============>"); String sql3 = "select sex, age from user"; testMethod(sql3, 2); System.out.println("<============>"); String sql4 = "select age, sex from user"; testMethod(sql4, 2); } private static void testMethod(String sql, int columnIndex) throws Exception{ Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456"); PreparedStatement preparedStatement = connection.prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(); while(resultSet.next()) { System.out.println(resultSet.getObject(columnIndex)); } } }
(3)测试结果
111111 Tom <============> 18 <============> 18 <============> 男 Process finished with exit code 0
我们可以看到,其实当重载形式为 ‘ getXXX(int columnIndex) { } ’ 这种时,其中的索引,对应的并不是数据库表中的列索引,而是 sql 语句中的字段的索引。
select * from user <=> select id, name, sex, age from user 同样也是从我们写的 sql 语句中找到对应的索引来获取的数值,这个索引是 sql 语句中字段对应的索引,并不是数据表中字段对应的索引。后面的三组测试,同理~