【问题标题】:Mapping ResultSet to Pojo Objects将 ResultSet 映射到 Pojo 对象
【发布时间】:2014-01-30 16:32:03
【问题描述】:

这真的很尴尬,我已经制作了一个标准的 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 类对此进行建模,就好像使用 String 来管理它一样,那么面向对象的概念就消失了,未来的复杂性也会增加。请指导!

更新说明

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

【问题讨论】:

  • JPA 进行对象/关系映射。也许尝试使用 JPA 的 eclipseLink 的 NetBeans IDE,并让类从 DB 生成(例如)。 netbeans.org 上有一些很好的 NetBeans 教程。
  • @JoopEggen 我已经更新了我的问题以获得更好的解释。
  • 除了目前的两个答案,为了连接表和进行计算,您可以创建一个带有虚拟字段的数据库 view。这个视图也可以有一个 POJO。问题在于这样的查询是否自然;越多,风景就越好。尤其是在过度规范化的数据库中,视图可能是有益的。
  • 另见此问题/答案,其中向您展示了如何使用 JPA 将自定义查询映射到非实体 POJO。 stackoverflow.com/questions/13012584/…

标签: java sql oop pojo


【解决方案1】:

为此,您可以使用JPA 的实现之一。但是如果你想手动做,我会给你一个小例子。

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;
    }

你不应该为那个查询做新的 POJO,你应该写正常的查询。请记住 - 您的对象模型是主要的,DB 中的表只是保存应用程序数据的一种方式。

【讨论】:

  • 非常感谢! @潜水员。这正是我一直在寻找的。我一定会检查其他人在Sha Allah中提到的概念,框架。
【解决方案2】:

我们知道我们可以将相同的表对象映射到相同的 pojo 类,但是当查询是定制的并且返回的数据没有映射到任何特定的类时,程序会是什么?即我们应该再开一个课吗?

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

这将执行一个 JPA 选择,该选择将返回一个列表。
如果您稍后需要更改查询并且列未更改,您的 POJO 仍然可以工作。
如果您更改了列,那么也要相应地更改 POJO。

注意:

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

Type User 必须是 JPA 映射或 JPA 注释的实体类。

entityManager 在 JPA EntityManagerFactory 中。

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);
}

当您想要选择指定的列时,动态实例化也很方便,但要避免使用那些具有大数据的列,例如 BLOB 类型。
例如,您可能想要一个代理 POJO 列表,它们代表完全填充的事物,但它们本身并未完全填充。
您提供代理列表,当用户选择一个时,您执行另一个查询以获取完全填充的对象。

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

【讨论】:

    【解决方案3】:

    有很多 ORM 框架可以做到这一点,包括 HibernatemyBatisJPAspring-JDBC

    spring-jdbc 和 myBatis 为您提供对 SQL 的精细控制,而使用 JPA 和 Hibernate,您通常从 SQL 中抽象出来。

    我建议您在推出自己的解决方案之前先阅读并弄清楚您喜欢哪一个。

    【讨论】:

    • 我没有使用任何框架,我想在 Eclipse 中进行。你能提供一些例子吗?提前致谢。
    • 所以,选择一个;)。在我看来,侵入性最小的框架是 spring-jdbc,它是RowMapper
    【解决方案4】:

    你的问题:

    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”。

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

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2012-08-06
      相关资源
      最近更新 更多