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 语句中字段对应的索引,并不是数据表中字段对应的索引。后面的三组测试,同理~

总结:

① 对于 ' getXXX(int columnIndex) { } ' 重载形式,其中的 columnIndex 表示的是我们写的 sql 语句中字段的索引,而不是数据库表中字段的索引。

② 对于 ‘ getXXX(String columnLabel) { } ' 重载形式,直接传递列名即可。

你可能感兴趣的:(Java基础,sql,数据库,mysql)