【问题标题】:How can I do this properly to be able to select in DBSelectQuery class?如何正确执行此操作才能在 DBSelectQuery 类中进行选择?
【发布时间】:2018-02-22 23:40:03
【问题描述】:

我有 2 个不同的课程。一种用于数据库连接,一种用于查询。我希望能够通过将 DBSelectQuery 类扩展到 DBConnection 类来选择查询。我怎样才能正确地做到这一点?

public class DBSelectQuery extends DBConnection {
public static void main(String[] args) {
    selectCourier();
}
public static String selectCourier() {
    queryStmt += "SELECT * FROM courier";
    System.out.println(queryStmt);
    return queryStmt;
   }
}

public class DBConnection {
public static Connection con;
public static String queryStmt;
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_activity", "root", "root");
        System.out.println("Database Connected");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(queryStmt);
        while (rs.next())
            System.out.println(rs.getInt(1) + "  " + rs.getString(2));
        con.close();
    }

    catch (Exception e) {
        System.out.println(e);
    }

}

}

【问题讨论】:

    标签: java mysql database select extends


    【解决方案1】:

    我成功使用的一种方法是创建一个静态 util 类,它公开了用于执行特定查询的任意数量的方法。对于您的情况,我们假设您只需要执行一个查询,但您可以轻松地将此答案扩展到任意数量的查询。

    以下方法的一般策略是,您认为应用程序需要执行的每个查询都有自己的方法。对于您的简单示例,这可能看起来不合逻辑,但是当您开始使用位置参数时,您需要先了解查询的固定结构,然后再使用它。

    有一种获取连接的方法,可以根据需要重复调​​用。每个查询方法都返回一个List<Object[]>,其中每一行都由一个对象数组表示。

    public class DBUtil {
        private static final String GET_ALL_QUERY = "SELECT * FROM courier";
    
        public static Connection getConnection() {
            Connection con = null;
            try {
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_activity",
                                                  "root", "root");
            }
            catch (Exception e) {
                // something went wrong
            }
        }
    
        public static List<Object[]> getAll(Connection con) throws SQLException {
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(GET_ALL_QUERY);
            List<Object[]> list = new ArrayList<>();
    
            while (rs.next()) {
                Object[] row = new Object[2];
                row[0] = (Object)rs.getInt(1);
                row[1] = (Object)rs.getString(2);
                list.add(row);
            }
    
            return list;
        }
    }
    

    以下是您可以如何使用上述 util 类:

    public static void main(String[] args) {
        Connection con = DBUtil.getConnection();
    
        try {
            List<Object[]> resultSet = DBUtil.getAll(con);
    
            for (Object[] row : resultSet) {
                int val1 = (Integer)row[0];
                String val2 = (String)row[1];
    
                System.out.println("Found a row: (" + val1 + ", " + val2 + ")");
            }
        }
        catch (Exception e) {
            System.out.println("Something went wrong during the query.");
        }
    }
    

    【讨论】:

    • 嗨,我想将其设为 2 个类,并希望使选择查询可重复用于在其他表上进行选择
    • @CarminaCastañeto 不,我根本不建议这样做。只需使用一个类来处理您的 JDBC 服务内容,除非您期望可能超过 1000 行代码。并且查询应该被视为“可重复使用的”。以不同的方式对待每个查询。
    • public static List getAll(Connection con) throws SQLException 我如何调用这个方法?
    【解决方案2】:

    在 DBConnection 类中创建一个返回 Connection 对象的单独方法:

    public static Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_activity", "root", "root");
            System.out.println("Database Connected");            
            con.close();
        }
    
        catch (Exception e) {
            System.out.println(e);
        }
    
        return con;
    
    }
    

    现在您可以在项目中任何类的任何位置调用此方法。

    public static String selectCourier() {
        Connection con = DBConnection.getConnection();
        Statement stmt = con.createStatement();
        queryStmt += "SELECT * FROM courier";
        System.out.println(queryStmt);
        ResultSet rs = stmt.executeQuery(queryStmt);
        while (rs.next())
            System.out.println(rs.getInt(1) + "  " + rs.getString(2));
    
        return queryStmt;   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2011-07-21
      相关资源
      最近更新 更多