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

来源:互联网 发布:linux 批量删除文件名 编辑:程序博客网 时间:2024/05/16 14:49

终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的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 */@Repositorypublic 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层代码便写完了。

原创粉丝点击