侧边栏壁纸
博主头像
程彬彬博主等级

业精于勤 荒于嬉 行成于思 毁于随

  • 累计撰写 101 篇文章
  • 累计创建 26 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录
ELK

springboot结合elasticsearch与mybatis-plus开发

程彬彬
2019-12-23 / 0 评论 / 0 点赞 / 2,569 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2019-12-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

一.项目搭建

1.pom.xml 引入

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bannad927</groupId>
    <artifactId>es</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>es</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.3</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

2.yml配置

spring:
  datasource:
      url: jdbc:mysql://127.0.0.1:3306/xxx?serverTimezone=Asia/Shanghai&useUnicode=true&useAffectedRows=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
      hikari:
        maximum-pool-size: 20
        minimum-idle: 5
  devtools:
    livereload:
      enabled: true
    restart:
      additional-paths: static/**
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
  elasticsearch:
    rest:
      uris: "http://192.168.33.88:9200"
server:
  port: 3333

3.logback-spring.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="true">
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--  这是是logstash服务器地址 端口-->
        <destination>192.168.33.88:7788</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp/>
                <version/>
                <message/>
                <loggerName/>
                <threadName/>
                <logLevel/>
                <callerData/>
            </providers>
        </encoder>
    </appender>

    <!--设置上下文名称:默认为"default" 会出现在控制台上-->
    <contextName>es</contextName>
    <!--输出到文件的路径-->
    <property name="log.path" value="logs" />


    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 过滤器设置输出的级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>DEBUG</level>
        </filter>

        <!--日志输出编码格式化-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 过滤器设置输出的级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径/文件夹名称-->
            <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>

        <encoder>
            <!--%d{HH: mm:ss.SSS}——日志输出时间
                %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
                %-5level——日志级别,并且使用5个字符靠左对齐
                %logger{36}——日志输出者的名字
                %msg——日志消息
                %n——平台的换行符
             -->
            <!--日志输出编码格式化-->
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

    </appender>

    <!--指定最基础的日志输出级别-->
    <root level="INFO">
        <!--appender将会添加到这个loger-->
        <appender-ref ref="console" />
        <appender-ref ref="stash"/>
        <appender-ref ref="file" />
    </root>

</configuration>

二.mybatis-plus

4.MybatisPlusConfig配置

@Configuration
@EnableTransactionManagement
@MapperScan("com.bannad927.es.mapper")
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        //你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制
        paginationInterceptor.setLimit(-1);
        return paginationInterceptor;
    }
}

5.AreaDetailMapper.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bannad927.es.mapper.AreaDetailMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.bannad927.es.entity.AreaDetail">
        <id column="id" property="id"/>
        <result column="contract_id" property="contractId"/>
        <result column="area_code" property="areaCode"/>
        <result column="floor" property="floor"/>
        <result column="room_num" property="roomNum"/>
        <result column="human_num" property="humanNum"/>
        <result column="construction_batch_code" property="constructionBatchCode"/>
        <result column="install_batch_code" property="installBatchCode"/>
        <result column="construction_cost" property="constructionCost"/>
        <result column="is_private" property="isPrivate"/>
        <result column="is_extra" property="isExtra"/>
        <result column="state" property="state"/>
        <result column="device_id" property="deviceId"/>
        <result column="operator" property="operator"/>
        <result column="is_del" property="isDel"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_time" property="createTime"/>
        <result column="washer_id" property="washerId"/>
        <result column="log_id" property="logId"/>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, contract_id, area_code, floor, room_num, human_num, construction_batch_code, install_batch_code, construction_cost, is_private, is_extra, state, device_id, operator, is_del, update_time, create_time, washer_id, log_id
    </sql>

    <select id="findByDeviceId" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_area_detail
        WHERE is_del = 0 AND device_id = #{deviceId}
    </select>

</mapper>

6.AreaDetailMapper

@Mapper
public interface AreaDetailMapper extends BaseMapper<AreaDetail> {

    /**
     * 根据设备id查询数据
     *
     * @param deviceId
     * @return
     */
    AreaDetail findByDeviceId(@Param("deviceId") Integer deviceId);

}

7.AreaDetailService

public interface AreaDetailService extends IService<AreaDetail> {


    Result insert(AreaDetail areaDetail);


    Result update(AreaDetail areaDetail);


    Result delete(Integer id);

    Result findById(Integer id);


    Result findByAll();


}

8.AreaDetailServiceImpl

@Service
public class AreaDetailServiceImpl extends ServiceImpl<AreaDetailMapper, AreaDetail> implements AreaDetailService {

    @Autowired
    AreaDetailMapper areaDetailMapper;


    @Override
    public Result insert(AreaDetail areaDetail) {
        return Result.getSuccessResult(areaDetailMapper.insert(areaDetail));
    }

    @Override
    public Result update(AreaDetail areaDetail) {
        return Result.getSuccessResult(areaDetailMapper.updateById(areaDetail));
    }

    @Override
    public Result delete(Integer id) {
        return Result.getSuccessResult(areaDetailMapper.deleteById(id));
    }

    @Override
    public Result findById(Integer id) {
        return Result.getSuccessResult(areaDetailMapper.selectById(id));
    }

    @Override
    public Result findByAll() {
        StopWatch watch = new StopWatch();
        watch.start();
        QueryWrapper<AreaDetail> queryWrapper = new QueryWrapper<>();
        Iterable<AreaDetail> all = areaDetailMapper.selectList(queryWrapper);
        watch.stop();
        long millis = watch.getTotalTimeMillis();
        return Result.getSuccessResult(all, String.valueOf(millis));
    }


}
@RestController
@RequestMapping("/areaDetail")
public class AreaDetailControllern {

    @Autowired
    private AreaDetailService areaDetailService;

    @RequestMapping("/insert")
    public Result insert(@RequestBody  AreaDetail areaDetail) {
        return areaDetailService.insert(areaDetail);
    }

    @RequestMapping("/update")
    public Result update(@RequestBody AreaDetail areaDetail) {
        return areaDetailService.update(areaDetail);
    }

    @RequestMapping("/delete")
    public Result delete(@RequestParam("id") Integer id) {
        return areaDetailService.delete(id);
    }


    @RequestMapping("/findById")
    public Result findById(@RequestParam("id")  Integer id) {
        return areaDetailService.findById(id);
    }

    @RequestMapping("/findByAll")
    public Result findByAll() {
        return areaDetailService.findByAll();
    }


}

10.校验数据 image.png image.png image.png image.png


三.elasticsearch

先配置同步 https://www.chengbinbin.cn//archives/logstashmysql

1.EsAreaDetail实体类

@Data
@Document(indexName = "t_area_detail", type = "_doc", useServerConfiguration = true, createIndex = false)
public class EsAreaDetail implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 流水号
     */
    @Id()
    private Integer id;

    /**
     * 合同ID
     */
    @Field(type=FieldType.Integer)
    private Integer contractId;

    /**
     * 地区码
     */
    @Field
    private String areaCode;

    /**
     * 楼层
     */
    @Field(type=FieldType.Integer)
    private Integer floor;

    /**
     * 宿舍号
     */
    @Field
    private String roomNum;

    /**
     * 宿舍人数
     */
    @Field(type=FieldType.Integer)
    private Integer humanNum;

    /**
     * 水电改造批次号(空为未改造)
     */
    @Field
    private String constructionBatchCode;

    /**
     * 安装批次号(空为未安装)
     */
    @Field
    private String installBatchCode;

    /**
     * 单间水电改造花费
     */
    @Field
    private BigDecimal constructionCost;

    /**
     * 是否私有?0:公有1:私有
     */
    @Field
    private Integer isPrivate;

    /**
     * 是否额外设备?0:非额外设备1:额外设备
     */
    @Field
    private Integer isExtra;

    /**
     * 状态0:正常1:禁用
     */
    @Field
    private Integer state;

    /**
     * 设备ID
     */
    @Field
    private Integer deviceId;

    @Field
    private Integer operator;

    /**
     * 是否删除?0:未删除1:已删除
     */
    @Field
    private Integer isDel;

    /**
     * 更新时间
     */
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Field
    private Date updateTime;

    /**
     * 创建时间
     */
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    @Field
    private Date createTime;

    @Field
    private Long washerId;

    @Field
    private Long logId;


}

2.Repository Dao

public interface AreaDetailRepository extends ElasticsearchRepository<EsAreaDetail, Integer> {
}

3.EsAreaDetailService

public interface EsAreaDetailService {

    Result insert(EsAreaDetail areaDetail);


    Result update(EsAreaDetail areaDetail);


    Result delete(Integer id);

    Result findById(Integer id);


    Result findByAll();
}

4.EsAreaDetailServiceImpl

@Service
public class EsAreaDetailServiceImpl implements EsAreaDetailService {


    @Autowired
    private AreaDetailRepository areaDetailRepository;

    @Override
    public Result insert(EsAreaDetail areaDetail) {
        return Result.getSuccessResult(areaDetailRepository.save(areaDetail));
    }

    @Override
    public Result update(EsAreaDetail areaDetail) {
        return Result.getSuccessResult(areaDetailRepository.save(areaDetail));
    }

    @Override
    public Result delete(Integer id) {
        areaDetailRepository.deleteById(id);
        return Result.getSuccessResult();
    }

    @Override
    public Result findById(Integer id) {
        Optional<EsAreaDetail> result = areaDetailRepository.findById(id);
        if (result.isPresent()) {
            return Result.getSuccessResult(result.get());
        }
        return Result.getFailResult("查无数据");
    }

    @Override
    public Result findByAll() {
        StopWatch watch = new StopWatch();
        watch.start();
        List<EsAreaDetail> areaDetailList = new ArrayList<>();
        Iterable<EsAreaDetail> areaDetailIterable = areaDetailRepository.findAll();
        areaDetailIterable.forEach(areaDetailList::add);
        watch.stop();
        long millis = watch.getTotalTimeMillis();
        return Result.getSuccessResult(areaDetailList, String.valueOf(millis));
    }
}
@RestController
@RequestMapping("/es/areaDetail")
public class EsAreaDetailControllern {

    @Autowired
    private EsAreaDetailService areaDetailService;

    @RequestMapping("/insert")
    public Result insert(@RequestBody  EsAreaDetail areaDetail) {
        return areaDetailService.insert(areaDetail);
    }

    @RequestMapping("/update")
    public Result update(@RequestBody EsAreaDetail areaDetail) {
        return areaDetailService.update(areaDetail);
    }

    @RequestMapping("/delete")
    public Result delete(@RequestParam("id") Integer id) {
        return areaDetailService.delete(id);
    }

    @RequestMapping("/findById")
    public Result findById(@RequestParam("id") Integer id) {
        return areaDetailService.findById(id);
    }

    @RequestMapping("/findByAll")
    public Result findByAll() {
        return areaDetailService.findByAll();
    }
}

6.校验数据 image.png image.png image.png

四.配置logstash日志查询

image.png

五.项目代码

https://github.com/learnr27/es

0
广告 广告

评论区