2014-04-14 16 views
8

Vì vậy, khi chúng tôi sử dụng JDBI để truy vấn từ cơ sở dữ liệu, nó sẽ đưa nó vào loại Map<String, Object>.JDBI, truy xuất dữ liệu với truy vấn sql vào đối tượng tùy chỉnh (hàm tạo) thay vì Bản đồ

Tôi muốn đặt nó làm đối tượng tùy chỉnh (hàm dựng) thay vì Map<String, Object>.

DBI dbi = establishConnection(url, userName, passWord); 
Handle handle = dbi.open(); 
List<Map<String, Object>> rs = handle.select("select * from sometable"); 

Thay vào đó tôi muốn sử dụng:

List<customizedObject> rs = handle.select("select * from sometable"); 

đâu customizedObject lớp là một đối tượng có chứa tất cả các thuộc tính cột với nó.

Có cách nào để thực hiện việc này không? Tôi tìm thấy một số tài liệu tương đối, nhưng tôi không thể thực sự hiểu được việc thực hiện.

http://jdbi.org/sql_object_api_queries/

+0

Để hiển thị mã đúng hoặc quấn snippits ngắn với backticks (bên trái của 1 chìa khóa của bạn) 'như this' hoặc bắt đầu dòng với 4 (hoặc nhiều hơn) không gian. – indivisible

+0

Tôi không quen thuộc với JDBI, nhưng các tài liệu đề cập đến việc tạo một lớp dựa trên giao diện [ResultSetMapper] (http://jdbi.org/apidocs/org/skife/jdbi/v2/tweak/ResultSetMapper.html) và chuyển nó bằng lệnh 'handle.create (" select * from sometable "). map (MyMapper)'. – Powerlord

+0

Có nói rằng, tôi ngạc nhiên khi bạn không sử dụng một cái gì đó giống như triển khai [JPA] (http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html) chẳng hạn như [Hibernate ORM] (http://hibernate.org/orm/) nếu bạn muốn đối phó với các đối tượng. – Powerlord

Trả lời

11

cũng Xin vui lòng xem các trang trước trong tài liệu cho thấy làm thế nào để liên kết Handle hoặc DBI của bạn với người vẽ bản đồ.

Về bản chất, bạn cần người lập bản đồ chuyển đổi ResultSet thành đối tượng mong muốn và giao diện để tham chiếu đến người lập bản đồ.

Giả sử một ví dụ tối thiểu. Trước tiên, người lập bản đồ cần được cung cấp:

public class CustomizedObjectMapper implements ResultSetMapper<customizedObject> { 

    @Override 
    public customizedObject map(int index, ResultSet r, StatementContext ctx) 
      throws SQLException { 
     return new customizedObject(r.getString("uuid"), r.getString("other_column")); 
    } 

} 

Sau đó, chúng tôi cần một giao diện để xác định truy vấn nào cung cấp dữ liệu được chuyển đến lớp người lập bản đồ. Một kết quả hàng dẫn đến một lời khẩn cầu CustomizedObjectMapper.map(...):

@RegisterMapper(CustomizeObjectMapper.class) 
public interface CustomizeObjectQuery { 

    @SqlQuery("Select uuid, other_column from schema.relation") 
    List<customizedObject> get(); 
} 

Cuối cùng, các đối tượng có thể được lấy ra: List<customizedObject> test = dbi.open(CustomizeObjectQuery.class).get().

bạn cũng có thể đặt các thành phần với nhau trên cơ sở cá nhân như vậy và bỏ qua giao diện: dbi.open().createQuery("Select uuid, other_colum from schema.relation").map(new EventMapper()).list()

+0

Cảm ơn, nó hoạt động. Tôi chỉ thấy rằng tôi đang sử dụng phiên bản JDBI 2.9.4 trong khi v2.53 thực sự là phiên bản mới nhất. Tôi không biết điều gì xảy ra với danh sách phiên bản. Dù sao, cảm ơn bạn đã giúp đỡ của bạn. – ringord

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