【问题标题】:Getting a list of objects from database从数据库中获取对象列表
【发布时间】:2015-04-22 19:54:18
【问题描述】:

我的应用程序中有一个对象产品。这个对象里面有一个项目列表(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 个项目时,要获取整个产品列表,它必须调用数据库这么多次。

【问题讨论】:

    标签: java mysql database object jdbctemplate


    【解决方案1】:

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

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

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

    我在这里得到的是,您必须跟踪父产品并在输出发生变化时对其进行管理。

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2018-10-03
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多