gpt4 book ai didi

java - 从数据库中获取对象列表

转载 作者:行者123 更新时间:2023-11-29 22:30:50 24 4
gpt4 key购买 nike

我的应用程序中有一个目标产品。该对象内部有一个项目列表 (ArrayList)。在数据库中,我有 2 个表:产品和项目。项目具有通过外键连接到产品 ID 的产品 ID。

从数据库获取产品,然后获取它的项目列表非常简单。

如何从数据库中获取产品列表,其中包含所有相关项目?

据我所知,为列表中的每个产品调用 dao 效率不高。如何管理查询或对象创建以提高效率?

我正在使用 Spring JdbcTemplate 从数据库获取数据。目前,我正在获取 DAO 类中的产品列表,并直接从那里为每个项目调用 ItemDAO。数据库是MySQL。

更新好吧,可能我的第一种方法不清楚。目标是从数据库获取嵌套列表以及如何提高性能。

public class Product {
private Integer id;
private String name;
private String description;
private ArrayList<Item> items;
private Timestamp timeAdded;
}

public class Item {
private String name;
private Float price;
private String type;
private Integer productId;
}

public ArrayList getProducts(String searchName) throws SQLException {
ArrayList<Product> products = new ArrayList<Product>();
String sql = "SELECT * FROM product WHERE name LIKE '%" + searchName + "%'";
List<Map> rows = getJdbcTemplate().queryForList(sql);
for (Map row : rows) {
Product product = setNewProduct(row);
products.add(product);
}
return products;
}

private Product setNewProduct(Map row) {
Product product = new Product();
product.setId((Integer) row.get("id"));
product.setName((String) row.get("name"));
product.setDescription((String) row.get("description"));
ItemsDao itemsDao = (ItemsDao) appContext.getBean("itemsDao");
ArrayList<Item> items = itemsDao.getItems(product.getId());
if (items.size() > 0) {
product.setItems(items);
}
product.setTimeAdded(new java.util.Date(((Timestamp) row.get("time_added")).getTime()));
}

在 ItemsDao 类中,我只是根据发送的 ID 获取产品的项目列表。

所以问题是如何调用产品列表并获取每个产品内的项目列表? (也许在一个复杂的 SQL 语句中?)。现在性能很糟糕,因为当有 30 个产品,每个产品有 10 个项目时,要获取整个产品列表,就必须多次调用数据库。

最佳答案

答案是,当你使用 ORM 时,你不能这样做,当你有任何数量的数据时,它们都表现得很糟糕。如果您延迟加载相关集合并且仅使用一些集合,那么没问题,但如果您需要显示子对象中的字段,那么您可以获得 100,000 多个页面加载查询。相信我,我只是使用 Doctrine 优化运行 200,000 个查询的页面。

您要做的就是对结果进行分页,或者编写一个连接数据的自定义查询,然后使用循环控件处理结果:例如

$sql = "SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.fk_id";
// run query and get resdults
$cur_prod = '';
While( // fetch a row ){
if($row['prod'] != $cur_prod){
$cur_prod = $row['prod'];
// start the new record in your layout
}
echo $row['t1.f1'];
echo // blah blah blah the related data
}

我在这里想说的是,您必须跟踪父产品并在其更改时管理输出。

关于java - 从数据库中获取对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com