java - 搜索数据库后,打印结果的完整行

时间:2016-02-11 12:44:01

标签: java sql postgresql jdbc

我有一个代码,它正在搜索整个数据库。一切正常,唯一的问题是,我想用整数和字符等发布整个元组。

package src;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import java.util.regex.Pattern;

/*
PATTERN MATCHING
*/
public class BigSearch {

    public static void main(String[] args) {

            try {

                String keyword;
                String schema = "public";
                Boolean caseAware = true;

                System.out.println("Insert the term we shall look for in the database.");
                Scanner s = new Scanner(System.in);
                keyword = s.nextLine();

                System.out.println("Do you want the search to be case sensitve "
                        + "\n1 - case sensitive"
                        + "\n0 - case insensitive");

                int caseAwareInt = s.nextInt();

                while (caseAwareInt != 0 && caseAwareInt != 1) {
                    System.out.println("You need to enter 1 or 0. Enter again!");
                    caseAwareInt = s.nextInt();
                }


                if (caseAwareInt == 1) {
                    caseAware = true;
                } else if (caseAwareInt == 0) {
                    caseAware = false;
                }

                System.out.println("Your search is now case ");
                if (caseAware) {
                    System.out.println("sensitive!");
                }
                if (!caseAware) {
                    System.out.println("insensitive!");
                }

                String like = "";

                if (caseAware) {
                    like = "LIKE";
                } else {
                    like = "ILIKE";
                }
                Connectivity connectivity = new Connectivity();
                conn = connectivity.getConnection();
                Statement stmt = conn.createStatement();
                Statement stmt2 = conn.createStatement();
                Statement stmt3 = conn.createStatement();
                Statement stmt4 = conn.createStatement();
                Statement stmt5 = conn.createStatement();

                ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM pg_catalog.pg_tables WHERE schemaname = '" + schema + "';");
                ResultSet tablenames = stmt2.executeQuery("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '" + schema + "';");
                rs.next();
                int counttables = rs.getInt(1);
                System.out.println("Tabellen im Schema: " + counttables);

                int appearance = 0;
                int diftables = 0;

                for (int i = 0; i < counttables; i++) {
                    tablenames.next();
                    ResultSet columnnames = stmt3.executeQuery("SELECT * " +
                            "FROM information_schema.columns " +
                            "WHERE table_schema = '" + schema +
                            "'  AND table_name = '" + tablenames.getString(1) + 
                            "'  AND data_type = 'character varying'");

                    ResultSet rss = stmt4.executeQuery("SELECT COUNT(*) " +
                            "FROM information_schema.columns " +
                            "WHERE table_schema = '" + schema +
                            "'  AND table_name   = '" + tablenames.getString(1) +
                            "'  AND data_type = 'character varying'");

                    rss.next();
                    int countcolumns = rss.getInt (1);
                    System.out.println("Spalten in der Tabelle " + tablenames.getString(1) + ": " + countcolumns);

                    int count = 0;

                    for (int i2 = 0; i2 < countcolumns; i2++) {
                        columnnames.next();
                        columnnames.getString(1);

                        System.out.println("Spaltenname: " + columnnames.getString(1));
                        System.out.println("Tabelle: " + tablenames.getString(1));

                        ResultSet containsString;


                        containsString = stmt5.executeQuery("SELECT * "
                                + "FROM " + tablenames.getString(1)
                                + " WHERE " + columnnames.getString(1) + " " + like + " '%" + keyword + "%'");

                        while (containsString.next()) {
                            System.out.println(containsString.getString(1) + " -- contains your keyword");
                            appearance++;
                            count ++;
                        }
                    }
                    if (count > 0) {
                        diftables ++;
                    }
                }

                System.out.println("The keyword was found " + appearance + " times in " + diftables + " different tales.");

            } catch (SQLException e) {
                e.printStackTrace();
            } 

    }

}

我认为问题是以下代码:

while (containsString.next()) {
                            System.out.println(containsString.getString(1) + " -- contains your keyword");
                            appearance++;
                            count ++;
                        }

所以我说getString(1),但我想打印整行,因为所有表都有不同的变量类型和不同的数量,我不能说getString 1,2,3等等上。 .getRow doens not work很好。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

无法一次获取所有值。你需要自己逐列获取它们。您可以使用getObject并让该对象的默认toString()处理它。另一种选择是使用ResultSetMetaData来获得正确的处理类型,但这可能过于复杂,无法满足您的需求。

getRow不起作用,因为它&#34;检索当前行号。&#34;

对于大多数数据类型,某些JDBC驱动程序将支持getString并为您处理转换。