SpringBoot常用工具 —— 一个简单的Demo

使用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 指定包名 输出效果
方式1

方式2 StdOutImpl 输出效果
方式2

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值