如何检查Java JDBC代码是否使用了正确的列名?

如何检查Java JDBC代码是否使用了正确的列名?,java,postgresql,jdbc,Java,Postgresql,Jdbc,我有一套端到端测试。它们应该能够捕获SQL语句中的拼写错误、错误的表名或列名(DB模式和Java代码不一致的任何内容)或缺少DB权限。我不想依赖数据库中的数据(设置起来太复杂);这只是一个基本的测试 import java.sql.*; import org.junit.Test; public class TypoTest { private Connection getConnection() throws Exception { String connection

我有一套端到端测试。它们应该能够捕获SQL语句中的拼写错误、错误的表名或列名(DB模式和Java代码不一致的任何内容)或缺少DB权限。我不想依赖数据库中的数据(设置起来太复杂);这只是一个基本的测试

import java.sql.*;
import org.junit.Test;

public class TypoTest {
    private Connection getConnection() throws Exception {
        String connectionString = "jdbc:postgresql://127.0.0.1:5432/db";
        String driverClassName = "org.postgresql.ds.PGConnectionPoolDataSource";
        Class.forName(driverClassName).newInstance();
        return DriverManager.getConnection(connectionString, "robert", "");
    }

    @Test
    public void runQuery() throws Exception {
        try (Connection connection = getConnection();
             PreparedStatement ps = connection.prepareStatement("SELECT relname FROM pg_catalog.pg_class");
             ResultSet data = ps.executeQuery()) {
            while (data.next()) {
                data.getString("relname");
            }
        }
    }
}
当我运行上面的测试时,如果我在
SELECT
语句中有输入错误,它就会失败。(很好。)如果我在
data.getString(“此处输入错误”)
中的列名中有输入错误,那么如果查询的表没有数据,则不会捕获该错误,因为这样就不会进入循环。为了保持测试(设置)简单,我不想先将数据插入表中

我想我可以把列名变成常量,修改代码,解决这个问题

然而,我想知道是否有更简单的方法。。。我很懒,不想编辑所有的查询。有没有更好的方法对我的SQL进行单元测试

我正在使用Postgres 9.5和JDBC 4。

我猜您已经在使用了,但为了回答问题,您可以尝试使用
select*from table
,然后根据查询检查列名(我猜您必须解析查询字符串…)


我相信它也适用于空表,但请注意,我还没有测试空表场景。

从一些表中选择a、b、ca
的列,即使表中没有行,code>也将失败。对列名的检查发生在检索数据之前很久。你的测试中一定有不同的缺陷。请给我们看完整的测试代码谢谢你救了我的命。我应该更好地检查代码。您是对的,选择将失败。我在sqlselect和将列数据转换为Java对象的代码中都有列名。我只升级了SQL SELECT,但没有升级转换代码。这就是为什么没有数据它不会失败。同样,我的错误是没有双重检查SELECT。是的,这会起作用,但实际上为列设置常量可能更容易。是的。你可以考虑Enums。