将 ResultSet 映射到 Pojo 对象

iCu*_*ous 5 java sql oop pojo

好吧,这真的很尴尬,我制作了一个标准的 pojo 类及其 dao 类用于数据检索目的。我很难理解如何处理 Pojo 类的自定义查询数据的基本过程。

假设我的用户类别是

public class User{

private int userId;
private String username;
private int addressId;

}

public class Address{
private int addressId;
private String zip;
}
public class UserDAO{

public void getUserDetails(){

String getSql = select u.userId, u.username, a.zipcode from user u, address a where u.addressId =     a.addressId;

 //no pojo class is now specific to the resultset returned. so we can't map result to pojo object
}

}
Run Code Online (Sandbox Code Playgroud)

现在我应该如何用我的 pojo 类对此进行建模,就好像使用 String 来管理它一样,那么面向对象的概念就会消失,并且将来的复杂性也会增加。请指导!

更新以获取进一步说明

我们知道我们可以将相同的表对象映射到相同的 pojo 类,但是当自定义查询并且返回的数据未映射到任何特定类时,那么过程是什么?即我们应该再上一堂课吗?或者我们应该将该数据放入字符串变量中?请也举一些例子。

Div*_*ers 4

为此,您可以使用JPA的实现之一。但当你想手动完成时,我会给你一个小例子。

更新:

public class User {
   private int userId;
   private String username;
   private Address address; // USE POJO not ID
}

public class Address{
   private int addressId;
   private String zip;
   List<User> users;
}
    public User getUserById(Connection con, long userId) {
        PreparedStatement stmt;
        String query = "select u.user_id, u.user_name, a.id, a.zip from user u, address a where a.address_id = u.id and u.id = ?";
        User user = new User();
        Address address = new Address;
        try {
            stmt = con.prepareStatement(query);
            stmt.setLong(1, userId);
            ResultSet rs = stmt.executeQuery();
            address.setId(rs.getInt("id"));
            address.setZip(rs.getString("zip");
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("user_name"));
            user.setAddressId(rs.getInt("address_id"));
            user.setAddress(address); // look here
        } catch (SQLException e) {
            if (con != null) {
                try {
                    System.err.print("Transaction is being rolled back");
                    con.rollback();
                } catch (SQLException excep) {
                }
            }
        } finally {
            if (stmt != null) {
                stmt.close();
            }
        }
        return user;
    }
Run Code Online (Sandbox Code Playgroud)

您不应该为该查询执行新的 POJO,您应该编写普通查询。请记住 - 您的对象模型是主要的,数据库中的表只是保存应用程序数据的一种方式。