SpringBoot常用配置
使用SpringBoot进行简单的单表查询
这是一个简单的入门案例。关于使用SpringBoot搭建项目并进行简单的单表查询。进行日志的记录,以及控制台日志的打印。
日志记录
在Demo使用lombok自带的Slf4j进行日志记录,并没有使用常见的log4j、log4j2或者logback。因为简单,Slf4j并不需要进行什么配置就可以使用。
使用@Slf4j注解标注在类上,使用log.info()或log.error()记录日志信息。
@Slf4j // 日志记录 注解
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public Map<String, Object> queryUserInfo(String userName) {
HashMap<String, Object> map = new HashMap<>();
// 记录日志信息
log.info("根据 用户名: {} 查询",userName);
List<RepUserInfoBean> userInfoBeans = testDao.selectUserInfo(userName);
map.put("user", userInfoBeans);
return map;
}
}
Mybatis常用设置
1.别名
mybatis:
type-aliases-package: com.test.model
2.xml文件路径
mybatis:
mapper-locations: classpath:/mappers/*
3.mybatis的反射工具类
将带下划线的数据库表字段映射到驼峰式的java bean中
mybatis:
# mybatis的反射工具类
configuration:
# 将下划线 自动转为 驼峰式
mapUnderscoreToCamelCase: true
<!-- 不需要使用ResultMap 直接进行映射 也可以通过@Select注解实现 -->
<select id="selectUserInfo" resultType="com.test.model.RepUserInfoBean">
select * from sys_user
where user_name like CONCAT ('%',#{userName},'%')
</select>
4.输出日志文件
指定日志文件的输出位置
- 日志文件所在目录不存在,则输出失败
- 指定的输出文件不存在,则会创建对应的文件并写入
- 指定的输出文件已存在,则写入对应的文件
指定输出日志文件路径
- [相对路径]
log/b.log 在项目的根路径下生成 logs目录/b.log日志文件 - [绝对路径]
E:/logs/b.log 指定生成文件具体位置
# 日志记录
logging:
level:
# 默认值
root: info
# 指定包名进行 debug 打印日志 (打印sql 方式1)
com.test: debug
# 指定日志输出文件位置 (不会级联创建不存在的目录,但会创建文件 日志文件存在则写入,不存在则创建后再写入)
file: logs/b.log
5.打印sql语句的两种方式
logging:
level:
# 打印sql 方式1 指定包名进行 debug 打印日志
com.test: debug
# 指定日志输出文件位置 (不会级联创建不存在的目录,但会创建文件 日志文件存在则写入,不存在则创建)
file: logs/b.log
mybatis:
type-aliases-package: com.test.model
mapper-locations: classpath:/mappers/*
# mybatis的反射工具类
configuration:
# 打印sql 方式2 StdOutImpl
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
方式1 指定包名 输出效果
方式2 StdOutImpl 输出效果
6.日期格式化
spring:
# 时区格式化
jackson:
time-zone: GMT+8 # 时区 东八区
date-format: yyyy-MM-dd HH:mm:ss # 日期格式
关于格式化的失效问题:
代码中添加拦截器二创建了一个配置类,该类继承了WebMvcConfigurationSupport!
springboot 2.0 前使用 WebMvcConfigurerAdapter,springboot 2.0 建议使用 WebMvcConfigurationSupport 。
但是在添加拦截器并继承 WebMvcConfigurationSupport 后会覆盖@EnableAutoConfiguration注解 关于WebMvcAutoConfiguration的配置!
从而导致所有的Date返回都变成时间戳。
可以采用另外一种方式,在你继承WebMvcConfigurationSupport的子类中添加日期转换的bean
@Configuration
public class MyConfigurer extends WebMvcConfigurationSupport{
@Autowired
HttpInterceptor httpInterceptor;
// 时间格式转换器
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
converter.setObjectMapper(mapper);
return converter;
}
// 转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//添加到转换器列表中 会转为 定义的格式
converters.add(jackson2HttpMessageConverter());
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// ** 代表 拦截所有一层或多层(即所有)
registry.addInterceptor(httpInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
输出日志
指定包名进行 debug 打印日志 会输出mybatis的sql日志
# 日志记录
logging:
level:
# 指定包名进行 debug 打印日志 (会输出mybatis的sql日志)
com.test: debug
Demo源码
Java Bean
package com.test.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* Author:steven
* Date:2019-12-12 21:52
* Description:出参
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RepUserInfoBean implements Serializable {
private static final long serialVersionUID = 2888259278849526687L;
private Long userId;
private String userName;
private String loginName;
private String password;
private String phone;
private Integer isValid;
private Date registerDate;
}
Controller
package com.test.controller;
import com.test.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* Author:steven
* Date:2019-12-12 21:16
* Description:<描述>
*/
@Slf4j
@RestController
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/findByName")
public Map<String,Object> findUserInfo(String userName){
return testService.queryUserInfo(userName);
}
}
ServiceImpl
package com.test.service.impl;
import com.test.dao.TestDao;
import com.test.model.RepUserInfoBean;
import com.test.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Author:steven
* Date:2019-12-12 21:45
* Description:<描述>
*/
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public Map<String, Object> queryUserInfo(String userName) {
HashMap<String, Object> map = new HashMap<>();
log.info("根据 用户名: {} 查询",userName);
List<RepUserInfoBean> userInfoBeans = testDao.selectUserInfo(userName);
map.put("user", userInfoBeans);
return map;
}
}
Dao
package com.test.dao;
import com.test.model.RepUserInfoBean;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Author:steven
* Date:2019-12-12 21:47
* Description:<描述>
*/
@Mapper
@Repository
public interface TestDao {
List<RepUserInfoBean> selectUserInfo(String userName);
}
Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.TestDao">
<select id="selectUserInfo" resultType="com.test.model.RepUserInfoBean">
select * from sys_user
where user_name like CONCAT ('%',#{userName},'%')
</select>
</mapper>
.yml配置
# 应用名
spring:
application:
name: test
# 时区格式化
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/nmms?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
username: root
password: Lq532806458
# 日志记录
logging:
level:
# 默认值 (可省略)
root: info
# 指定包名进行 debug 打印日志 (打印sql 方式1)
com.test: debug
# 指定日志输出文件位置 (不会级联创建不存在的目录,但会创建文件 日志文件存在则写入,不存在则创建)
file: logs/b.log
mybatis:
type-aliases-package: com.test.model
mapper-locations: classpath:/mappers/*
# mybatis的反射工具类
configuration:
# 将下划线 自动转为 驼峰式
mapUnderscoreToCamelCase: true
# 打印sql 方式2
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
.pom.xml 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
</dependencies>