springboot整合 elasticsearch 做 增删改查 CRUD以及分页

目录

步骤 1 : 版本问题

步骤 2 : 启动 elasticsearch 2.4.2

步骤 3 : 先运行,看到效果,再学习

步骤 4 : 模仿和排错

步骤 5 : 创建 springboot 项目

步骤 6 : pom.xml

步骤 7 : Application.java

步骤 8 : Category

步骤 9 : CategoryDAO

步骤 10 : 控制类

步骤 11 : listCategory.jsp

步骤 12 : editCategory.jsp

步骤 13 : application.properties

步骤 14 : 启动并测试

步骤 15 : kibana

步骤 16 : 启动 kibana 并访问

步骤 17 : 选择索引

步骤 18 : 查看数据


步骤 1 : 版本问题

springboot 有一个 spring data 组件,可以用来连接各种数据源。 用来连接 elasticsearch 的是 spring-data-elasticsearch。 
但是呢。。。 截止现在(2018-9-17),spring-data-elasticsearch 更新比较慢,其最高版本无法支持教程里的 elasticsearch的6.x 版本。 
为了支持 6.x 版本,需要用要用奇怪的 transportclient 来连接, 这就不是 spring-data 系列里的内容了。
考虑到将来,spring data 总会支持最新版本的 elasticsearch的,所以我们还是使用 spring-data 来进行链接。 只是,elasticsearch 的版本,我们换成了 2.4.2, kibana 版本,也换成了能够连接 elasticsearch 2.4.2 的 4.6.3 版本。
这两个新的版本,都在下载区(点击进入)提供了下载。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 2 : 启动 elasticsearch 2.4.2

首先关闭本系列教材可能启动的 elasticsearch 6.2.2。
然后下载并解压下载区(点击进入)的 elasticsearch 2.4.2,运行其中的 elasticsearch.bat
启动后,可以看到左上角的版本号。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 3 : 先运行,看到效果,再学习

老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。 
首先确保 启动 elasticsearch 2.4.2 这个步骤要做了,不然跑不起来。
然后运行 Application.java 启动项目
接着访问地址:

http://127.0.0.1:8080/listCategory


CRUD和分页效果都有。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页springboot整合 elasticsearch 做 增删改查 CRUD以及分页正在上传…重新上传取消springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 4 : 模仿和排错

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。 
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。 
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。 

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。 
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来 
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程

步骤 5 : 创建 springboot 项目

创建方式在 springboot 模块里, eclipse 和 idea 都有:
eclipse 方式创建 springboot 项目 
idea 方式创建 springboot 项目

步骤 6 : pom.xml

各种jar包,主要是 spring-boot-starter-data-elastisearch 这个 jar包

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

 

  <groupId>com.how2java</groupId>

  <artifactId>springboot</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <name>springboot</name>

  <description>springboot</description>

  <packaging>war</packaging>

   

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.9.RELEASE</version>

    </parent>

 

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-tomcat</artifactId>

             

        </dependency>

        <dependency>

              <groupId>junit</groupId>

              <artifactId>junit</artifactId>

              <version>3.8.1</version>

              <scope>test</scope>

        </dependency>

        <!-- servlet依赖. -->

        <dependency>

              <groupId>javax.servlet</groupId>

              <artifactId>javax.servlet-api</artifactId>

               

        </dependency>

              <dependency>

                     <groupId>javax.servlet</groupId>

                     <artifactId>jstl</artifactId>

              </dependency>

        <!-- tomcat的支持.-->

        <dependency>

               <groupId>org.apache.tomcat.embed</groupId>

               <artifactId>tomcat-embed-jasper</artifactId>

                

        </dependency>    

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->

        </dependency>

         

        <!-- mysql-->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.21</version>

        </dependency>

 

        <!-- jpa-->

<!--         <dependency> -->

<!--             <groupId>org.springframework.boot</groupId> -->

<!--             <artifactId>spring-boot-starter-data-jpa</artifactId> -->

<!--         </dependency>         -->

         

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

        </dependency>       

         

    </dependencies>

 

    <properties>

        <java.version>1.8</java.version>

    </properties>

 

    <build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>

    </build>

 

</project>

步骤 7 : Application.java

启动类

package com.how2java.springboot;

  

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

  

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

步骤 8 : Category

Category 实体类,其中的 @Document就表明了要连接到 ElasticSearch 的哪个索引和哪个 type 上

@Document(indexName = "how2java",type = "category")


索引相当于就是数据库,type 相当于就是表

package com.how2java.springboot.pojo;

 

import org.springframework.data.elasticsearch.annotations.Document;

 

@Document(indexName = "how2java",type = "category")

public class Category {

 

    private int id;

    private String name;

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

     

}

步骤 9 : CategoryDAO

继承了,就什么东西都有了~

package com.how2java.springboot.dao;

 

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

 

import com.how2java.springboot.pojo.Category;

 

public interface CategoryDAO extends ElasticsearchRepository<Category,Integer>{

 

}

步骤 10 : 控制类

控制类提供 CRUD 一套

package com.how2java.springboot.web;

import java.text.SimpleDateFormat;

import java.util.Date;

 

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;

import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;

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.domain.Sort;

import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

import org.springframework.data.elasticsearch.core.query.SearchQuery;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

 

import com.how2java.springboot.dao.CategoryDAO;

import com.how2java.springboot.pojo.Category;

   

@Controller

public class CategoryController {

    @Autowired CategoryDAO categoryDAO;

 

    //每页数量

 

    @GetMapping("/listCategory")

    public String listCategory(Model m,@RequestParam(value = "start", defaultValue = "0") int start,@RequestParam(value = "size", defaultValue = "5") int size){

        String query = "商品"; //查询条件,但是并未使用,放在这里,为的是将来使用,方便参考,知道如何用

        SearchQuery searchQuery=getEntitySearchQuery(start,size,query);

        Page<Category> page = categoryDAO.search(searchQuery);

        m.addAttribute("page", page);

        return "listCategory";       

    }

 

    private SearchQuery getEntitySearchQuery(int start, int size, String searchContent) {

        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()

                .add(QueryBuilders.matchAllQuery(), //查询所有

                        ScoreFunctionBuilders.weightFactorFunction(100))

 

//                查询条件,但是并未使用,放在这里,为的是将来使用,方便参考,知道如何用

//                .add(QueryBuilders.matchPhraseQuery("name", searchContent),

//                      ScoreFunctionBuilders.weightFactorFunction(100))

                //设置权重分 求和模式

                .scoreMode("sum")

                //设置权重分最低分

                .setMinScore(10);

 

        // 设置分页

        Sort sort  = new Sort(Sort.Direction.DESC,"id");

        Pageable pageable = new PageRequest(start, size,sort);

        return new NativeSearchQueryBuilder()

                .withPageable(pageable)

                .withQuery(functionScoreQueryBuilder).build();

    }   

     

    @RequestMapping("/addCategory")

    public String addCategory(Category c) throws Exception {

        int id = currentTime();

        c.setId(id);

        categoryDAO.save(c);

        return "redirect:listCategory";

    }

    private int currentTime() {

        SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss");

        String time= sdf.format(new Date());

        return Integer.parseInt(time);

    }

 

    @RequestMapping("/deleteCategory")

    public String deleteCategory(Category c) throws Exception {

        categoryDAO.delete(c);

        return "redirect:listCategory";

    }

    @RequestMapping("/updateCategory")

    public String updateCategory(Category c) throws Exception {

        categoryDAO.save(c);

        return "redirect:listCategory";

    }

    @RequestMapping("/editCategory")

    public String ediitCategory(int id,Model m) throws Exception {

        Category c= categoryDAO.findOne(id);

        m.addAttribute("c", c);

        return "editCategory";

    }

}

步骤 11 : listCategory.jsp

listCategory.jsp 文件,记得放在如图所示的位置。没有的目录,自己创建就好了。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

   

<div align="center">

 

</div>

 

<div style="width:500px;margin:20px auto;text-align: center">

    <table align='center' border='1' cellspacing='0'>

        <tr>

            <td>id</td>

            <td>name</td>

            <td>编辑</td>

            <td>删除</td>

        </tr>

        <c:forEach items="${page.content}" var="c" varStatus="st">

            <tr>

                <td>${c.id}</td>

                <td>${c.name}</td>

                <td><a href="editCategory?id=${c.id}">编辑</a></td>

                <td><a href="deleteCategory?id=${c.id}">删除</a></td>

            </tr>

        </c:forEach>

         

    </table>

    <br>

    <div>

                <a href="?start=0">[首  页]</a>

            <a href="?start=${page.number-1}">[上一页]</a>

            <a href="?start=${page.number+1}">[下一页]</a>

            <a href="?start=${page.totalPages-1}">[末  页]</a>

    </div>

    <br>

    <form action="addCategory" method="post">

     

    name: <input name="name"> <br>

    <button type="submit">提交</button>

     

    </form>

</div>

步骤 12 : editCategory.jsp

editCategory.jsp 做编辑工作

<%@ page language="java" contentType="text/html; charset=UTF-8"

 pageEncoding="UTF-8" isELIgnored="false"%>

 

<div style="margin:0px auto; width:500px">

 

<form action="updateCategory" method="post">

 

name: <input name="name" value="${c.name}"> <br>

 

<input name="id" type="hidden" value="${c.id}">

<button type="submit">提交</button>

 

</form>

</div>

步骤 13 : application.properties

配置 jsp 作为视图
配置spring端口 为8080
配置 elastic链接地址为 127.0.0.1:9300

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

spring.mvc.view.prefix=/WEB-INF/jsp/

spring.mvc.view.suffix=.jsp

server.port=8080

spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

步骤 14 : 启动并测试

运行 Application.java 启动项目
接着访问地址:

http://127.0.0.1:8080/listCategory

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 15 : kibana

下面用 kibana 来查看数据。 和前面的 kibana 版本不同,要连接本教材的 elasticsearch 2.4.2 版本,需要用到下载区(点击进入)提供的 kibana 4.6.3 版本。

注: 如果启动了前面提供的 kibana 6.2.2 ,请记得关闭。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 16 : 启动 kibana 并访问

启动之后,如图所示,是看不到版本信息的。。
然后访问地址:

http://127.0.0.1:5601

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 17 : 选择索引

刚开始是没有选定索引的,所以要自己指定索引。
1. 把默认勾选的 Index contians time-based evens 去掉
2. 输入 how2java
3. 点击 Create 按钮

springboot整合 elasticsearch 做 增删改查 CRUD以及分页

步骤 18 : 查看数据

然后点击上面的Discover,就可以看到左边是当前的索引 :how2java. 右边就是数据了。。。

springboot整合 elasticsearch 做 增删改查 CRUD以及分页


上一篇:【mybatis-plus】CRUD必备良药,mybatis的好搭档


下一篇:深入理解JVM:5年crud经验,90%的人看完都说好