淘淘商城——商品搜索功能Dao实现

终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的Dao层代码。
我们现在是在开发商品搜索功能,访问索引库也就是数据访问,那么Dao层应该使用什么来访问呢?使用SolrServer对象就可以了,甚至Dao层我们也可以再封装一下,封装一个通用的数据访问方法,用户给我们一个SolrQuery对象,这个对象怎么来的我们不管,只要用户给我们把这个对象拼装好就行,拼装好了之后,我们就根据SolrQuery对象进行查询,把用户想要的结果返回,返回一个SearchResult对象就行了。
在实际开发中编写Dao层一般都是要有接口和实现类的,但这儿没必要建接口了,因为不存在不同的实现类,所以我们在taotao-search-service工程中新建一个com.taotao.search.dao包,并在该包下新建一个ItemSearchDao类,如下图所示。
这里写图片描述
为了大家方便复制,现将ItemSearchDao类的代码贴出。

/**
 * 商品搜索dao
 * <p>Title: ItemSearchDao</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
@Repository
public class ItemSearchDao {

    @Autowired
    private SolrServer solrServer;

    public SearchResult search(SolrQuery query) throws Exception {
        // 根据SolrQuery对象查询索引库
        QueryResponse response = solrServer.query(query);
        // 取查询结果
        SolrDocumentList solrDocumentList = response.getResults();
        SearchResult result = new SearchResult();
        // 取查询结果总记录数
        result.setTotalNumber(solrDocumentList.getNumFound());
        // 取结果集
        List<SearchItem> itemList = new ArrayList<SearchItem>();
        for (SolrDocument solrDocument : solrDocumentList) {
            SearchItem searchItem = new SearchItem();
            searchItem.setCategory_name((String) solrDocument.get("item_category_name"));
            searchItem.setId(Long.parseLong(solrDocument.get("id").toString()));
            searchItem.setImage((String) solrDocument.get("item_image"));
            // 标题取高亮显示
            String itemTitle = null;
            Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
            if (list != null && list.size() > 0) {
                itemTitle = list.get(0);
            } else {
                itemTitle = (String) solrDocument.get("item_title");
            }
            searchItem.setPrice((Long) solrDocument.get("item_price"));
            searchItem.setTitle(itemTitle);
            // 添加到商品列表
            itemList.add(searchItem);
        }
        result.setItemList(itemList);
        // 返回结果
        return result;
    }
}

在上面的ItemSearchDao类中使用注解的方式注入SolrServer,能不能注入成功呢?答案是不行的,因为我们在taotao-search-service的applicationContext-service.xml配置文件中配置的扫描包的范围是com.taotao.search.service,而com.taotao.search.dao不在这个范围内,从而无法将com.taotao.search.dao这个包下的类扫描到spring容器当中,当然我们就无法注入成功了。解决方法有两种,第一种是把扫描包的范围扩大,由原来的com.taotao.search.service改为com.taotao.search,这样com.taotao.search.dao和com.taotao.search.service两个包就都可以被扫描进spring容器当中了。第二种方法是在已有的扫描包后面再加一个扫描范围com.taotao.search.dao,中间以”,”分隔,就像base-package="com.taotao.search.service,com.taotao.search.dao"这样。
这里写图片描述
这样,实现商品搜索功能的Dao层代码便写完了。

猜你喜欢

转载自blog.csdn.net/a_blackmoon/article/details/80480170
今日推荐