SpringBoot+Mybatis+Redis基础配置

对于SpringBoot其实还是较为陌生,基本上靠网上的学习资源完成自学,所以这篇博客也就没有什么属于知识的范畴,仅仅只是收集和查阅资料后详细注解整合在一起的代码罢了。废话不多说,这篇仅仅只是记录下学习成果。

首先创建SpringBoot项目,我是使用的IDEA软件,Eclipse软件应该和这个相似。

-------------------------------------------关于Spring篇-----------------------------------------------------

关于mybatis+maven基本知识掌握总结

maven中spring+springmvc+mybatis整合详细配置

SpringBoot+Mybatis+Redis基础配置

Vue+Mysql+SpringBoot简单增删改查

1.选择create new project

 2.选择左侧选项Spring Inltlalizr,右侧的SDK选择自己的JDK版本,其余不动。

3.在group和arifact填写对应图片提示信息。

4.进入这一步,只需要选择需要的模块。

5.最后创建项目名和项目路径。

以上就是创建springboot项目的步骤,其实百度上一大推,没什么技术难度。

创建出来的项目路径你是不能改的,否则springboot会无法识别,报异常。

项目结构:

那个conf包和webapp是我自己创建的包,如果创建没有这两个是正确的。

首先讲讲个人对于springboot的理解吧!

Mybatis配置

如果学习springboot之前对其他框架有一定了解,那么这个应该并没有什么难度,从一开始的xml配置到properties或yml文件配置,搭配java文件的配置来实现。我们从最早的mybatis讲起,最开始的mybatis的配置是一大堆的xml,如下例子:

以mybatis-config.xml文件为例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置全局属性 -->
    <settings>
        <!--允许返回多个结果集-->
        <setting name="multipleResultSetsEnabled" value="true"></setting>
        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
        <setting name="useGeneratedKeys" value="true" />
        <!-- 使用列别名替换列名 默认:true -->
        <setting name="useColumnLabel" value="true" />
        <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <!--二级缓存开关-->
        <setting name="cacheEnabled" value="true"></setting>
        <!--允许返回多个结果集-->
        <setting name="multipleResultSetsEnabled" value="true"></setting>
        <!--日志-->
        <setting name="logImpl" value="LOG4J"></setting>
        <!-- 延迟加载总开关( 查询时,关闭关联对象即时加载以提高性能) -->
        <setting name="lazyLoadingEnabled" value="false"/>
        <!-- 侵入懒加载,设置为false则按需加载,否则会全部加载 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时-->
        <setting name="defaultStatementTimeout" value="25000" />
    </settings>
    <!-- mybatis分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
</configuration>

再到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配置中<beans><bean></bean></beans>用到了@Configuration、@Bean注解替换,想要进行之前xml配置使用java代码就可以实现,比如连接数据库的配置也是可以利用java代码实现,就像回到基础实现而已。

不过个人觉得能偷懒就偷懒,就用了properties配置。

C3P0连接池配置

因为使用了的是c3p0连接池,所以为了好区分,我重新写了一个以application-c3p0.properties文件,利用@PropertySource("classpath:c3p0.properties")来识别这个文件。

@PropertySource

用来读取配置文件,只要以application-*命名的文件,利用classpath输入你命名的文件,就可以识别了。

不过使用c3p0连接池还需要一些配置,这句xml配置:

<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
 </bean>

你需要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   //声明为配置类,相当于<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(); // 构建数据源对象
    }

}

其中的@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一定引入。

        <!--日志-->
        <!-- 忽略自带的日志框架. -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.8.RELEASE</version>
        </dependency>

还利用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

@Autowired注解无法扫描到Mapper文件问题

关于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这个就解决问题。

Reids的简单实现

ReidsConfig.java配置

@Configuration
// 必须加,使配置生效
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {

    @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;
    }

测试类

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 
记录完毕!

欢迎大家支持我!有稳定收入的各位可以支持一下,谢谢,支付宝二维码!

猜你喜欢

转载自blog.csdn.net/qq_41520636/article/details/87192263