Java 将结果集映射到Pojo对象

Java 将结果集映射到Pojo对象,java,sql,oop,pojo,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 UserDA

这真的很尴尬,我制作了一个标准的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
}

}
现在,我应该如何用我的pojo类对此进行建模,就像使用字符串来管理这样,那么面向对象的概念就消失了,未来的复杂性也会增加。好心的导游

更新以获取进一步解释

我们知道我们可以用相同的pojo类映射相同的表对象,但是当查询被定制时,返回的数据没有映射到任何特定的类,那么过程会是什么呢?i、 我们应该再上一节课吗?或者我们应该将该数据放入字符串变量中?请给出一些例子。

有很多框架可以做到这一点,包括,和

SpringJDBC和myBatis为您提供了对SQL的细粒度控制,而使用JPA和Hibernate,您通常从SQL中抽象出来


在推出自己的解决方案之前,我建议您先阅读并找出您喜欢的解决方案。

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

UPD:

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;
    }
公共类用户{
私有int用户id;
私有字符串用户名;
专用地址;//使用POJO not ID
}
公共课堂演讲{
私有int地址id;
私人字符串拉链;
列出用户名单;
}
公共用户getUserById(连接con,长用户ID){
编制报表;
String query=“从用户u、地址a中选择u.user\u id、u.user\u name、a.id、a.zip,其中a.address\u id=u.id和u.id=?”;
用户=新用户();
地址=新地址;
试一试{
stmt=con.preparest陈述(查询);
stmt.setLong(1,userId);
ResultSet rs=stmt.executeQuery();
地址:setId(rs.getInt(“id”);
address.setZip(rs.getString(“zip”);
user.setId(rs.getInt(“id”);
user.setUsername(rs.getString(“用户名”);
user.setAddressId(rs.getInt(“地址id”);
user.setAddress(address);//看这里
}捕获(SQLE异常){
如果(con!=null){
试一试{
系统错误打印(“事务正在回滚”);
con.rollback();
}捕获(SQLException例外){
}
}
}最后{
如果(stmt!=null){
stmt.close();
}
}
返回用户;
}
您不应该为该查询执行新的POJO,您应该编写普通查询。请记住-您的对象模型是main,数据库中的表只是保存应用程序数据的一种方式。您的问题:

We know that we can map same table objects with same pojo class,
but when the query is customized and there is a data returned 
which doesn't map to any specific class then what would be the procedure? 
如果您有100种返回不同列组合的SQL,是否可以创建100种不同的POJO?答案是“不,停止使用POJO”

这个库就是为了解决这个问题而设计的,你可以试试

我们知道我们可以用相同的pojo类映射相同的表对象,但是当查询被定制并且返回的数据没有映射到任何特定的类时,那么该过程是什么呢?即,我们应该创建另一个类吗

JPA动态实例化允许您使用POJO定义查询,POJO的构造函数仅指定您希望从数据库中获取的字段和类型

这将执行JPA选择,该选择将返回一个列表。
如果以后需要更改查询且列保持不变,则POJO仍将工作。
如果您更改了列,那么也会相应地更改POJO

注:

必须指定完全限定的包和构造函数参数

用户类型必须是JPA映射或JPA注释的实体类

entityManager位于JPA entityManager工厂中

TypedQuery<User> q; 
String sql = "select new com.stuff.User(
int u.userId, String u.username, String a.zipcode) 
from User u, Address a where u.addressId = a.addressId";
List<User> list = entityManager.createQuery(sql).getResultList();

for(User u : list) {
  doStuff(u);
}
typedqueryq;
String sql=“选择new com.stuff.User(
int u.userId,String u.username,String a.zipcode)
从用户u,地址a,其中u.addressId=a.addressId”;
List List=entityManager.createQuery(sql).getResultList();
用于(用户u:列表){
多斯塔夫(u);
}
当您想要选择指定的列时,动态实例化也很方便,但要避免使用大数据的列,例如BLOB类型。
例如,您可能需要一个代理POJO列表,这些代理POJO表示完全填充的内容,但它们本身并没有完全填充。
显示代理列表,当用户选择一个时,再执行另一个查询以获得完全填充的对象


您的里程可能会有所不同。

JPA进行对象/关系映射。可以尝试使用NetBeans IDE,使用eclipseLink for JPA,并让类从DB生成(例如)。在NetBeans.org上有一些很好的NetBeans教程。@JoopEggen为了更好的解释,我更新了我的问题。除了当前的两个答案,对于连接表和进行计算,你可以创建一个带有虚拟字段的数据库视图。该视图也可以有一个POJO。这是一个查询有多自然的问题;越是这样,查询就越容易视图更好。尤其是在过度规范化的数据库中,视图可以发挥更大的作用。另请参阅此问题/答案,其中他们向您展示了如何使用JPA将自定义查询映射到非实体POJO。我没有使用任何框架,我希望在eclipse中实现。您能提供一些示例吗?提前感谢。因此,请选择一个;)。在我看来,侵入性最小的框架是SpringJDBC,它是一个非常好的框架。非常感谢@潜水员。这正是我想要的。我一定会在未来的《沙阿拉》中检查其他人提到的概念、框架。