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值存在是直接覆盖的 

所以整合到此借此测试完成!希望可以帮到你们 ,当然我也是一个菜鸟,如果有说的不好或者写的不好的地方 欢迎来指出我的不足,帮助大家的同时,相互讨论也是彼此的成长!一起加油吧 

猜你喜欢

转载自blog.csdn.net/qq_41670021/article/details/82965905