Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括分页,排序等一些常用的功能;
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport‐netty4‐client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
package com.wn.title;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
//文档对象
@Document(indexName = "blog3",type = "table03")
public class Table01 {
@Id
@Field(store = true,index = false,type = FieldType.Integer)
private Integer id;
@Field(index = true,analyzer = "ik_smart",store = true,searchAnalyzer = "ik_smart",type = FieldType.text)
private String title;
//index:是否设置分词
//analyzer:存储时使用的分词器
//searchAnalyze:搜索时使用的分词器
//store:是否存储
//type:数据类型
@Field(index = true,analyzer = "ik_smart",store = true,searchAnalyzer = "ik_smart",type = FieldType.text)
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Table01{" +
"id=" + id +
", title=‘" + title + ‘\‘‘ +
", content=‘" + content + ‘\‘‘ +
‘}‘;
}
}
package com.wn.dao;
import com.wn.title.Table01;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TableDao extends ElasticsearchRepository<Table01,Integer> {
}
package com.wn.service;
import com.wn.title.Table01;
public interface TableService {
public void save(Table01 table01);
}
package com.wn.service.impl;
import com.wn.dao.TableDao;
import com.wn.service.TableService;
import com.wn.title.Table01;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class TableServiceImpl implements TableService {
@Resource
private TableDao dao;
@Override
public void save(Table01 table01) {
dao.save(table01);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
">
<!--扫描DAO包,自动创建实例-->
<elasticsearch:repositories base-package="com.wn.dao"/>
<!--扫描service包,创建service的实体-->
<context:component-scan base-package="com.wn.service"/>
<!--配置ES的连接-->
<elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300" cluster-name="my-elasticsearch"/>
<!--ES模板对象-->
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="client"></constructor-arg>
</bean>
</beans>
package com.wn.controller;
import com.wn.service.TableService;
import com.wn.title.Table01;
import org.elasticsearch.client.transport.TransportClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringDataESTest {
@Resource
private TableService service;
@Autowired
private TransportClient client;
@Autowired
private ElasticsearchTemplate template;
/*创建索引和映射*/
@Test
public void createIndex(){
template.createIndex(Table01.class);
template.putMapping(Table01.class);
}
/*测试保存文档*/
@Test
public void saveTable(){
Table01 table01=new Table01();
table01.setId(11);
table01.setTitle("测试SpringData ES");
table01.setContent("springdata基于spring data API简化ES操作");
service.save(table01);
}
}
package com.wn.title;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
//文档对象
@Document(indexName = "blog3",type = "table033")
public class Table01 {
@Id
@Field(store = true,index = false,type = FieldType.Integer)
private Integer id;
@Field(index = true,analyzer = "ik_smart",store = true,searchAnalyzer = "ik_smart",type = FieldType.text)
private String title;
//index:是否设置分词
//analyzer:存储时使用的分词器
//searchAnalyze:搜索时使用的分词器
//store:是否存储
//type:数据类型
@Field(index = true,analyzer = "ik_smart",store = true,searchAnalyzer = "ik_smart",type = FieldType.text)
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Table01{" +
"id=" + id +
", title=‘" + title + ‘\‘‘ +
", content=‘" + content + ‘\‘‘ +
‘}‘;
}
}
package com.wn.service;
import com.wn.title.Table01;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public interface TableServiceTest {
//添加
public void save(Table01 table01);
//删除
public void delete(Table01 table01);
//查询全部
public Iterable<Table01> findAll();
//分页查询
public Page<Table01> findAll(Pageable pageable);
}
package com.wn.service.impl;
import com.wn.dao.TableDao;
import com.wn.service.TableServiceTest;
import com.wn.title.Table01;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class TableServiceImplTest implements TableServiceTest {
@Resource
private TableDao dao;
@Override
public void save(Table01 table01) {
dao.save(table01);
}
@Override
public void delete(Table01 table01) {
dao.delete(table01);
}
@Override
public Iterable<Table01> findAll() {
Iterable<Table01> iter = dao.findAll();
return iter;
}
@Override
public Page<Table01> findAll(Pageable pageable) {
return dao.findAll(pageable);
}
}
package com.wn.controller;
import com.wn.service.TableServiceTest;
import com.wn.title.Table01;
import org.elasticsearch.client.transport.TransportClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TableControllerTest {
@Resource
private TableServiceTest service;
@Autowired
private TransportClient client;
@Autowired
private ElasticsearchTemplate template;
/*创建索引和映射*/
@Test
public void createIndex(){
template.createIndex(Table01.class);
template.createIndex(Table01.class);
}
/*创建文档*/
@Test
public void save(){
Table01 table01=new Table01();
table01.setId(12);
table01.setTitle("ES 3.0版本发布");
table01.setContent("它是一个基于Lucene的搜索服务器");
service.save(table01);
}
/*测试更新*/
@Test
public void update(){
Table01 table01=new Table01();
table01.setId(12);
table01.setTitle("【修改】ES 3.0版本发布");
table01.setContent("【修改】它是一个基于Lucene的搜索服务器");
service.save(table01);
}
/*测试删除*/
@Test
public void delete(){
Table01 table01=new Table01();
table01.setId(12);
service.delete(table01);
}
/*批量插入*/
@Test
public void save20(){
for (int i=1;i<20;i++){
Table01 table01=new Table01();
table01.setId(i);
table01.setTitle(i+"ES版本");
table01.setContent(i+"基于Lucene搜索服务器");
service.save(table01);
}
}
/*分页查询*/
@Test
public void findAllPage(){
Pageable pageable= PageRequest.of(0,10);
Page<Table01> page=service.findAll(pageable);
for (Table01 table01:page.getContent()){
System.out.println(table01);
}
}
}
package com.wn.dao;
import com.wn.title.Table01;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TableDao extends ElasticsearchRepository<Table01,Integer> {
//根据标题查询
List<Table01> findByTitle(String condition);
//根据标题查询(含分页)
Page<Table01> findByTitle(String condition, Pageable pageable);
}
package com.wn.service;
import com.wn.title.Table01;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface TableServiceSelect {
//根据标题查询
List<Table01> findByTitle(String condition);
//根据标题查询(含分页)
Page<Table01> findByTitle(String condition, Pageable pageable);
}
package com.wn.service.impl;
import com.wn.dao.TableDao;
import com.wn.service.TableServiceSelect;
import com.wn.title.Table01;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TableServiceImplSelect implements TableServiceSelect {
@Resource
private TableDao dao;
@Override
public List<Table01> findByTitle(String condition) {
return dao.findByTitle(condition);
}
@Override
public Page<Table01> findByTitle(String condition, Pageable pageable) {
return dao.findByTitle(condition,pageable);
}
}
package com.wn.controller;
import com.wn.service.TableServiceSelect;
import com.wn.title.Table01;
import org.elasticsearch.client.transport.TransportClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:applicationContext.xml")
public class TableControllerSelect {
@Resource
TableServiceSelect service;
@Autowired
private TransportClient client;
@Autowired
private ElasticsearchTemplate template;
/*条件查询*/
@Test
public void findByTitle(){
String condition="版本";
List<Table01> table01List = service.findByTitle(condition);
for (Table01 table01:table01List){
System.out.println(table01);
}
}
/*条件分页查询*/
@Test
public void findByTitlePage(){
String condition="版本";
Pageable pageable= PageRequest.of(1,10);
Page<Table01> page = service.findByTitle(condition, pageable);
for (Table01 table01:page.getContent()){
System.out.println(table01);
}
}
}
/*使用原生查询对象进行查询*/
@Test
public void findByNativeQuery(){
//创建一个SearchQuery对象
SearchQuery searchQuery = new NativeSearchQueryBuilder()
//设置查询条件,此处可以使用QueryBuilders创建多种查询
.withQuery(QueryBuilders.queryStringQuery("版本").defaultField("title"))
//还可以设置分页信息
.withPageable(PageRequest.of(1, 5))
//创建SearchQuery对象
.build();
//使用模板对象执行查询
List<Table01> table01List = template.queryForList(searchQuery, Table01.class);
for (Table01 table01:table01List){
System.out.println(table01);
}
}
原文:https://www.cnblogs.com/wnwn/p/12370153.html