Bootstrap

学到一些小知识关于Maven 与 logback 与 jpa 日志

1.jpa想要输出参数

logging:
  level:
    org.hibernate.orm.jdbc.bind: trace #打印SQL参数
    web: debug #web框架的日志级别

就可以了,

2.Slf4j

其实 Slf4j 是一个日志接口规范,没有具体的实现

而 logback 是 Slf4j的一个实现 ,也是springboot3 的默认实现, 

一个项目最好只有一个 Slf4j的实现,要不然可能会有冲突, 他会扫描类路径下是否有实现,然后找到后使用。

springboot3还可以切换 log4j2 的实现, 本来 log4j2 的接口与 Slf4j不同 ,但是springboot -log4j2-starter 使用了适配器模式,适配了SLF所以 可以无缝衔接 slf ,但是要排除原来自带的 springboot-logging-starter 的依赖, 来保证只有一个SLF实现

log4j2的配置文件

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"> <!--log4j2内部的日志输出级别,跟你的项目无关-->
    <Appenders>
        <!-- 控制台输出 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <!-- 滚动文件输出 -->
        <RollingFile name="RollingFile" fileName="logs/application.log"
                     filePattern="logs/application-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 时间滚动策略:每天滚动一次 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件大小滚动策略:当文件达到 10MB 时滚动 -->
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- 保留的日志文件数量 -->
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
        <Logger name="com.yourpackage" level="debug" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>
    </Loggers>
</Configuration>
logging:
  level:
    root: info
    com.yourpackage: debug
  config: classpath:log4j2.xml

所有的子日志 都是继承 root 日志的

3.不同依赖范围的行为

范围编译时可用测试时可用运行时可用打包到构建产物传递性
compile
provided
runtime
test
system
import

具体解释

  1. compile

    • 编译时可用:在编译项目时可用。
    • 测试时可用:在运行测试时可用。
    • 运行时可用:在项目运行时可用。
    • 打包到构建产物:会被包含在最终的构建产物(如 JAR 或 WAR 文件)中。
    • 传递性:会被传递给依赖当前项目的其他模块。
  2. provided

    • 编译时可用:在编译项目时可用。
    • 测试时可用:在运行测试时可用。
    • 运行时可用:在项目运行时不可用,因为这些依赖由运行环境提供。
    • 打包到构建产物:不会被包含在最终的构建产物中。
    • 传递性:不会被传递给依赖当前项目的其他模块。
  3. runtime

    • 编译时可用:在编译项目时不可用。
    • 测试时可用:在运行测试时可用。
    • 运行时可用:在项目运行时可用。
    • 打包到构建产物:会被包含在最终的构建产物中。
    • 传递性:会被传递给依赖当前项目的其他模块。
  4. test

    • 编译时可用:在编译项目时不可用。
    • 测试时可用:在运行测试时可用。
    • 运行时可用:在项目运行时不可用。
    • 打包到构建产物:不会被包含在最终的构建产物中。
    • 传递性:不会被传递给依赖当前项目的其他模块。
  5. system

    • 编译时可用:在编译项目时可用。
    • 测试时可用:在运行测试时可用。
    • 运行时可用:在项目运行时可用。
    • 打包到构建产物:不会被包含在最终的构建产物中。
    • 传递性:不会被传递给依赖当前项目的其他模块。
    • 特殊性:需要通过 <systemPath> 指定依赖的路径,通常是项目目录中的 JAR 文件。
  6. import

    • 编译时可用:在编译项目时不可用。
    • 测试时可用:在运行测试时不可用。
    • 运行时可用:在项目运行时不可用。
    • 打包到构建产物:不会被包含在最终的构建产物中。
    • 传递性:会被传递给依赖当前项目的其他模块。
    • 特殊性:主要用于 pom 类型的依赖,用于导入其他 pom 文件中的依赖管理信息,常用于 BOM(Bill of Materials)文件。

option 与 provided 的区别 就是 语义化

option: 在当前项目使用,其他依赖引入的时候,必须显示声明才能使用,它依赖了这个依赖的内容

provided:是根本就不传递, 有另一个容器去提供此依赖的内容

4. SQL json

将数据库 的json 字段 转化成 想要的格式 ,因为实体类改了

UPDATE enum_dictionary 
SET enum_params = (
    SELECT JSON_OBJECTAGG(
        k,
        JSON_OBJECT('defaultValue', JSON_EXTRACT(enum_params, CONCAT('$."', k, '"')))
    )
    FROM JSON_TABLE(
        JSON_KEYS(enum_params),
        '$[*]' COLUMNS (k VARCHAR(255) PATH '$')
    ) AS jt
);

;