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