壹立方商城----将商品数据导入到索引库中

1.功能分析

在schema.xml中定义以下业务域(已经定义好):

  1. 商品Id
  2. 商品标题
  3. 商品卖点
  4. 商品价格
  5. 商品图片
  6. 分类名称
  7. 商品描述

需要从tb_item(主表), tb_item_cat(商品分类表), tb_item_desc(商品描述表)表中查询status=1的数据(商品状态,1-正常,2-下架,3-删除)。

SELECT
	a.id,
	a.title,
	a.sell_point,
	a.price,
	a.image,
	b. NAME category_name,
	c.item_desc
FROM
	tb_item a,
	tb_item_cat b,
	tb_item_desc c
WHERE
	a.cid = b.id
AND a.id = c.item_id
AND a.`status` = 1;

在e3-manager-web后台系统中 做一个导入索引库的功能界面

比如:管理员点击 “一键导入商品数据到索引库”,后端从数据库中读取商品数据,导入solr索引库。

壹立方商城----将商品数据导入到索引库中_第1张图片

导入之后,solr索引库中存在商品数据

壹立方商城----将商品数据导入到索引库中_第2张图片

业务逻辑:

1.点击按钮,表现层调用服务层的工程的导入索引库的方法

2.服务层实现 调用mapper接口的方法查询所有的商品的数据

3.将数据一条条添加到solrinputdocument文档中

4.将文档添加到索引库中

5.提交,并返回导入成功即可

2.dao层

2.1创建pojo

我们查看从tb_item(主表), tb_item_cat(商品分类表), tb_item_desc(商品描述表)表中查询status=1的数据。

壹立方商城----将商品数据导入到索引库中_第3张图片

针对来自三张表的数据,我们需要使用一个pojo来接收这些数据,而且这个pojo还会作为查询结果的载体,因此服务层和表现层都会用到这个pojo,我们最好把它放到e3-common工程的pojo目录下。我们新建SearchItem类(记得要实现序列化,因为要进行网络传输)

e3-common工程下的cn.e3mall.common.pojo目录下

 SearchItem.java

package cn.e3mall.common.pojo;

import java.io.Serializable;

/**
 * 搜索商品数据的pojo
 * @author su
 *
 */
public class SearchItem implements Serializable{
	private String id;//商品id
	private String title;//商品标题
	private String sell_point;//商品卖点
	private long price;//价格
	private String image;//商品图片的路径
	private String category_name;//商品分类名称
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getSell_point() {
		return sell_point;
	}
	public void setSell_point(String sell_point) {
		this.sell_point = sell_point;
	}
	public long getPrice() {
		return price;
	}
	public void setPrice(long price) {
		this.price = price;
	}
	public String getImage() {
		return image;
	}
	public void setImage(String image) {
		this.image = image;
	}
	public String getCategory_name() {
		return category_name;
	}
	public void setCategory_name(String category_name) {
		this.category_name = category_name;
	}
	
	public String[] getImages() {
		if (image != null && !"".equals(image)) {
			String[] strings = image.split(",");
			return strings;
		}
		return null;
	}
	
}

2.2创建mapper接口

编写mapper.java接口和mapper.xml映射文件原因

由于设置及到tb_item(主表), tb_item_cat(商品分类表), tb_item_desc(商品描述表)三张表,mybatis的逆向工程就不能用了,我们需要自己编写mapper.java接口和mapper.xml映射文件。

mapper接口和mapper映射文件存放位置

由于搜索商品功能只有e3-search工程才会用到,所以我们可以直接将mapper接口和mapper映射文件放到e3-search-servcie。

编写mapper接口

在e3-search-service工程下新建一个"cn.e3mall.search.mapper"包,并在该包下新建ItemMapper接口类,在接口中添加一个接口getItemList方法

ItemMapper.java

package cn.e3mall.search.mapper;

import java.util.List;

import cn.e3mall.common.pojo.SearchItem;

public interface ItemMapper {
	/**
	 * 查询所有Item
	 * @return
	 */
	List getItemList();
}

2.3创建Mapper映射文件

要使用mybatis的mapper接口,就需要编写mapper.xml映射文件

将mapper.xml放到cn.e3mall.search.mapper包中

ItemMapper.xml




	

src/main/java下.xml文件扫描配置原理:

由于maven发布代码和配置文件时,在src/main/java下,maven只会将*.java文件编译成*.class文件发布到classpath下

对于*.xml文件等,maven是不会理会的

所以我们需要配置maven扫描src/main/java下的*.xml文件。但是又不能影响maven扫描src/main/resources下面的*.xml、*.properties文件,所以我们需要在e3-search-service中的pom.xml文件中添加这样的配置:

pom.xml



	
		
			src/main/java
			
				**/*.properties
				**/*.xml
			
			false
		
		
		
			src/main/resources
			
				**/*.properties
				**/*.xml
			
			false
		
	

在application-dao.xml文件中加入mapper包的位置

壹立方商城----将商品数据导入到索引库中_第4张图片


	

如果不加入这个包的扫描位置就会发生自动注解(autowrite)错误

3.service层

参数:无

业务逻辑:e3-search中实现

1、查询所有商品数据。

2、创建一个SolrServer对象。(solrServer对象交给spring管理)

3、为每个商品创建一个SolrInputDocument对象。

4、为文档添加域

5、向索引库中添加文档。

6、返回TaotaoResult。

3.1创建applicationContext-solr.xml

由于我们将solrServer对象交给spring管理,所以需要创建applicationContext-solr.xml专门管理关于solr的对象,applicationContext-solr.xml放在e3-search-service工程下的/e3-search-service/src/main/resources/spring文件夹下

applicationContext-solr.xml




	
		
		
	

3.2创建service接口

在e3-search-interface中创建“cn.e3mall.search.service”包,在里面创建SearchItemService接口用于实现搜索相关的业务接口。

SearchItemService.java

package cn.e3mall.search.service;

import cn.e3mall.common.utils.E3Result;

/**
 * 搜索业务逻辑
 * 
 * @author su
 *
 */
public interface SearchItemService {
	/**
	 * 导入所有searchItem到solr索引库中
	 * 
	 * @return
	 */
	E3Result importAllItems();
}

3.3service实现类

由于要使用mybatis访问数据库、导入索引库等,所有要导入mybatis依赖、solrj等

因为e3-search-service的pom.xml文件中依赖了e3-manager-dao,而这个工程中的pom文件里有mybatis,分页等依赖,所以只需要导入dao中没有的solrj就可以了



	org.apache.solr
	solr-solrj

在e3-search-service的“cn.e3mall.search.service.impl”中编写实现类,查询所有searchItem,导入索引库

要注意注入mapper接口和solrServer的实现类

SearchItemServiceImpl.java

package cn.e3mall.search.service.impl;

import java.util.List;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.e3mall.common.pojo.SearchItem;
import cn.e3mall.common.utils.E3Result;
import cn.e3mall.search.mapper.ItemMapper;
import cn.e3mall.search.service.SearchItemService;

/**
 * 索引库维护Service
 * 

Title: SearchItemServiceImpl

*

Description:

*

Company: www.itcast.cn

* @version 1.0 */ @Service public class SearchItemServiceImpl implements SearchItemService { @Autowired private ItemMapper itemMapper; @Autowired private SolrServer solrServer; /** * 导入所有searchItem到solr索引库中 * @return * @throws Exception */ @Override public E3Result importAllItems() { try { //1.注入mapper,发布服务 //2.调用mapper,查询商品列表中的所有商品数据 List itemList = itemMapper.getItemList(); //3.注入solrServer对象 //4.为每个商品创建一个solrInputDocument //遍历商品列表 for (SearchItem searchItem : itemList) { //创建文档对象 SolrInputDocument document = new SolrInputDocument(); //向文档对象中添加域 document.addField("id", searchItem.getId()); document.addField("item_title", searchItem.getTitle()); document.addField("item_sell_point", searchItem.getSell_point()); document.addField("item_price", searchItem.getPrice()); document.addField("item_image", searchItem.getImage()); document.addField("item_category_name", searchItem.getCategory_name()); //5.把文档对象写入索引库。。向索引库添加文档 solrServer.add(document); } //6.提交 完成日志修改 solrServer.commit(); //7.返回导入成功 return E3Result.ok(); } catch (Exception e) { e.printStackTrace(); return E3Result.build(500, "数据导入时发生异常"); } } }

3.4在e3-search-service发布服务

要注意duubo暴露的端口不能与之前服务端口冲突

在e3-search-service工程中的applicationContext-service.xml文件中添加:

4.表现层

要注意我们在管理后台导入的索引,所以在e3-manager-web编写controller与导入页面

4.1引入服务

在e3-manager-web引入e3-search-service暴露的服务接口

在e3-manager-web工程中的springmvc.xml配置文件中添加:

4.2添加e3-search-interface的依赖

在e3-manager-web工程中的pom.xml中添加如下:


	cn.e3mall
	e3-search-interface
	0.0.1-SNAPSHOT

4.3编写controller

创建SearchItemController,索引管理,注入service实现类,拦截的url可以自定义

在e3-manager-web工程下cn.e3mall.controller包下

SearchItemController.java

package cn.e3mall.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import cn.e3mall.common.utils.E3Result;
import cn.e3mall.search.service.SearchItemService;

/**
 * 导入商品数据到索引库
 * 

* Title: SearchItemController *

* * @version 1.0 */ @Controller public class SearchItemController { @Autowired private SearchItemService searchItemService; @RequestMapping("/index/item/import") @ResponseBody public E3Result importItemList() { E3Result e3Result = searchItemService.importAllItems(); return e3Result; } }

4.4创建jsp

在e3-manager-web中index.jsp,

url要对应searchController拦截的url

如下图:

壹立方商城----将商品数据导入到索引库中_第5张图片

index-item对应index-item.jsp页面

壹立方商城----将商品数据导入到索引库中_第6张图片

启动工程:manager content search manager-web

导入索引之后,在solr中查看:

壹立方商城----将商品数据导入到索引库中_第7张图片

可以看到里面有一个测试数据,我们可以将它删除

壹立方商城----将商品数据导入到索引库中_第8张图片

 

 

 

 

参考博客

原文https://blog.csdn.net/pdsu161530247/article/details/81947501

你可能感兴趣的:(壹立方商城项目)