http://blog.csdn.net/yerenyuan_pku/article/details/72909286
终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的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;
}
}
- 1
在上面的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层代码便写完了。