最近在写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, ...
下面,请看我的测试代码,你就会恍然大悟,原来不是这样的!
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);
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));
}
}
}
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 语句中字段对应的索引,并不是数据表中字段对应的索引。后面的三组测试,同理~