一、整合Mybatis及事务
(1)加入依赖<!-- 引入starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
<scope>runtime</scope>
</dependency>
<!-- MySQL的JDBC驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 引入第三方数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
(2)加入配置文件
#mybatis.type-aliases-package=net.xdclass.base_project.domain
#可以自动识别
#spring.datasource.driver-class-name =com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
#如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#驼峰命名转换
mybatis.configuration.mapUnderscoreToCamelCase=true
#控制台打印sql语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
(3)启动类增加注解扫描
mapper@MapperScan("com.neusoft.mapper")
(4)mapper接口开发
public interface UserMapper {
//推荐使用#{}取值,不要用${},因为存在注入的风险
@Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name}, #{phone}, #{createTime},#{age})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")//获取自增id
int insert(User user);
@Select("SELECT * FROM user")
List<User> getAll();
//开启驼峰命名转换可省略@Results注解中的字段映射
@Select("SELECT * FROM user WHERE id = #{id}")
//@Results({@Result(column = "create_time",property = "createTime")})
User findById(Long id);
}
(5)业务逻辑层调用略
sql脚本如下
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL COMMENT '名称',
`phone` varchar(16) DEFAULT NULL COMMENT '用户手机号',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`age` int(4) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
(6)mapper开发语法参考
http://www.mybatis.org/mybatis-3/zh/java-api.html
(7)mybatis之事务处理
//service逻辑层引入事务
@Transantional(propagation=Propagation.REQUIRED)
(8)常见的传播行为
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起, 两个事务之间没有关系,一个异常,一个提交,不会同时回滚
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常
二、整合JPA
JPA全称Java Persistence API.JPA,通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。jpa在复杂查询的时候性能不是很好
(1)添加相关依赖
<!-- JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL的JDBC驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 引入第三方数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
(2)配置文件
#=========MySQL配置=========
spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
spring.datasource.username =root
spring.datasource.password =root
##如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#=========JPA配置=========
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
(3)创建实体类
@Entity
public class User {
@Id
@GeneratedValue
private Integer id;
@Column
private String name;
@Column
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
(4)Dao层
public interface UserDao extends JpaRepository<User, Integer> {
}
(5)Web层@RestController
public class IndexController {
@Autowired
private UserDao userDao;
@RequestMapping("/index")
public User index(Integer id) {
return userDao.findOne(id);
}
}
三、整合Redis
(1)redis在线测试工具:http://try.redis.io/redis window版点击下载解压直接运行redis-server.exe即可,下载地址:https://github.com/MicrosoftArchive/redis/releases
redis教程及Linux版安装点击跳转见博客https://blog.youkuaiyun.com/zhou870498/article/details/79904475
(2)springboot整合redis相关依赖引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(3)相关配置文件配置
#=========redis基础配置=========
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#如果有密码
spring.redis.password=
# 连接超时时间 单位 ms(毫秒)
spring.redis.timeout=3000
#=========redis线程池设置=========
# 连接池中的最大空闲连接,默认值也是8。
spring.redis.jedis.pool.max-idle=200
#连接池中的最小空闲连接,默认值也是0。
spring.redis.jedis.pool.min-idle=200
# 如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.jedis.pool.max-active=2000
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
spring.redis.jedis.pool.max-wait=1000
(4)redistemplate操作redis
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate redisTpl;
@RequestMapping("testRedis")
public Object index(){
redisTpl.opsForValue().set("name","xiaoLuo");
String name = redisTpl.opsForValue().get("name");
return name;
}
}
四、整合Elasticsearch
(1)整合步骤①SpringBoot整合elasticsearch版本说明:
https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix
②添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
③配置文件:
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.repositories.enabled=true
④新建实体对象article,加上注解 @Document(indexName = "blog", type = "article")
示例:
@Document(indexName = "blog", type = "article")
public class Article implements Serializable{
private static final long serialVersionUID = 1L;
private long id;
private String title;
private String summary;
private String content;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
⑤接口继承ElasticSearchRepository,里面有很多默认实现
示例:
@Component
public interface ArticleRepository extends ElasticsearchRepository<Article, Long> {
}
⑥调用示例
@RestController
public class ArticleController {
@Autowired
private ArticleRepository articleRepository;
@GetMapping("save")
public Object save(long id,String title){
Article article = new Article();
article.setId(id);
article.setContent("springboot整合elasticsearch");
article.setTitle(title);
article.setSummary("搜索框架整合");
articleRepository.save(article);
return "ok";
}
@GetMapping("search")
public Object search(String title){
//QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //搜索全部文档
QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", title);
Iterable<Article> list = articleRepository.search(queryBuilder);
return JsonData.buildSuccess(list);
}
}
(2)QueryBuilder复杂条件查询使用
https://www.elastic.co/guide/en/elasticsearch/client/java-api/1.3/query-dsl-queries.html
(3)更多教程参见本博客 elasticsearch系列
五、整合ActiveMQ
window下载地址:点击打开链接windows版下载解压运行bin/win64文件夹下的activemq.bat
访问地址:http://127.0.0.1:8161/
1.点对点消息(p2p)
①添加依赖
<!-- 整合消息队列ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- 如果配置线程池则加入 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
②配置文件
#=========ActiveMQ=========
spring.activemq.broker-url=tcp://127.0.0.1:61616
#集群配置
#spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=100
③springboot启动类添加注解
@EnableJms,开启支持jms
④生产者:生产消息
public interface ProducerService {
/**
* 功能描述:指定消息队列,还有消息
* @param destination
* @param message
*/
public void sendMessage(Destination destination, final String message);
}
@Service
public class ProducerServiceImpl implements ProducerService {
@Autowired
private JmsMessagingTemplate jmsTemplate; //用来发送消息到broker的对象
//发送消息,destination是发送到的队列,message是待发送的消息
@Override
public void sendMessage(Destination destination, String message) {
jmsTemplate.convertAndSend(destination, message);
}
}
⑤消费者:实时监听对应的队列
@Component
public class OrderConsumer {
@JmsListener(destination="order.queue")
public void receiveQueue(String text){
System.out.println("OrderConsumer收到的报文为:"+text);
}
}
⑥调用
@RestController
@RequestMapping("/api/v1")
public class OrderController {
@Autowired
private ProducerService producerService;
@GetMapping("order")
public Object order(String msg){
Destination destination = new ActiveMQQueue("order.queue");
producerService.sendMessage(destination, msg);
return "ok";
}
}
2.发布订阅消息(pub/sub)
①添加依赖同点对点
②配置文件
#=========ActiveMQ=========
spring.activemq.broker-url=tcp://127.0.0.1:61616
#集群配置
#spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=100
#添加支持发布订阅模型,默认只支持点对点
spring.jms.pub-sub-domain=true
③启动类
@EnableJms
@SpringBootApplication
public class TestActivemqApplication {
public static void main(String[] args) {
SpringApplication.run(TestActivemqApplication.class, args);
}
//主题对象交给spring管理
@Bean
public Topic topic(){
return new ActiveMQTopic("video.topic");
}
}
④生产者
public interface ProducerService {
/**
* 功能描述:消息发布者
* @param msg
*/
void publish(String msg);
}
@Service
public class ProducerServiceImpl implements ProducerService {
@Autowired
private JmsMessagingTemplate jmsTemplate; //用来发送消息到broker的对象
@Autowired
private Topic topic;
@Override
public void publish(String msg) {
this.jmsTemplate.convertAndSend(this.topic, msg);
}
}
⑤消费者
@Component
public class TopicSub {
@JmsListener(destination="video.topic")
public void receive1(String text){
System.out.println("video.topic 消费者:receive1="+text);
}
@JmsListener(destination="video.topic")
public void receive2(String text){
System.out.println("video.topic 消费者:receive2="+text);
}
@JmsListener(destination="video.topic")
public void receive3(String text){
System.out.println("video.topic 消费者:receive3="+text);
}
}
⑥调用
@RestController
@RequestMapping("/api/v1")
public class TopicController {
@Autowired
private ProducerService producerService;
@GetMapping("topic")
public Object topic(String msg){
producerService.publish( msg);
return "ok";
}
}
3.点对点模式和发布订阅者模式共存需要添加或修改配置如下
①启动类中
//需要给topic定义独立的JmsListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
②订阅者中
//@JmsListener如果不指定独立的containerFactory的话是只能消费queue消息
@JmsListener(destination="video.topic", containerFactory="jmsListenerContainerTopic")
public void receive1(String text){
System.out.println("video.topic 消费者:receive1="+text);
}
③在配置文件里面,注释掉 #spring.jms.pub-sub-domain=true
六、整合Kafka
(1)在Linux或Windows安装运行Kafka自行百度(2)引入springboot-kafka的jar包依赖。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
(3)添加配置信息
spring.kafka.bootstrap-servers=127.0.0.1:9092
spring.kafka.consumer.group-id=myGroup
(4)创建生产者服务
package com.neusoft.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
@Component
public class ProviderService {
@Autowired
private KafkaTemplate<String,String> kafkaTemplate;
public void sender(String topic,String value){
kafkaTemplate.send(topic,value);
}
}
(5)创建消费者服务,开启监听
package com.neusoft.kafka;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class ConsumerService {
@Resource
private KafkaTemplate<String,String> kafkaTemplate;
@KafkaListener(topics = "mytopics")
public void consumer(String message){
System.out.println("======="+message);
}
}
(6)调用示例
package com.neusoft.controller;
import com.neusoft.kafka.ProviderService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class IndexController {
@Resource
private ProviderService providerService;
@RequestMapping("index")
public Object index(String name){
for (int i = 0; i < 5; i++) {
providerService.sender("mytopics",name+" test... "+i);
}
return "ok";
}
}
七、整合Logback日志框架
1.新日志框架LogBack介绍(1)常用处理java的日志组件 slf4j,log4j,logback,common-logging 等
(2)logback介绍:基于Log4j基础上大量改良,不能单独使用,推荐配合日志框架SLF4J来使用
logback当前分成三个模块:logback-core,logback-classic和logback-access;
(3)Logback的核心对象:
Logger:日志记录器
Appender:指定日志输出的目的地,目的地可以是控制台,文件
Layout:日志布局 格式化日志信息的输出
(4)日志级别:DEBUG < INFO < WARN < ERROR
===========log4j示例===========
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=D://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
===========logback============
(5)Log4j日志转换为logback在线工具(支持log4j.properties转换为logback.xml,不支持 log4j.xml转换为logback.xml)
https://logback.qos.ch/translator/
2.SpringBoot2.x整合Logback配置(见文件)
创建日志文件logback-spring.xml,官方推荐 -spring.xml结尾。默认加载加载配置顺序 logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
注释:
<configuration> 子节点
<appender></appender>
<logger></logger>
<root></root>(要加在最后)