springboot--pagehelper整合与日志处理

pagehelper整合

引入依赖

xml 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>2.1.0</version>
    <scope>compile</scope>
</dependency>

编写代码

java 复制代码
@GetMapping("/list/{pageNo}")
public PageInfo<Vip> findAll(@PathVariable int pageNo) {
    // 设置当前页码和每页显示的条数
    PageHelper.startPage(pageNo, 10);
    // 查询数据
    List<Vip> allVip = vipService.findAllVip();
    // 将数据封装到pageinfo对象中
    PageInfo<Vip> pageInfo = new PageInfo<>(allVip);
    return pageInfo;
}

web层响应结果的封装

对于前后端分离的系统来说,后端会返回json数据,一般会封装一个R对象来解决统一响应格式问题。

java 复制代码
package com.ali.springboot3ssm.result;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder // 建造模式
public class R<T> {

    // 响应状态码
    private int code;
    // 消息描述:成功或失败
    private String msg;
    // 响应对象:任意类型对象
    private  T data;

    public static <T> R<T> OK(T data) {
        return R.<T>builder().code(200).msg("成功").data(data).build();
    }

    // 成功的方法
    public static <T> R<T> OK() {
        return R.<T>builder().code(200).msg("成功").build();
    }

    // 失败的方法
    public static <T> R<T> FAIL(int code,String msg) {
        return R.<T>builder().code(code).msg(msg).build();
    }

    public static <T> R<T> FAIL() {
        return R.<T>builder().code(400).msg("失败").build();
    }
}

controller中使用

java 复制代码
@GetMapping("/list/{pageNo}")
public R< PageInfo<Vip>> findAll(@PathVariable int pageNo) {
    // 设置当前页码和每页显示的条数,设置后会自动为查询语句加limit
    PageHelper.startPage(pageNo, 10);
    // 查询数据
    List<Vip> allVip = vipService.findAllVip();
    // 将数据封装到pageinfo对象中
    PageInfo<Vip> pageInfo = new PageInfo<>(allVip);
    return R.OK(pageInfo);
}

改进R对象

添加一个枚举类型

java 复制代码
package com.ali.springboot3ssm.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@NoArgsConstructor
@AllArgsConstructor
public enum CodeEnum {
    // 枚举的大括号一开始的位置必须有枚举值
    //  枚举值下面如果没有代码,枚举值列表最后的";"可以省略
    //  枚举值下面如果有代码,枚举值列表最后的";" 不可以省略
    OK(200, "OK"),
    FAIL(400, "失败"),
    BAD_REQUEST(400, "失败"),
    NOT_FOUND(400, "失败"),
    INTERNAL_ERROR(400, "失败"),
    MODIFICATION_ERROR(400, "失败"),
    DELETION_ERROR(400, "失败"),
    CREATE_ERROR(400, "失败");

    @Getter
    @Setter
    private int code;
    @Getter
    @Setter
    private String msg;
}

重写R类

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder // 建造模式
public class R<T> {

    // 响应状态码
    private int code;
    // 消息描述:成功或失败
    private String msg;
    // 响应对象:任意类型对象
    private  T data;

    public static <T> R<T> OK(T data) {
        return R.<T>builder().code(CodeEnum.OK.getCode()).msg(CodeEnum.OK.getMsg()).data(data).build();
    }

    // 成功的方法
    public static <T> R<T> OK() {
        return R.<T>builder().code(CodeEnum.OK.getCode()).msg(CodeEnum.OK.getMsg()).build();
    }

    // 失败的方法
    public static <T> R<T> FAIL(CodeEnum codeEnum) {
        return R.<T>builder().code(codeEnum.getCode()).msg(codeEnum.getMsg()).build();
    }

    public static <T> R<T> FAIL() {
        return R.<T>builder().code(CodeEnum.FAIL.getCode()).msg(CodeEnum.FAIL.getMsg()).build();
    }
}

事务管理

spring boot自动配置了事务管理器。只需要使用@Transactional注解标注需要事务控制的方法即可。

就这么简单。

怎么打war包

修改pom文件

xml 复制代码
<!--    打包方式修改为war-->
    <packaging>war</packaging>

<!--        排除tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

<!--        添加tomcat依赖-->
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
<!--            provided:表示这个依赖不会被打到war包中,只是编译时使用-->
            <scope>provided</scope>
        </dependency>

启动类继承SpringBootServletInitializer类并重写configure方法

java 复制代码
@MapperScan(basePackages = "com.ali.springboot3ssm.repository")
@SpringBootApplication
public class Springboot3SsmApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Springboot3SsmApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Springboot3SsmApplication.class, args);
    }

}

日志处理

抽象的日志框架

什么时抽象的日志框架?编译阶段可以使用抽象的日志框架,能正常编译。但运行阶段必须提供具体的日志框架,目的是:具体的日志框架可灵活切换。

抽象框架有SLF4J 、 Commons Logging。这2个都可以绑定具体的日志框架,如Log4j、Log4j2、Logback、JUL

具体的日志框架

Log4j(已过时)、Log4j2(推荐)、Logback(推荐)、JUL(Java util Logging,功能有限,适合小型应用)

spring boot默认集成log back

日志级别

日志级别由低到高:

  1. trace:级别最低。记录最详细信息,通常在调试时使用
  2. debug:记录程序运行时的详细信息,比如变量的值,进入或退出某个方法等,主要用于开发时调试
  3. info:记录一般信息,如系统启动、服务初始化完成等,表示程序运行正常。
  4. warn:警告信息
  5. error:错误信息

生成环境中 通常把日志级别设为info或更高级别

开发或测试环境中,设为debug或trace

spring boot默认日志级别是info

java 复制代码
@Slf4j // 这是lombok的一个注解,作用是为我们维护一个日志对象log
@SpringBootApplication
public class Springboot3SsmApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot3SsmApplication.class, args);

        // 直接使用log
        log.info("日志信息");
    }
}

调整日志级别

properties 复制代码
# 调整日志级别
logging.level.root=debug

日志的粗细粒度

properties 复制代码
# 调整根日志级别(全局的,整个项目都是这个级别)
logging.level.root=debug
# 为特定包设置日志级别
logging.level.com.ali.springboot3ssm.controller=debug
# 为特定类设置日志级别
logging.level.com.ali.springboot3ssm.service.UserService=trace
# 在控制台中打印sql (这个包是Mapper类所在的包)
logging.level.com.ali.springboot3ssm.repository=debug

日志输出到文件

有2种方式,这2种方式不能共存,如果同时存在,只有logging.file.name生效

properties 复制代码
# 将日志文件输出到当前项目根目录下的log目录中。文件名默认spring.log  并且文件名不可修改
# 路径可随便改。可以是硬盘上的任意有权限路径
logging.file.path=./log/
# 日志文件输出到当前项目根目录下my.log文件。路径不可修改
logging.file.name=my.log

滚动日志

防止日志无线增长,将日志文件分割成多个文件,避免单个文件过大难以处理

properties 复制代码
# 此策略仅适合logback
# 日志文件达到多大时进行归档,打成一个压缩包
logging.logback.rollingpolicy.max-file-size=10MB
# 归档日志文件总共达到多大时删除
logging.logback.rollingpolicy.total-size-cap=50GB
# 归档日志文件最多保留几天
logging.logback.rollingpolicy.max-history=60
#启动项目时是否清理归档日志文件
logging.logback.rollingpolicy.clean-history-on-start=false
# 归档日志文件名格式
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

日志框架切换

先排除log back 再引入新依赖

properties 复制代码
<!--                排除默认日志依赖-->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
<!--        引入log4j依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
相关推荐
weixin_440784112 小时前
Java线程池工作原理浅析
android·java·开发语言·okhttp·android studio·android runtime
ANGLAL2 小时前
35.登录认证演进及双token机制
java
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于spring boot的摩托车合格证管理系统为例,包含答辩的问题和答案
java·spring boot·后端
独自破碎E2 小时前
LCR005-最大单词长度乘积
java·开发语言
码农阿豪2 小时前
影刀RPA与Java融合实践:打造高效智能的高铁票务解决方案
java·python·rpa
龚礼鹏2 小时前
图像显示框架十一——BufferQueue的工作流程(基于Android 15源码分析)
java·网络·数据库
爬山算法2 小时前
Hibernate(72)如何在NoSQL数据库中使用Hibernate?
java·nosql·hibernate
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于spring boot的国学诗词网站设计与实现--为例,包含答辩的问题和答案
java·spring boot·后端
Hellc0073 小时前
Jenkins 上下游 Job + Docker 镜像部署完整实战(避坑版)
java·docker·jenkins