springboot整合单个到处都是 但是整合一整套, 你只能在我这看到 一致关注csdn 但是从来没有写过博客, 因为自己也遇到过各种问题,强大的荷尔蒙爆发,为大家整理一套简单的思路,就此把第一次先给你们, 关注小博 抓紧上车 后续更露骨,更精彩!
首先我们缕一缕思路 开发工具idea+java8+maven
1,创建springboot工程
2,创建mysql表
3,添加配置和依赖
4,创建demo跑起来over
1、创建sprintboot工程
1.1创建新的工程
1.2如果你需要创建一个web工程选择jar(springboot集成tomcat) 下一步
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的映射文件只能有一份,否则会报错的 切记!!!
忘记说一个问题 自动生成mapper之后 启动会加载不了 是因为需要在UserMapper上加注解@Mapper 才能被加载进spring容器
或者配置@mapperScan
看一下代码结构
对于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值存在是直接覆盖的
所以整合到此借此测试完成!希望可以帮到你们 ,当然我也是一个菜鸟,如果有说的不好或者写的不好的地方 欢迎来指出我的不足,帮助大家的同时,相互讨论也是彼此的成长!一起加油吧