2017-09-14 6 views
3

私は2つのクラスを持っています。 1つはdb接続用で、もう1つはクエリ用です。私は、DBConnectionクラスに拡張することによって、DBSelectQueryクラスでクエリを選択できるようにします。私はそれをどうやって正しく行うことができますか?私は成功の良好な程度で使用しているDBSelectQueryクラスで選択できるようにするにはどうすればよいですか?

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); 
    } 

} 

}

答えて

1

一つの方法は、特定のクエリを実行するための任意の数の方法を公開静的utilのクラスを作成することです。あなたの場合、1つのクエリだけを実行する必要があると仮定しますが、この答えを任意の数に簡単に拡張できます。

以下のアプローチの一般的な戦略では、アプリケーションで実行する必要があると思われるクエリごとに独自のメソッドが用意されています。これは単純な例では論理的ではないようですが、定位置パラメーターの使用を開始するときは、使用する前に固定構造を知る必要があります。

必要に応じて繰り返し呼び出される接続を取得する方法があります。各照会メソッドは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."); 
    } 
} 
+0

こんにちは、私はそれを2クラスにしたいとCarminaCastañetoありません@他のテーブル –

+0

に選択するための選択クエリを再利用可能にしたい、私は全くお勧めしません。多分、1000行以上のコードを期待しない限り、JDBCサービスを扱うために単一のクラスを使用してください。クエリは「再利用可能」とは見なされません。それぞれのクエリを別々に扱います。 –

+0

public static List getAll(Connection con)throws SQLExceptionこのメソッドをどのように呼び出すのですか? –

0

は、の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; 
} 
関連する問題