在schema.xml中定义以下业务域(已经定义好):
需要从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索引库。
导入之后,solr索引库中存在商品数据
业务逻辑:
1.点击按钮,表现层调用服务层的工程的导入索引库的方法
2.服务层实现 调用mapper接口的方法查询所有的商品的数据
3.将数据一条条添加到solrinputdocument文档中
4.将文档添加到索引库中
5.提交,并返回导入成功即可
我们查看从tb_item(主表), tb_item_cat(商品分类表), tb_item_desc(商品描述表)表中查询status=1的数据。
针对来自三张表的数据,我们需要使用一个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;
}
}
编写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();
}
要使用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包的位置
如果不加入这个包的扫描位置就会发生自动注解(autowrite)错误
参数:无
业务逻辑:e3-search中实现
1、查询所有商品数据。
2、创建一个SolrServer对象。(solrServer对象交给spring管理)
3、为每个商品创建一个SolrInputDocument对象。
4、为文档添加域
5、向索引库中添加文档。
6、返回TaotaoResult。
由于我们将solrServer对象交给spring管理,所以需要创建applicationContext-solr.xml专门管理关于solr的对象,applicationContext-solr.xml放在e3-search-service工程下的/e3-search-service/src/main/resources/spring文件夹下
applicationContext-solr.xml
在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();
}
由于要使用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, "数据导入时发生异常");
}
}
}
要注意duubo暴露的端口不能与之前服务端口冲突
在e3-search-service工程中的applicationContext-service.xml文件中添加:
要注意我们在管理后台导入的索引,所以在e3-manager-web编写controller与导入页面
在e3-manager-web引入e3-search-service暴露的服务接口
在e3-manager-web工程中的springmvc.xml配置文件中添加:
在e3-manager-web工程中的pom.xml中添加如下:
cn.e3mall
e3-search-interface
0.0.1-SNAPSHOT
创建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;
}
}
在e3-manager-web中index.jsp,
url要对应searchController拦截的url
如下图:
index-item对应index-item.jsp页面
启动工程:manager content search manager-web
导入索引之后,在solr中查看:
可以看到里面有一个测试数据,我们可以将它删除
原文https://blog.csdn.net/pdsu161530247/article/details/81947501