2016-07-11 4 views
0

Я хочу разделить код подключения к базе данных и свой код набора результатов. Единственный способ, которым я могу это сделать, не идеален, потому что он будет создавать 2 пула соединений. Фрагмент кода:Отдельный код подключения JDBC и код ResultSet

public void connectivity() throws SQLException{ 

    try{ 
    Class.forName(driver); 
    Connection c = DriverManager.getConnection(url, user, pass); 
    Statement st = c.createStatement(); 
    } 
    catch(ClassNotFoundException e){ 
    e.printStackTrace(); 
    } 
    finally{ 
     try{ 
     c.close(); 

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

    } 
} 

public Statement getStatement() throws SQLException{ 
     Class.forName(driver); 
     Connection c = DriverManager.getConnection(url, user, pass); 
     Statement st = c.createStatement(); 

     return st; 

} 

А потом в другом классе у меня есть:

Connectivity connect = new Connectivity(); 
Statement st = connect.getStatement(); 
ResultSet r = st.executeQuery(sql); 

Я делаю это, потому что я нужен доступ к Statement для того, чтобы сделать работу ResultSet. Как я могу абстрагироваться от кода подключения и кода набора результатов, чтобы иметь их в двух разных модулях без создания двух пулов соединений?

Заранее спасибо.

+0

Почему? Вы должны искать * объединить их. Приобретайте соединение, инструкцию и набор результатов в трех последовательных, вложенных, try-with-resources-операторах. NB Строка 'Class.forName()' не нужна с 2007 года. – EJP

+0

У меня есть довольно много наборов результатов для приобретения, и я намерен что-то сделать с каждым из этих наборов результатов. Вместо этого я хочу поместить свой код набора результатов в класс DAO. –

ответ

0

Если вы хотите выделить код, вы можете просто подключить переменную-член и просто создать одно соединение, а затем либо создать инструкции, либо сделать другой метод, который будет иметь подготовленный оператор (другой элемент данных) и затем просто верните результирующий набор. Вероятно, существует множество способов сделать это. Вот пример, чтобы вы на своем пути:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class Connectivity { 
    Connection connection; 
    String url, user, pass, driver; 

    public Connectivity(String url, String user, String pass, String driver) { 
     super(); 
     this.url = url; 
     this.user = user; 
     this.pass = pass; 
     this.driver = driver; 
     try{ 
      Class.forName(driver); 
      connection = DriverManager.getConnection(url, user, pass); 

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

    public Statement getStatement() throws SQLException{ 
      return connection.createStatement(); 

    } 

    public void close() throws SQLException{ 
     connection.close(); 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); 
     connection.close(); 
    } 
} 

Кстати там может быть более эффективными способами пытаются делать то, что вы хотите сделать. Вы должны послушать EJP и посмотреть на Data Access Object Pattern.

+0

Это то, что я искал. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^