菜单

Spring Data Redis —— 快速入门

2018年11月15日 - jQuery
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:p="http://www.springframework.org/schema/p"
 5        xmlns:context="http://www.springframework.org/schema/context"
 6        xmlns:solr="http://www.springframework.org/schema/data/solr"
 7        xsi:schemaLocation="http://www.springframework.org/schema/data/solr
 8         http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
 9         http://www.springframework.org/schema/beans
10         http://www.springframework.org/schema/beans/spring-beans.xsd
11         http://www.springframework.org/schema/context
12         http://www.springframework.org/schema/context/spring-context.xsd">
13 
14     <bean class="com.cenobitor.solr.SolrUtil" id="solrUtil"></bean>
15 
16     <!--solr服务器地址-->
17     <solr:solr-server id="solrServer" url="http://127.0.0.1:8280/solr"/>
18     <!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
19     <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
20         <constructor-arg ref="solrServer"/>
21     </bean>
22 
23 </beans>

1.连接池自动管理,提供了一个惊人封装的“RedisTemplate”类.

  copyField复制域,可以将大半单Field复制到一个Field中,以便进行统一之摸索:
  比如,根据重点字就搜索item_keywords域的始末即相当给搜索item_title、item_category、item_seller、item_brand,即将item_title、item_category、item_seller、item_brand复制到item_keywords域中。

3、在test中SpringDataRedisDemoApplicationTests.java中测试相关api

一、集成 IK Analyzer 分词器

 1 spring:
 2   redis:
 3     database: 0
 4     host: localhost
 5     port: 6379
 6     password:
 7     jedis:
 8       pool:
 9         max-active: 8
10         max-idle: 8
11         min-idle: 0

  Solr中默认定义唯一主键key为id域,如下:

将application.properties修改为application.yml的格式

 三、使用Spring Data Solr对Solr进行操作

1、环境构建

<uniqueKey>id</uniqueKey>

 图片 1

⑥运作该类生成索引

  Spring-data-redis是spring的同等有的,提供了以srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,
JRedis, and
RJC)进行了惊人封装,RedisTemplate提供了redis各种操作、异常处理以及序列化,支持发布订阅,并针对spring
3.1 cache进行了落实。
spring-data-redis针对jedis提供了如下效果:


  Solr是基于Lucene(全文检索引擎)开发,它是一个独立系统,运行在Tomcat或Jetty(solr6以上合了jetty,无需重新配备至servlet容器上),但该原生中文的分词词功能非常,需要并第三正在分词器(如IK
Analyzer)。

次、入门案例

 1     <!-- solr客户端 -->
 2     <dependency>
 3       <groupId>org.apache.solr</groupId>
 4       <artifactId>solr-solrj</artifactId>
 5       <version>${solrj.version}</version>
 6     </dependency>
 7     <dependency>
 8       <groupId>com.janeluo</groupId>
 9       <artifactId>ikanalyzer</artifactId>
10       <version>2012_u6</version>
11     </dependency>
12     <!--spring data solr-->
13     <dependency>
14       <groupId>org.springframework.data</groupId>
15       <artifactId>spring-data-solr</artifactId>
16       <version>1.5.5.RELEASE</version>
17     </dependency>

2、配置redis

④修改实体类TbItem.java,添加solr注解,映射索引字段

  环境要求:Redis 2.6和以上,javase 8.0同以上;

 

 

 1 public class TbItem implements Serializable {
 2     @Field
 3     private Long id;
 4 
 5     @Field("item_title")
 6     private String title;
 7 
 8     private String sellPoint;
 9 
10     @Field("item_price")
11     private BigDecimal price;
12 
13     private Integer stockCount;
14 
15     private Integer num;
16 
17     private String barcode;
18 
19     @Field("item_image")
20     private String image;
21 
22     private Long categoryid;
23 
24     private String status;
25 
26     private Date createTime;
27 
28     private Date updateTime;
29 
30     private String itemSn;
31 
32     private BigDecimal costPirce;
33 
34     private BigDecimal marketPrice;
35 
36     private String isDefault;
37 
38     @Field("item_goodsid")
39     private Long goodsId;
40 
41     private String sellerId;
42 
43     private String cartThumbnail;
44 
45     @Field("item_category")
46     private String category;
47 
48     @Field("item_brand")
49     private String brand;
50 
51     private String spec;
52 
53     @Field("item_seller")
54     private String seller;
55 
56     @Dynamic
57     @Field("item_spec_*")
58     private Map<String,String> specMap;
59 
60     private static final long serialVersionUID = 1L;
61 
62     .....
63 }
 1 @Component
 2 public class SolrUtil {
 3 
 4     @Autowired
 5     private TbItemMapper itemMapper;
 6 
 7     @Autowired
 8     private SolrTemplate solrTemplate;
 9 
10     /**
11      * 导入商品数据到索引库中
12      */
13     public void importItemData(){
14         TbItemExample example = new TbItemExample();
15         TbItemExample.Criteria criteria = example.createCriteria();
16         criteria.andStatusEqualTo("1");//已审核的
17 
18         List<TbItem> itemList = itemMapper.selectByExample(example);
19         System.out.println("==商品列表==");
20         for (TbItem item : itemList) {
21             Map specMap = JSON.parseObject(item.getSpec(),Map.class);//将spec字段中的json字符串转换为map
22             item.setSpecMap(specMap);//给带注解的字段赋值
23             System.out.println(item.getTitle());
24         }
25         solrTemplate.saveBeans(itemList);
26         solrTemplate.commit();
27         System.out.println("==结束==");
28     }
29 
30     public static void main(String[] args) {
31         ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
32         context.getBean(SolrUtil.class).importItemData();
33     }
34 
35 }

  使用springboot构建项目选择redis依赖

③创办mysql表,通过通用mapper生成TbItemMapper.java、TbItemMapper.xml、实体类TbItem.java、TbItemExample.java

2.对jedis客户端着大量api进行了分类封装,将同类型操作封装为operation接口

图片 2

一、Spring Data Redis 介绍

  域相当给数据库的表字段,用户存放数据,因此用户因业务要去定义相关的Field(域),一般的话,每一样种对诺着同一栽多少,用户对同样种植多少开展同样之操作。

  1 package com.cenobitor.spring_data_redis_demo;
  2 
  3 import org.junit.Assert;
  4 import org.junit.Test;
  5 import org.junit.runner.RunWith;
  6 import org.springframework.beans.factory.annotation.Autowired;
  7 import org.springframework.boot.test.context.SpringBootTest;
  8 import org.springframework.data.redis.core.RedisTemplate;
  9 import org.springframework.test.context.junit4.SpringRunner;
 10 import java.util.List;
 11 import java.util.Set;
 12 
 13 @RunWith(SpringRunner.class)
 14 @SpringBootTest
 15 public class SpringDataRedisDemoApplicationTests {
 16 
 17     @Autowired
 18     private RedisTemplate redisTemplate;
 19 
 20     @Test
 21     public void contextLoads() {
 22     }
 23 
 24     /**
 25      * 值得操作
 26      */
 27     @Test
 28     public void setValue(){
 29         redisTemplate.boundValueOps("name").set("redis");
 30     }
 31 
 32     @Test
 33     public void getValue(){
 34         String str = (String) redisTemplate.boundValueOps("name").get();
 35         System.out.println(str);
 36         Assert.assertNotNull(str);
 37     }
 38 
 39     /**
 40      * set类型的操作
 41      */
 42     @Test
 43     public void setSetValue(){
 44         redisTemplate.boundSetOps("nameset").add("曹操");
 45         redisTemplate.boundSetOps("nameset").add("孙权");
 46         redisTemplate.boundSetOps("nameset").add("刘备");
 47     }
 48     @Test
 49     public void getSetValue(){
 50         Set nameset = redisTemplate.boundSetOps("nameset").members();
 51         System.out.println(nameset);//[刘备, 孙权, 曹操]
 52     }
 53     //删除集合中的某个元素
 54     @Test
 55     public void deleteSetValue(){
 56         Long remove = redisTemplate.boundSetOps("nameset").remove("刘备");
 57         System.out.println(remove);
 58         Assert.assertEquals("1",remove);
 59     }
 60     //删除整个集合
 61     @Test
 62     public void deleteSet(){
 63         Boolean nameset = redisTemplate.delete("nameset");
 64         Assert.assertEquals(true,nameset);
 65     }
 66 
 67     /**
 68      * List类型操作
 69      */
 70     //右压栈:后添加的对象排在后边
 71     @Test
 72     public void setListValue1(){
 73         redisTemplate.boundListOps("namelist1").rightPush("刘备");
 74         redisTemplate.boundListOps("namelist1").rightPush("关羽");
 75         redisTemplate.boundListOps("namelist1").rightPush("张飞");
 76     }
 77     @Test
 78     public void getListValue1(){
 79         List list = redisTemplate.boundListOps("namelist1").range(0, -1);
 80         System.out.println(list);//[刘备, 关羽, 张飞]
 81     }
 82     //左压栈:后添加的对象排在前边
 83     @Test
 84     public void setListValue2(){
 85         redisTemplate.boundListOps("namelist2").leftPush("刘备");
 86         redisTemplate.boundListOps("namelist2").leftPush("关羽");
 87         redisTemplate.boundListOps("namelist2").leftPush("张飞");
 88     }
 89     @Test
 90     public void getListValue2(){
 91         List list = redisTemplate.boundListOps("namelist2").range(0, -1);
 92         System.out.println(list);//[张飞, 关羽, 刘备]
 93     }
 94     //查询集合某个元素
 95     @Test
 96     public void searchListByIndex(){
 97         String s = (String) redisTemplate.boundListOps("namelist1").index(1);
 98         System.out.println(s);//关羽
 99     }
100     //移除集合某个元素
101     @Test
102     public void removeListByIndex(){
103         redisTemplate.boundListOps("namelist1").remove(1, "关羽");
104     }
105 
106     /**
107      * Hash类型操作
108      */
109     @Test
110     public void setHashValue(){
111         redisTemplate.boundHashOps("namehash").put("a", "唐僧");
112         redisTemplate.boundHashOps("namehash").put("b", "悟空");
113         redisTemplate.boundHashOps("namehash").put("c", "八戒");
114         redisTemplate.boundHashOps("namehash").put("d", "沙僧");
115     }
116     @Test
117     public void getHash(){
118         //提取所有的KEY
119         Set s = redisTemplate.boundHashOps("namehash").keys();
120         System.out.println(s);//[a, b, c, d]
121         //提取所有的值
122         List values = redisTemplate.boundHashOps("namehash").values();
123         System.out.println(values);//[唐僧, 悟空, 八戒, 沙僧]
124         //根据KEY提取值
125         String str = (String) redisTemplate.boundHashOps("namehash").get("b");
126         System.out.println(str);//悟空
127     }
128     //根据KEY移除值
129     @Test
130     public void removeHashByKey() {
131         redisTemplate.boundHashOps("namehash").delete("c");
132     }
133 }

图片 3

1 <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
2 <copyField source="item_title" dest="item_keywords"/>
3 <copyField source="item_category" dest="item_keywords"/>
4 <copyField source="item_seller" dest="item_keywords"/>
5 <copyField source="item_brand" dest="item_keywords"/>
  1 @Service
  2 public class ItemSearchServiceImpl implements ItemSearchService {
  3 
  4     @Autowired
  5     private SolrTemplate solrTemplate;
  6 
  7     /**
  8      * 添加
  9      * @param tbItem
 10      */
 11     @Override
 12     public void add(TbItem tbItem) {
 13         solrTemplate.saveBean(tbItem);
 14         solrTemplate.commit();
 15     }
 16 
 17     /**
 18      * 按主键查询
 19      * @param id
 20      * @return
 21      */
 22     @Override
 23     public TbItem searchById(int id) {
 24         TbItem tbItem = solrTemplate.getById(id, TbItem.class);
 25         return tbItem;
 26     }
 27 
 28     /**
 29      * 按主键删除
 30      * @param id
 31      * @return
 32      */
 33     @Override
 34     public void deleteById(String id) {
 35         solrTemplate.deleteById(id);
 36     }
 37 
 38     /**
 39      * 分页查询
 40      * @param start
 41      * @param size
 42      */
 43     @Override
 44     public ScoredPage<TbItem> pageQuery(int start,int size){
 45         Query query=new SimpleQuery("*:*");
 46         query.setOffset(start);//开始索引(默认0)start:(page-1)*rows
 47         query.setRows(size);//每页记录数(默认10)//rows:rows
 48         return solrTemplate.queryForPage(query, TbItem.class);
 49     }
 50 
 51     /**
 52      * 删除所有
 53      */
 54     @Override
 55     public void deleteAll() {
 56         Query query = new SimpleQuery("*:*");
 57         solrTemplate.delete(query);
 58         solrTemplate.commit();
 59     }
 60 
 61     /**
 62      * 搜索
 63      * @param searchMap
 64      * @return
 65      */
 66     @Override
 67     public Map<String, Object> search(Map searchMap) {
 68         Map<String, Object> resultMap = new HashMap<>();
 69         //1.先获取从页面传递过来的参数的值   通过KEY获取
 70         String keywords = (String)searchMap.get("keywords");//获取主查询的条件
 71 
 72         //2.设置主查询的条件
 73         HighlightQuery query =  new SimpleHighlightQuery();
 74         Criteria criteria = new Criteria("item_keywords");
 75         criteria.is(keywords);
 76         query.addCriteria(criteria);
 77         //3.设置高亮查询的条件   设置高亮显示的域  设置前缀  设置后缀
 78         HighlightOptions hightoptions = new HighlightOptions();
 79         hightoptions.addField("item_title");//设置高亮显示的域
 80         hightoptions.setSimplePrefix("<em style=\"color:red\">");
 81         hightoptions.setSimplePostfix("</em>");
 82         query.setHighlightOptions(hightoptions);
 83 
 84         //4.设置过滤条件  商品分类的过滤
 85         if (searchMap.get("category") != null && !"".equals(searchMap.get("category"))) {
 86             Criteria fiterCriteria = new Criteria("item_category").is(searchMap.get("category"));
 87             FilterQuery filterQuery = new SimpleFilterQuery(fiterCriteria);
 88             query.addFilterQuery(filterQuery);
 89         }
 90 
 91         //5.设置品牌的过滤
 92         if (searchMap.get("brand") != null && !"".equals(searchMap.get("brand"))) {
 93             Criteria fitercriteria = new Criteria("item_brand").is(searchMap.get("brand"));
 94             FilterQuery filterquery = new SimpleFilterQuery(fitercriteria);
 95             query.addFilterQuery(filterquery);
 96         }
 97 
 98         //6.设置规格的过滤条件
 99         if (searchMap.get("spec") != null) {
100             Map<String,String> spec = (Map<String, String>) searchMap.get("spec");
101 
102             for (String key : spec.keySet()) {
103                 String value = spec.get(key);
104                 Criteria fiterCriteria = new Criteria("item_spec_"+key).is(value);//item_spec_网络:3G
105                 FilterQuery filterquery = new SimpleFilterQuery(fiterCriteria);
106                 query.addFilterQuery(filterquery);//
107             }
108         }
109 
110         //7.按照价格筛选
111         if (StringUtils.isNotBlank((CharSequence) searchMap.get("price"))){
112             //item_price:[10 TO 20]
113             String[] split = searchMap.get("price").toString().split("-");
114             SimpleFilterQuery filterQuery = new SimpleFilterQuery();
115             Criteria itemPrice = new Criteria("item_price");
116             //如果有* 语法是不支持的
117             if(!split[1].equals("*")){
118                 itemPrice.between(split[0],split[1],true,true);
119             }else {
120                 itemPrice.greaterThanEqual(split[0]);
121             }
122             filterQuery.addCriteria(itemPrice);
123             query.addFilterQuery(filterQuery);
124         }
125         //8.分页查询
126         Integer pageNo = (Integer) searchMap.get("pageNo");//提取页面
127 
128         if (pageNo==null){
129             pageNo =1;
130         }
131         Integer pageSize = (Integer) searchMap.get("pageSize");//每页记录数
132         if (pageSize==null){
133             pageSize=20;
134         }
135         query.setOffset((pageNo-1)*pageSize);//从第几条记录查询
136         query.setRows(pageSize);
137 
138         //9.排序
139         String sortValue = (String) searchMap.get("sort");
140         String sortField = (String) searchMap.get("sortField");//排序字段
141         if (StringUtils.isNotBlank(sortField)){
142             if (sortValue.equals("ASC")){
143                 Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
144                 query.addSort(sort);
145             }
146             if (sortValue.equals("DESC")){
147                 Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
148                 query.addSort(sort);
149             }
150         }
151 
152         //10.执行查询 获取高亮数据
153         HighlightPage<TbItem> highlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class);
154 
155         List<HighlightEntry<TbItem>> highlighted = highlightPage.getHighlighted();
156         for (HighlightEntry<TbItem> tbItemHighlightEntry : highlighted) {
157             TbItem entity = tbItemHighlightEntry.getEntity();//实体对象 现在是没有高亮的数据的
158 
159             List<HighlightEntry.Highlight> highlights = tbItemHighlightEntry.getHighlights();
160             //如有高亮,就取高亮
161             if(highlights!=null && highlights.size()>0 && highlights.get(0)!=null &&  highlights.get(0).getSnipplets()!=null && highlights.get(0).getSnipplets().size()>0) {
162                 entity.setTitle(highlights.get(0).getSnipplets().get(0));
163             }
164         }
165         List<TbItem> tbItems = highlightPage.getContent();//获取高亮的文档的集合
166         //11.执行查询
167         System.out.println("结果"+tbItems.size());
168         //12.获取结果集  返回
169         resultMap.put("rows",tbItems);
170         resultMap.put("totalPages",highlightPage.getTotalPages());//返回总页数
171         resultMap.put("total",highlightPage.getTotalElements());//返回总记录数
172         return resultMap;
173     }
174 }
1 <field name="item_goodsid" type="long" indexed="true" stored="true"/>
2 <field name="item_title" type="text_ik" indexed="true" stored="true"/>
3 <field name="item_price" type="double" indexed="true" stored="true"/>
4 <field name="item_image" type="string" indexed="false" stored="true" />
5 <field name="item_category" type="string" indexed="true" stored="true" />
6 <field name="item_seller" type="text_ik" indexed="true" stored="true" />
7 <field name="item_brand" type="string" indexed="true" stored="true" />

步骤:
1、把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下
2、创建WEB-INF/classes文件夹把扩大词典、停用词词典、配置文件放到 solr
工程的 WEB-INF/classes 目录下。

  如:

  自定义Field名为:product_title_t,“product_title_t”和scheam.xml中之dynamicField规则匹配成功。

  Spring Data
Solr就是为方便Solr的出所研制的一个框架,其底层是对SolrJ(官方API)的包。

1、域

 3、dynamicField(动态字段)

3、修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer

 

②测试相关方法

配置:<dynamicField name=”item_spec_*” type=”string”
indexed=”true” stored=”true” />

②续加依

 2、使用Spring Data Solr对Solr进行操作

图片 4

<fieldType name=”text_ik” class=”solr.TextField”>
    <analyzer
class=”org.wltea.analyzer.lucene.IKAnalyzer”/>
</fieldType>

  Solr在去、更新索引时动id域进行判断,也堪起定义唯一主键。
  注意在创造索引时务必指定唯一约束。

 图片 5

种目录结构:

  Solr的装置可上网搜一下,很简短。下面开始演示,如何集成IK
Analyzer、配置相关域以及利用Spring Data Solr进行操作。

 1、环境之搭建

及此结束,Spring Data Solr的核心以基本就是是这样。

  动态字段就是绝不指定具体的称,只要定义字段名称的平整,例如定义一个
dynamicField,name
为*_i,定义其的type为text,那么当利用此字段的时光,任何以_i结尾的字段都为看是相符这概念之,例如:name_i,gender_i,school_i等。

 ①创建ItemSearchServiceImpl.java

 二、配置域

⑤配置applicationContext-solr.xml配置文件

地区的常用属性:
• name:指定域的号
• type:指定域的型
• indexed:是否索引
• stored:是否存储
• required:是否要
• multiValued:是否多值

 1 @RunWith(SpringRunner.class)
 2 @ContextConfiguration("classpath:spring/applicationContext-*.xml")
 3 public class ItemSearchServiceImplTest {
 4 
 5     @Autowired
 6     private ItemSearchService itemSearchService;
 7 
 8     @Test
 9     public void search() {
10         //构造json字符串
11         String searchStr = new String("{'keywords':'华为','category':'手机','brand':'华为'," +
12                 "'spec':{'机身内存':'16G','网络':'联通3G'},'price':'1000-3000'," +
13                 "'pageNo':1,'pageSize':10,'sortField':'price','sort':'ASC'}");
14         Map searchMap = JSON.parseObject(searchStr, Map.class);
15         //根据条件进行搜索过滤
16         Map<String, Object> search = itemSearchService.search(searchMap);
17         for (String s : search.keySet()) {
18             System.out.println(s+":"+search.get(s));
19         }
20         Assert.assertNotEquals(0,search.size());
21         //结果9
22         /*total:9
23         totalPages:1
24         rows:[
25         TbItem{id=1041685, title='<em style="color:red">华为</em> 麦芒B199 白 电信3G手机 双卡双待双通', price=1249.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
26         TbItem{id=1060844, title='<em style="color:red">华为</em> Ascend P6S 碳素黑 联通3G手机 双卡双待', price=1259.0,image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
27         TbItem{id=1075409, title='<em style="color:red">华为</em> 麦芒B199 深灰 电信3G手机 双卡双待双通', price=1269.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
28         TbItem{id=1082721, title='<em style="color:red">华为</em> 麦芒B199 深灰色 电信3G手机 双模双待双通',price=1269.0, image='http://**.jpg',goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
29         TbItem{id=917460, title='<em style="color:red">华为</em> P6 (P6-C00) 黑 电信3G手机 双卡双待双通',price=1288.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
30         TbItem{id=917461, title='<em style="color:red">华为</em> P6 (P6-C00) 白 电信3G手机 双卡双待双通',price=1299.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
31         TbItem{id=1060847, title='<em style="color:red">华为</em> Ascend P6S 阿尔卑斯白 联通3G手机 双卡双待',price=1328.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
32         TbItem{id=1075413, title='<em style="color:red">华为</em> 麦芒B199 金 电信3G手机 双卡双待双通', price=1329.0, image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}},
33         TbItem{id=917770, title='<em style="color:red">华为</em> P6-C00 电信3G手机(粉色) CDMA2000/GSM 双模双待双通', image='http://**.jpg', goodsId=1, category='手机', brand='华为', seller='华为', specMap={网络=联通3G, 机身内存=16G}}]
34     */
35     }
36 
37     @Test
38     public void add(){
39         TbItem item=new TbItem();
40         item.setId(1L);
41         item.setBrand("华为");
42         item.setCategory("手机");
43         item.setGoodsId(1L);
44         item.setSeller("华为2号专卖店");
45         item.setTitle("华为Mate9");
46         item.setPrice(new BigDecimal(2000));
47         itemSearchService.add(item);
48     }
49 
50     @Test
51     public void searchById(){
52         TbItem tbItem = itemSearchService.searchById(536563);
53         System.out.println(tbItem.getTitle());
54     }
55 
56     @Test
57     public void deleteById(){
58         itemSearchService.deleteById("536563");
59     }
60 
61     @Test
62     public void pageQuery(){
63         ScoredPage<TbItem> page = itemSearchService.pageQuery(2, 10);
64         System.out.println("总记录数:"+page.getTotalElements());
65         List<TbItem> list = page.getContent();
66         for(TbItem item:list){
67             System.out.println(item.getTitle() +item.getPrice());
68         }
69     }
70 
71     @Test
72     public void deleteAll(){
73         itemSearchService.deleteAll();
74     }
75 }

①搭建SSM框架,参考:http://www.cnblogs.com/gdwkong/p/8784780.html

  目标域必须是多值的。

 1 CREATE TABLE `tb_item` (
 2   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品id,同时也是商品编号',
 3   `title` varchar(100) NOT NULL COMMENT '商品标题',
 4   `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
 5   `price` decimal(20,2) NOT NULL COMMENT '商品价格,单位为:元',
 6   `stock_count` int(10) DEFAULT NULL,
 7   `num` int(10) NOT NULL COMMENT '库存数量',
 8   `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
 9   `image` varchar(2000) DEFAULT NULL COMMENT '商品图片',
10   `categoryId` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
11   `status` varchar(1) NOT NULL COMMENT '商品状态,1-正常,2-下架,3-删除',
12   `create_time` datetime NOT NULL COMMENT '创建时间',
13   `update_time` datetime NOT NULL COMMENT '更新时间',
14   `item_sn` varchar(30) DEFAULT NULL,
15   `cost_pirce` decimal(10,2) DEFAULT NULL,
16   `market_price` decimal(10,2) DEFAULT NULL,
17   `is_default` varchar(1) DEFAULT NULL,
18   `goods_id` bigint(20) DEFAULT NULL,
19   `seller_id` varchar(30) DEFAULT NULL,
20   `cart_thumbnail` varchar(150) DEFAULT NULL,
21   `category` varchar(200) DEFAULT NULL,
22   `brand` varchar(100) DEFAULT NULL,
23   `spec` varchar(200) DEFAULT NULL,
24   `seller` varchar(200) DEFAULT NULL,
25   PRIMARY KEY (`id`),
26   KEY `cid` (`categoryId`),
27   KEY `status` (`status`),
28   KEY `updated` (`update_time`)
29 ) ENGINE=InnoDB AUTO_INCREMENT=1369286 DEFAULT CHARSET=utf8 COMMENT='商品表'

2、copyField复制域

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图