Java 将结果集映射到Pojo对象
这真的很尴尬,我制作了一个标准的pojo类和它的dao类,用于数据检索。我很难理解如何处理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
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,它是一个非常好的框架。非常感谢@潜水员。这正是我想要的。我一定会在未来的《沙阿拉》中检查其他人提到的概念、框架。