基础配置
application.properties
#热部署
#开启
spring.devtools.restart.enabled=true
#监听目录
spring.devtools.restart.additional-paths=src/main/java
#mybatis
#mybatis-config.xml配置文件的路径
#mybatis.configLocation=classpath:mybatis-config.xml
#SQL语句映射文件
#mybatis.mapper-locaitons= classpath*:com/example/mapper/*.xml
mybatis.mapper-locations=classpath*:com/example/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
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=20
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=1000
application-c3p0.properties
##数据库c3p0
spring.datasource.c3p0.jdbcUrl=mysql://localhost:3306/how2java?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.c3p0.user=root
spring.datasource.c3p0.password=123
spring.datasource.c3p0.driverClass=com.mysql.jdbc.Driver
##连接池大小管理
#连接池中保留的最小连接数。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
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
DateFormatConfig
package com.example.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.RecursiveTask;
/**
* 全局日期json格式化
*
* @ClassName DateFormatConfig
* @Description TODO
* @Author lisonglin
* @Date 2019/2/13 15:29
* @Version 1.0
*/
@JsonComponent
public class DateFormatConfig {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 日期格式化
*/
public static class DateJsonSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(dateFormat.format(date));
}
}
/**
* 解析日期字符串
*/
public static class DateJsonDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
try {
return dateFormat.parse(jsonParser.getText());
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
}
DataSourceConfig
package com.example.config;
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 //声明为配置类,相当于<beans>标签
//加上这个注解,使得支持事务
@EnableTransactionManagement
public class DataSourceConfig {
@Value(value = "${mybatis.type-aliases-package}")
private String typeAliasesPackage;
@Autowired
private Environment env;
@Bean(name = "dataSource") //对象及名称,相当于<bean>标签
@Primary //优先注入
//属性注入,将配置中的c3p0注入
@ConfigurationProperties(prefix = "c3p0")
public DataSource createDataSource(){
return DataSourceBuilder.create() // 创建数据源构建对象
.type(ComboPooledDataSource.class) // 设置数据源类型
.build(); // 构建数据源对象
}
}
RedisConfiguration
package com.example.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import java.time.Duration;
/**
* @ClassName RedisConfiguration
* @Description TODO
* @Author lisonglin
* @Date 2019/1/14 17:46
* @Version 1.0
*/
@Configuration
// 必须加,使配置生效
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
/**
* 1.x配置方式
*/
// @Bean
// public CacheManager cacheManager(RedisTemplate redisTemplate) {
// RedisCacheManager cacheManager= new RedisCacheManager(redisTemplate);
// cacheManager.setDefaultExpiration(60);
// Map<String,Long> expiresMap=new HashMap<>();
// expiresMap.put("Product",5L);
// cacheManager.setExpires(expiresMap);
// return cacheManager;
// }
/**
* 选择redis作为默认缓存工具
* 2.0x配置方式
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(10)); // 设置缓存有效期10秒
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(factory))
.cacheDefaults(redisCacheConfiguration).build();
}
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//使用jackson2替换掉redietempalte本身的序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
//利用Jackson 使用 defaultTyping 实现通用的序列化和反序列化
ObjectMapper om = new ObjectMapper();
//指定要序列化的域,field,get和set,以及修饰符范围,ANY包括public和private
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//指定序列化输入类型,必须是非final修饰
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置redisTemplate
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
//配置连接工厂
template.setConnectionFactory(redisConnectionFactory);
//指定序列化模式
template.setKeySerializer(jackson2JsonRedisSerializer); // key序列化
template.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
template.setHashKeySerializer(jackson2JsonRedisSerializer);// Hash key序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
template.afterPropertiesSet();
// 开启事务
template.setEnableTransactionSupport(true);
template.setConnectionFactory(redisConnectionFactory);
return template;
}
/**
* 实例化 HashOperations 对象,可以使用 Hash 类型操作
*
* @param redisTemplate
* @return
*/
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
/**
* 实例化 ValueOperations 对象,可以使用 String 操作
*
* @param redisTemplate
* @return
*/
@Bean
public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
/**
* 实例化 ListOperations 对象,可以使用 List 操作
*
* @param redisTemplate
* @return
*/
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
/**
* 实例化 SetOperations 对象,可以使用 Set 操作
*
* @param redisTemplate
* @return
*/
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
/**
* 实例化 ZSetOperations 对象,可以使用 ZSet 操作
*
* @param redisTemplate
* @return
*/
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}