将ResultSet映射到Pojo对象

时间:2014-01-30 16:32:03

标签: 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
}

}

现在我应该如何使用我的pojo类对其进行建模,就好像使用String来管理这个面向对象的概念消失一样,未来复杂性也会增加。亲切的指导!

进一步说明更新

我们知道我们可以使用相同的pojo类映射相同的表对象,但是当自定义查询并且返回的数据没有映射到任何特定的类时,那么程序是什么?即我们应该再上一堂课?或者我们应该将这些数据放在String变量中?请给出一些例子。

4 个答案:

答案 0 :(得分:3)

为此,您可以使用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,您应该编写普通查询。请记住 - 您的对象模型是主要的,数据库中的表只是保存应用程序数据的一种方式。

答案 1 :(得分:1)

  

我们知道我们可以使用相同的pojo类映射相同的表对象,但是当自定义查询并且返回的数据没有映射到任何特定的类时,那么程序是什么?即我们应该再做一个班级吗?

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

这将执行一个JPA选择,它将返回一个List 如果您需要稍后更改查询并且列未更改,则您的POJO仍然有效 如果更改列,则还要相应地更改POJO。

注:

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

类型用户必须是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的列表,但它们本身并未完全填充。
您将显示代理列表,当用户选择一个代理列表时,您将执行另一个查询以获取完全填充的对象。

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

答案 2 :(得分:0)

有许多ORM框架可以执行此操作,包括HibernatemyBatisJPAspring-JDBC

spring-jdbc和myBatis让您对SQL进行精细控制,而使用JPA和Hibernate,您通常会从SQL中抽象出来。

我建议你在阅读之前先做一些阅读并弄清楚你喜欢哪一个。

答案 3 :(得分:-2)

你的问题:

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吗?答案是&#34;不,停止使用POJO&#34;。

此库qood旨在解决此问题,您可以尝试一下。