对于SpringBoot其实还是较为陌生,基本上靠网上的学习资源完成自学,所以这篇博客也就没有什么属于知识的范畴,仅仅只是收集和查阅资料后详细注解整合在一起的代码罢了。废话不多说,这篇仅仅只是记录下学习成果。
首先创建SpringBoot项目,我是使用的IDEA软件,Eclipse软件应该和这个相似。
-------------------------------------------关于Spring篇-----------------------------------------------------
关于mybatis+maven基本知识掌握总结
maven中spring+springmvc+mybatis整合详细配置
SpringBoot+Mybatis+Redis基础配置
Vue+Mysql+SpringBoot简单增删改查
以上就是创建springboot项目的步骤,其实百度上一大推,没什么技术难度。
创建出来的项目路径你是不能改的,否则springboot会无法识别,报异常。
项目结构:
那个conf包和webapp是我自己创建的包,如果创建没有这两个是正确的。
首先讲讲个人对于springboot的理解吧!
如果学习springboot之前对其他框架有一定了解,那么这个应该并没有什么难度,从一开始的xml配置到properties或yml文件配置,搭配java文件的配置来实现。我们从最早的mybatis讲起,最开始的mybatis的配置是一大堆的xml,如下例子:
以mybatis-config.xml文件为例
再到application.properties配置,以下为例:
#mybatis
#mybatis-config.xml配置文件的路径
#mybatis.configLocation=classpath:mybatis-config.xml
#SQL语句映射文件
#mybatis.mapper-locaitons= classpath*:com/example/mapper/*.xml
mybatis.mapper-locations=classpath*:mapper/*.xml
# 类的别名的包
mybatis.type-aliases-package=com.example.model
#驼峰命名法
mybatis.configuration.mapUnderscoreToCamelCase=true
#允许返回多个结果集
mybatis.configuration.multipleResultSetsEnabled=true
#使用jdbc的getGeneratedKeys获取数据库自增主键值
mybatis.configuration.useGeneratedKeys=true
#日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#延迟加载总开关( 查询时,关闭关联对象即时加载以提高性能)
mybatis.configuration.lazyLoadingEnabled=false
#侵入懒加载,设置为false则按需加载,否则会全部加载
mybatis.configuration.aggressiveLazyLoading=false
#pagehelper分页插件配置
pagehelper.helperDialect=mysql
#启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
pagehelper.reasonable=true
#设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用
pagehelper.offset-as-page-num=true
#设置为true时,使用RowBounds分页会进行count查询
pagehelper.row-bounds-with-count=true
就像键值对一样,简化了繁杂的xml代码,留下最为重要的代码,你可以尽情尝试mybatis在xml里能配置的,properties也能配置。
而yml文件也非常相似,因为个人习惯,所以用的properties,不过yml文件其实更加简便。
而以前的applicationContext.xml配置中
不过个人觉得能偷懒就偷懒,就用了properties配置。
因为使用了的是c3p0连接池,所以为了好区分,我重新写了一个以application-c3p0.properties文件,利用@PropertySource("classpath:c3p0.properties")来识别这个文件。
用来读取配置文件,只要以application-*命名的文件,利用classpath输入你命名的文件,就可以识别了。
不过使用c3p0连接池还需要一些配置,这句xml配置:
你需要DataSoruceConfig.java配置
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.core.env.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
/**
* @ClassName DataSourceConfig
* @Description TODO
* @Author lisonglin
* @Date 2019/1/13 15:53
* @Version 1.0
*/
@Configuration //声明为配置类,相当于标签
//加上这个注解,使得支持事务
@EnableTransactionManagement
public class DataSourceConfig {
@Value(value = "${mybatis.type-aliases-package}")
private String typeAliasesPackage;
@Autowired
private Environment env;
@Bean(name = "dataSource") //对象及名称,相当于标签
@Primary //优先注入
//属性注入,将配置中的c3p0注入
@ConfigurationProperties(prefix = "c3p0")
public DataSource createDataSource(){
return DataSourceBuilder.create() // 创建数据源构建对象
.type(ComboPooledDataSource.class) // 设置数据源类型
.build(); // 构建数据源对象
}
}
其中的@ConfigurationProperties注解,其实是根据spring.datasource为开头的配置,相当于你在前面加了前缀,key值需要以这个来识别。
##数据库c3p0
spring.datasource.c3p0.jdbcUrl=mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.c3p0.user=root
spring.datasource.c3p0.password=123456
spring.datasource.c3p0.driverClass=com.mysql.jdbc.Driver
然后就是一些c3p0的连接池管理配置
##连接池大小管理
#连接池中保留的最小连接数。Default:3(规范值:20,可根据系统链路总体性能进行更改)
spring.datasource.c3p0.minPoolSize=2
#连接池中保留的最大连接数。Default:15(规范值:100~500之间,可根据系统链路总体性能进行更改)
spring.datasource.c3p0.maxPoolSize=10
##连接池的大小和连接的生存时间管理规范
##连接的最大空闲时间,单位秒,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。Default:0(规范值:120,无特殊情况不建议修改)
spring.datasource.c3p0.maxIdleTime=120
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3(规范值:5,无特殊情况不建议修改)
spring.datasource.c3p0.acquireIncrement=3
#初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default:3(规范值:20,可根据系统链路总体性能进行更改)
spring.datasource.c3p0.initialPoolSize=3
##重连接相关规范
##从数据库获取新连接失败后重复尝试的次数。Default:30
spring.datasource.c3p0.acquireRetryAttempts=30
##两次连接中间隔时间,单位毫秒。Default:1000
spring.datasource.c3p0.acquireRetryDelay=1000
spring.datasource.c3p0.breakAfterAcquireFailure=false
spring.datasource.c3p0.testConnectionOnCheckout=false
##当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default:0(不建议此配置使用)
#spring.datasource.c3p0.checkoutTimeout=0
##配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待 它close再断开。配置为0的时候则不会对连接的生存时间进行限制。(规范值:0,除非使用其他类型数据库)
spring.datasource.c3p0.maxConnectionAge=0
##配置PreparedStatement缓存规范
#连接池为数据源缓存的PreparedStatement的总数。default: 0
spring.datasource.c3p0.maxStatements=1000
##定义了连接池内单个连接所拥有的最大缓存statements数。Default:0(规范值:5,无特殊情况不建议修改)
spring.datasource.c3p0.maxStatementsPerConnection=5
##配置连接测试
##SQL检测语句。Default:null
spring.datasource.c3p0.preferredTestQuery=SELECT SYSDATE FROM DUAL
##用来配置测试空闲连接的间隔时间,单位秒。测试方式还是上面的两种之一,因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,为0则不测试。Default:0
spring.datasource.c3p0.idleConnectionTestPeriod=120
##c3p0是异步操作的,缓慢的JDBC操作通过进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default:3
spring.datasource.c3p0.numHelperThreads=3
上面讲到mybatis配置,里面是有日志配置的。
#日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
当然你也可以使用springboot自带的日志,不过我还是使用熟悉的配置来吧。
在这之前,需要进行pom.xml一定引入。
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j
1.3.8.RELEASE
还利用log4j.properties配置
#---- global logging configuration
#---- level: FATAL,ERROR,WARN,INFO,DEBUG
#---- appender: console, file, mail
### set log levels ###
log4j.rootLogger = INFO,console
### 输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = ${webapp.root}/WEB-INF/logs/platform.log
log4j.appender.file.DatePattern=_yyyyMMdd'.log'
#log4j.appender.file.Append = true
#log4j.appender.file.Threshold = INFO
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
### 打印SQL ###
#log4j.logger.com.ibatis=DEBUG
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG
#配置logger扫描的包路径 这样才会打印sql
log4j.logger.com.yx.gw.mapper=DEBUG
关于POJO无法扫描到对应的Mapper文件,使@Autowired注解失去效用,虽然并不影响程序运行,但是这碍眼的感叹号,还是很难受。
几近百度,发现他们的代码同样也是具有这个问题,经过好几天的查询和尝试,这个问题得以解决。
以MybatisMapperScannerConfig.java配置
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName MyBatisMapperScannerConfig
* @Description TODO
* @Author lisonglin
* @Date 2019/2/9 17:51
* @Version 1.0
*/
@Configuration
@AutoConfigureAfter(DataSourceConfig.class)//init时指定先后顺序,这里是数据源在mybatis之前配置
public class MyBatisMapperScannerConfig {
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//指定xml配置文件的路径
mapperScannerConfigurer.setBasePackage("com.example.mapper");
return mapperScannerConfigurer;
}
}
最重要的一点出现了,还需要@Component注解注入POJO,在com.example.mapper包下的mapper接口类中加上@Component这个就解决问题。
ReidsConfig.java配置
@Configuration
// 必须加,使配置生效
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//使用jackson2替换掉redietempalte本身的序列化
Jackson2JsonRedisSerializer
测试类
package com.example.test;
import com.example.Application;
import com.example.model.Category;
import com.example.util.SerializeUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class DemoApplicationTests {
//字符串存储
@Autowired
private StringRedisTemplate stringRedisTemplate;
//对象存储
@Autowired
private RedisTemplate redisTemplate;
@Test
public void contextLoads() {
Category category=new Category();
category.setId(10);
category.setName("gfs");
String serial = SerializeUtil.serial(category);
redisTemplate.opsForHash().put("id:","name:",serial);
System.out.println(redisTemplate.getKeySerializer());
System.out.println(redisTemplate.getValueSerializer());
String obj = (String)redisTemplate.opsForHash().get("id:", "name:");
System.out.println(obj);
Category category1= (Category)SerializeUtil.deserial(obj);
System.out.println(category1);
System.out.println(redisTemplate.opsForHash().hasKey("id:", "name:"));
}
}
redis的properties配置
#redis
#集群模式
#spring.redis.cluster.nodes=115.xxx.xx.xxx:7000,115.xxx.xx.xxx:7001,...,111.xxx.xxx.xx:7008
#spring.redis.cluster.max-redirects=3
#单机模式
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.timeout=10000
# redis连接池配置
#连接超时时间(毫秒)
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=20
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=3000ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=5
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
以上代码均上传百度云,百度云连接:链接:https://pan.baidu.com/s/16IfdY-KmxBSJGbsSEO-yCg
提取码:2uq0
记录完毕!
欢迎大家支持我!有稳定收入的各位可以支持一下,谢谢,支付宝二维码!