1. 程式人生 > >springboot整合rabbitmq+redis+mybatis一套帶走

springboot整合rabbitmq+redis+mybatis一套帶走

springboot整合單個到處都是 但是整合一整套, 你只能在我這看到 一致關注csdn 但是從來沒有寫過部落格, 因為自己也遇到過各種問題,強大的荷爾蒙爆發,為大家整理一套簡單的思路,就此把第一次先給你們, 關注小博 抓緊上車 後續更露骨,更精彩!

首先我們縷一縷思路 開發工具idea+java8+maven

1,建立springboot工程

2,建立mysql表

3,新增配置和依賴

4,建立demo跑起來over

1、建立sprintboot工程

1.1建立新的工程

1.2如果你需要建立一個web工程選擇war

1.3你搜索你需要整合的包這裡我們選擇web,mysql+jdbc+mybatis,redis,rabbitMQ

1.4選擇你需要建立的工程位置


2、建表

這裡運用的是navicat12 個人覺得這個版本比較好用 破解版到處都是大家可以問度娘


3、新增配置和依賴

3.1 maven依賴 請注意有些版本的問題導致專案無法啟動

     3.1.1添加了hutool包 個人覺得hutool的包非常的好用 可以一起探討

     3.1.2 alibaba的fastjson包  apache的lang3包

     3.1.3 pagehelper 分頁外掛

     3.1.4 mybatis 自動生成程式碼外掛

<?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.fang.rabbitmq</groupId>
    <artifactId>springboot-rabbitmq-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot-rabbitmq-demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-parameter-names</artifactId>
        </dependency>
        <!-- 分頁外掛 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- alibaba的druid資料庫連線池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!--<version>RELEASE</version>-->
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- mybatis generator 自動生成程式碼外掛 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

3.1.5 application.properties的配置

spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/fang
spring.datasource.druid.username=root
spring.datasource.druid.password=root

spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672

#對映路徑
mybatis.mapper-locations=classpath:mapper/*.xml
#sql對應的實體
mybatis.type-aliases-package=com.fang.rabbitmq.springboot.rabbitmq.demo.*

#pageHelper分頁外掛
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

# REDIS (RedisProperties)
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=127.0.0.1
# Redis伺服器連線埠
spring.redis.port=6379
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=1
# 連線池中的最大空閒連線
spring.redis.jedis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.jedis.pool.min-idle=0
# 連線超時時間(毫秒)
#spring.redis.timeout=0

3.1.6 在resources下建立generatorConfig.xml自動生成mysql相關程式碼的配置(dao,mapper,實體)

    配置pom.xml中generator 外掛所對應的配置檔案 ${basedir}/src/main/resources/generator/generatorConfig.xml

    值得注意的是 很多人的程式碼生成一直不成功!下面的配置一定要選擇自己電腦上的配置 懂者自懂

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 資料庫驅動:選擇你的本地硬碟上面的資料庫驅動包E:\developer\mybatis-generator-core-1.3.2\lib\mysql-connector-java-5.1.25-bin.jar -->
    <classPathEntry  location="C:\Users\fanglingxiao\.m2\repository\mysql\mysql-connector-java\5.1.35\mysql-connector-java-5.1.35.jar"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>
        <!--資料庫連結URL,使用者名稱、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1/fang" userId="root" password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.fang.rabbitmq.springboot.rabbitmq.demo.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成對映檔案的包名和位置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.fang.rabbitmq.springboot.rabbitmq.demo.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是資料庫中的表名或檢視名 domainObjectName是實體類名-->
        <table tableName="user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

有人有疑問 如何執行這個 自動生成程式碼外掛 !寶貝 問得好 接下來就是說到這個

如果你問我為啥有kobe的背景圖沒錯我是一個kebe的忠實粉絲如果你也想有這樣的操作 ,當然很簡單 下載一個idea背景外掛就好了,想要什麼圖你都可以擁有,別上班期間流鼻血就行,具體的我就不說了,繼續幹正事

需要加一個命令mybatis-generator:generate -e 命令去執行

接下來就是執行

注意一張表不能執行多次!!!mapper的對映檔案只能有一份,否則會報錯的 切記!!!

看一下程式碼結構

對於sql的黃色背景對於有強迫症的我實在受不了 解決方案

本人覺得自動生成的檔案就無需cv大法到這了


4、建立demo跑起來

RabbitMQConfig配置rabbitmq訊息佇列

package com.fang.rabbitmq.springboot.rabbitmq.demo;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    public final static String QUEUE_NAME = "spring-boot-queue";
    public final static String EXCHANGE_NAME = "spring-boot-exchange";
    public final static String ROUTING_KEY = "spring-boot-key";

    // 建立佇列
    @Bean
    public Queue queue() {
        return new Queue(QUEUE_NAME);
    }

    // 建立一個 topic 型別的交換器
    @Bean
    public TopicExchange exchange() {
        return new TopicExchange(EXCHANGE_NAME);
    }

    // 使用路由鍵(routingKey)把佇列(Queue)繫結到交換器(Exchange)
    @Bean
    public Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("127.0.0.1", 5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        return new RabbitTemplate(connectionFactory);
    }

}

ProducerController

    訪問http://localhost:8080/sendMessage 通過10條執行緒充當 生產者 向繫結的交換機發送訊息

    訪問http://localhost:8080/getList 獲取列表,

package com.fang.rabbitmq.springboot.rabbitmq.demo.controller;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.lang.Console;
import com.fang.rabbitmq.springboot.rabbitmq.demo.RabbitMQConfig;
import com.fang.rabbitmq.springboot.rabbitmq.demo.entity.User;
import com.fang.rabbitmq.springboot.rabbitmq.demo.service.Consumer;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ProducerController {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private Consumer consumer;

    @GetMapping("/sendMessage")
    public Object sendMessage() {

        List<Thread> list = new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            Thread t = new Thread(()->{
                String value = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
                Console.log("send message {}", value);
                rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_KEY, value);
            });
            list.add(t);
        }
        list.forEach(Thread::start);

        return "ok";
    }

    @GetMapping("/getList")
    @ResponseBody
    public List<User> getList(){
        List<User> list = consumer.getList();
        return list;
    }
}

Consumer.java

如果訊息不為空,充當消費者接收到訊息 就刪除redis中的資料

注意下我用StringRedisTemplate是因為redis視覺化工具編碼的問題不會亂碼 正常使用RedisTemplate

呼叫getList()方法給redis以key為USER設定value為list的json字串

這個時候一切的配置都已經完成了  下面就執行演示咋們的成果吧

package com.fang.rabbitmq.springboot.rabbitmq.demo.service;

import cn.hutool.core.lang.Console;
import com.alibaba.fastjson.JSONObject;
import com.fang.rabbitmq.springboot.rabbitmq.demo.RabbitMQConfig;
import com.fang.rabbitmq.springboot.rabbitmq.demo.dao.UserMapper;
import com.fang.rabbitmq.springboot.rabbitmq.demo.entity.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.List;

@Component
@Service
public class Consumer {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private StringRedisTemplate redisTemplate;
    public static final String USER_KEY="USER";

    @RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
    public void consumeMessage(String message) {
        if (StringUtils.isNotBlank(message)){
            User user = new User();
            user.setUserName("fanglingxiao");
            user.setUserPassword("123");
            user.setUserRealName("fanglingxiao");
            user.setUserRole("管理員");
            userMapper.insert(user);
            String s = redisTemplate.opsForValue().get(USER_KEY);
            if (StringUtils.isNotBlank(s)){
                redisTemplate.delete(USER_KEY);
            }
        }
        Console.log("consume fang message {}", message);
    }

    public List<User> getList() {
        List<User> users = userMapper.selectAllUser();
        String jsonString = JSONObject.toJSONString(users);
        redisTemplate.opsForValue().set(USER_KEY,jsonString);
        return users;
    }
}

1、可以看到已經執行成功 很多人都用postman/谷歌外掛/小么雞 等等,這個時候有人要噴了吧,這麼垃圾用網頁訪問,你個菜雞程式設計師跑來寫部落格 ,鬼刀一開,走位走位,就很皮打不著我,只是工具用來演示而已,在這裡只需要看到結果就行 習慣用哪個還是看個人希望可以幫到你

2、我們的控制檯已經看到日誌的列印

3、我們的資料庫 十條已經加進來了

4、redis確認沒有值

當我們執行http://localhost:8080/getList 也正常的運行了

1

2、redis已經新增進來了 redis中如果key值存在是直接覆蓋的 

所以整合到此藉此測試完成!希望可以幫到你們 ,當然我也是一個菜鳥,如果有說的不好或者寫的不好的地方 歡迎來指出我的不足,幫助大家的同時,相互討論也是彼此的成長!一起加油吧