2009-07-19 40 views
5

Tôi đã quá nhiều phương pháp mà nhiều lần làm điều gì đó nhưDọn dẹp thiết lập lặp đi lặp lại và dọn dẹp Java (JDBC) mã

Statement stmt = null; 
ResultSet rstmt = null; 
try { 
    stmt = conn.createStatement(); 
    rstmt = stmt.executeQuery(...); 
    while (rstmt.next()) { 
     //handle rows 
    } 


} catch (SQLException e) { 
    //handle errors 

} finally { 
    try {rstmt.close();} catch (SQLException ex) {} 
    try {stmt.close();} catch (SQLException ex) {} 
} 

này thiết lập/teardown/dọn dẹp các báo cáo và resultsets là repetive và giấu các mảnh thú vị của mã.

Có mẫu hoặc thành ngữ nào để xử lý việc này (không giới thiệu bất kỳ khung bên ngoài nào) không?

+1

Một trong những giá trị thực của việc trừu tượng hóa loại rác này là bạn sẽ chắc chắn rằng câu lệnh đóng của bạn không NPE (hy vọng sử dụng 'get; try {use;} cuối cùng {release;}' thành ngữ –

+0

Nhân bản: http://stackoverflow.com/questions/1072925/remove-boilerplate-from-db-code/1072949#1072949 –

Trả lời

4

bạn có thể tạo phương thức nhận truy vấn SQL và đối tượng để xử lý ResultSet. ví dụ:

private void executeSql(String sql, ResultSetHandler handler) { 
    Statement stmt = null; 
    ResultSet rstmt = null; 
    try { 
    stmt = conn.createStatement(); 
    rstmt = stmt.executeQuery(sql); 
    while (rstmt.next()) { 
     handler.handle(rstmt); 
    } 
    } 
    catch (SQLException e) { 
    //handle errors 
    } 
    finally { 
    try {rstmt.close();} catch (SQLException ex) {} 
    try {stmt.close();} catch (SQLException ex) {} 
    } 
} 

với ResultSetHandler là một giao diện:

public interface ResultSetHandler { 
    void handle(ResultSet rs) throws SQLException; 
} 

và bạn có thể tạo một đối tượng của một lớp vô danh thực hiện giao diện đó, vì vậy nó sẽ không lộn xộn quá nhiều.

+1

Có lẽ muốn làm cho phương thức giao diện đó ném ít nhất SQLException. –

+0

ý tưởng hay, Tom. – cd1

10

Có một cái nhìn tại SimpleJDBCTemplate trong Spring Framework. Điều này thực hiện chính xác những gì bạn muốn.

Nếu bạn không muốn giới thiệu một khung bên ngoài thì chỉ cần sử dụng nó cho một số cảm hứng để thực hiện của riêng bạn.

+0

+1 từ tôi Đây chính xác là điều đúng đắn cần làm Hoặc sử dụng Spring làm nguồn cảm hứng hoặc kết hợp nó vào dự án của bạn sẽ có lợi. – duffymo

+0

Ngoài việc ẩn mã \ teardown setup, Spring sẽ cải thiện xử lý ngoại lệ theo 2 cách: 1) nó sẽ xử lý SQLException và 'regurgitate' nó như một cái gì đó có ý nghĩa hơn 2) ngoại lệ là 'regurgitated' sẽ được bỏ chọn, vì vậy bạn không phải bắt hoặc ném bất cứ thứ gì. – javamonkey79

+0

+1. TÌNH YÊU cách jdbc được xử lý với mùa xuân. –

1

Bạn nên xem xét lại bằng cách sử dụng các trình quản lý tồn tại Java như iBatis và Hibernate. Những tự động hóa rất nhiều boilerplate đi. Tôi đã sử dụng iBatis, trong đó các câu lệnh SQL được đóng gói gọn gàng và được đặt tên trong các tệp XML, và khối lượng mã phải bằng khoảng 25% của một phương pháp JDBC thô. Bạn có thể dần dần refactor hệ thống của bạn để sử dụng iBatis.

0

Mặc dù nó không loại trừ việc thiết lập và logic giọt nước mắt xuống, tôi thường thích phong cách này để làm tương tác JDBC dễ chịu hơn:

Statement statement = connection.createStatement(); 
try { 
    ResultSet results = statement.executeQuery(...); 
    try { 
     while (results.next()) { 
      //handle rows 
     } 
    } finally { 
     results.close(); 
    } 
} finally { 
    statement.close(); 
} 

Bằng cách lồng các try khối, bạn sẽ tự động đảm bảo rằng cả hai resultsstatement sẽ có các phương thức close() được gọi là không cần sử dụng câu hỏi try/catch trong khối finally của bạn. Đồng thời, bằng cách bắt đầu các khối try ngay sau khi có được đồ vật, bạn không cần phải lo lắng về việc kiểm tra các giá trị null (trừ khi, tất nhiên, connection.createStatement() hoặc statement.executeQuery(...) trả lại null - Trong trường hợp đó, bạn có vấn đề lớn hơn).

+1

Mã này không tấn công bạn, tốt ..., xấu xí? –

+0

Tôi cho rằng cái đẹp là trong con mắt của kẻ thù. Cá nhân tôi thấy biểu mẫu này "hấp dẫn" hơn biểu mẫu được trình bày trong câu hỏi. –

Các vấn đề liên quan