mybatis plus打印sql日志
1、官方文档
使用配置 | MyBatis-Plus
2、日志实现
MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明:
-
StdOutImpl
:将日志信息输出到控制台,适用于开发和测试环境。在配置文件中设置log-impl
为org.apache.ibatis.logging.stdout.StdOutImpl
可以开启控制台 SQL 日志打印 。 -
NoLoggingImpl
:不记录任何日志信息,适用于生产环境,以避免日志泄露可能的敏感信息。配置方式为设置log-impl
为org.apache.ibatis.logging.nologging.NoLoggingImpl
来关闭 SQL 日志打印 。 -
Slf4jImpl
:使用 SLF4J 作为日志框架,可以与 Logback、Log4j2 等日志实现配合使用。配置方式为设置log-impl
为org.apache.ibatis.logging.slf4j.Slf4jImpl
。 -
JakartaCommonsLoggingImpl
、Jdk14LoggingImpl
、Log4jImpl
等:这些是 MyBatis-Plus 支持的其他日志实现,可以根据项目中使用的日志框架进行选择 。 -
自定义日志实现:MyBatis-Plus 还允许开发者通过实现
Log
接口来扩展自定义的日志输出方式。可以使用LogFactory
的useCustomLogging
方法来指定自定义日志类。
此外,MyBatis-Plus 通过 LogFactory
日志工厂来确定使用哪种日志实现。如果没有明确指定,它会尝试使用一系列内置日志实现,直到找到合适的日志类或者禁用日志功能。
在实际使用中,可以根据项目需求和环境配置相应的日志实现,以便于更好地监控和调试应用程序。例如,可以在项目启动时通过控制台输出的提示信息来确认当前使用的日志实现方式。如果需要将 SQL 日志和参数打印到日志文件中,可以考虑使用支持文件输出的日志框架,如 Logback 或 Log4j2,并进行相应的配置。
3、自定义日志实现(推荐)
创建自定义日志实现
首先,我们需要创建一个实现了org.apache.ibatis.logging.Log
接口的类,该类会将所有原本打算以DEBUG
级别记录的日志改为以INFO
级别记录。
package com.ybw.config;import org.apache.ibatis.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** mybatis日志级别改为info** @author ybw* @version V1.0* @className InfoLevelLog* @date 2024/12/2**/
public class InfoLevelLogger implements Log {private final Logger logger;public InfoLevelLogger(String clazz) {this.logger = LoggerFactory.getLogger(clazz);}@Overridepublic boolean isDebugEnabled() {return logger.isInfoEnabled();}@Overridepublic void error(String s, Throwable e) {logger.error(s, e);}@Overridepublic void error(String s) {logger.error(s);}@Overridepublic void debug(String s) {// 修改这里logger.info(s);}@Overridepublic void warn(String s) {logger.warn(s);}@Overridepublic boolean isTraceEnabled() {// 如果需要,也可以将TRACE级别的日志改为INFOreturn logger.isInfoEnabled();}@Overridepublic void trace(String s) {// 修改这里logger.trace(s);}
}
注册自定义日志实现
mybatis配置
mybatis:configuration:log-impl: com.ybw.config.InfoLevelLogger
mybatis-plus配置
mybatis-plus:configuration:log-impl: com.ybw.config.InfoLevelLogger
测试验证
[INFO ] 2024-12-02 14:37:20.403 [main] org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
[INFO ] 2024-12-02 14:37:20.420 [main] org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a3643e3] was not registered for synchronization because synchronization is not active
[INFO ] 2024-12-02 14:37:20.517 [main] o.m.s.t.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3e4afd10] will not be managed by Spring
[INFO ] 2024-12-02 14:37:20.528 [main] c.y.mapper.TestYearMapper.selectList - ==> Preparing: SELECT id,receive_year FROM test_year WHERE (receive_year = ?)
[INFO ] 2024-12-02 14:37:20.660 [main] c.y.mapper.TestYearMapper.selectList - ==> Parameters: 2024(Integer)
[INFO ] 2024-12-02 14:37:20.751 [main] c.y.mapper.TestYearMapper.selectList - <== Columns: id, receive_year
[INFO ] 2024-12-02 14:37:20.753 [main] c.y.mapper.TestYearMapper.selectList - <== Row: 1, 2024-01-01
[INFO ] 2024-12-02 14:37:20.756 [main] c.y.mapper.TestYearMapper.selectList - <== Total: 1
[INFO ] 2024-12-02 14:37:20.762 [main] org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a3643e3]
[INFO ] 2024-12-02 14:37:20.923 [main] com.ybw.service.TestYearServiceTest - list:[{"id":1,"receiveYear":{"leap":true,"value":2024}}]
源代码
share: 分享仓库 - Gitee.com
4、动态配置
代码实现
/*** sql打印日志* package命名为mapper方式实现** @methodName: configureLoggers* @return: void* @author: ybw* @date: 2024/7/4**/
@Bean
public void configureLoggers() {LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();Set<String> mapperPackages = findPackagesWithMapper();if (CollectionUtils.isEmpty(mapperPackages)) {return;}mapperPackages.forEach(packageName -> {// 设置packageName包的日志级别为DEBUGcontext.getLogger(packageName).setLevel(Level.DEBUG);});
}/*** 扫描包下所有mapper** @methodName: findPackagesWithMapper* @return: java.util.Set<java.lang.String>* @author: ybw* @date: 2024/7/4**/
public Set<String> findPackagesWithMapper() {// 使用Spring的PathMatchingResourcePatternResolver来查找资源PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);// 示例资源路径,根据实际情况调整String packageSearchPath = "classpath*:**/" + MybatisPlusConstant.Package.BASE_PACKAGE + "/**/*.class";try {Resource[] resources = resolver.getResources(packageSearchPath);Set<String> packagesWithMapper = new HashSet<>();for (Resource resource : resources) {if (resource.isReadable()) {MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);String packageName = ClassUtils.getPackageName(metadataReader.getClassMetadata().getClassName());if (packageName.contains(MybatisPlusConstant.Package.PACKAGE_KEYWORD)) {packagesWithMapper.add(packageName);}}}return packagesWithMapper;} catch (IOException e) {log.error("findPackagesWithMapper error:", e);}return new HashSet<>();
}
源代码
share: 分享仓库 - Gitee.com
相关文章:
mybatis plus打印sql日志
1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明: StdOutImpl…...
ObjectMapper
ObjectMapper 是 Jackson 库中非常重要的一个类,它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型,它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...
新增白名单赋予应用安装权限
目录 相关问题 具体实现 相关问题 安装app到/data/分区时,如何在安装阶段就赋予权限,无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...
传奇996_51——脱下装备,附加属性设为0
奶奶的lua怎么都修改不了,可以调用txt的 ; LINKPICKUPITEM ; ChangeitemaddvaLue -1 5 0 ; GETITEMADDVALUE 3 5 M10 ; SENDUPGRADEITEM ; SENDMSG 9 你的衣服附加了<$STR(M10)>点防御属性. 或者lua callscriptex(actor,“LINKPICKUPITEM”) callscriptex(…...

【Mac】安装Gradle
1、说明 Gradle 运行依赖 JVM,需要先安装JDK,Gradle 与 JDK的版本对应参见:Java Compatibility IDEA的版本也是有要求Gradle版本的,二者版本对应关系参见:Third-Party Software and Licenses 本次 Gradle 安装版本为…...
MySQL中的redoLog
在数据库系统中,redo log(重做日志)用于记录所有已提交事务的修改操作,它的主要目的是确保在系统崩溃或故障后,能够恢复数据库到崩溃前的状态。Redo log 记录的是事务修改的数据的具体操作,而不是数据本身。…...

Windows 安装 MySQL
1.下载 MySQL 安装包 访问:MySQL :: Download MySQL Installer选择适合的版本。推荐下载 MySQL Installer for Windows,该安装包包含所有必要的组件选择 Windows (x86, 32-bit), MSI Installer 或 Windows (x86, 64-bit), MSI Installer 2.运行安装程序…...
yocto的xxx.bb文件在什么时候会拷贝文件到build目录
在 Yocto 中,.bb 文件用于描述如何构建和安装一个软件包,而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说,文件会在以下几个阶段被拷贝到 build 目录(或者更准确地说,拷贝到目标目录 ${D}&#x…...

Ubuntu Server 22.04.5 LTS重启后IP被重置问题
Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后,所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址:Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…...

Java基础复习
“任何时候我也不会满足,越是多读书,就越是深刻地感到不满足,越感到自己知识贫乏。科学是奥妙无穷的。” ——马克思 目录 一、方法&方法重载 二、运算符 三、数据类型 四、面向对象 1. 面向对象思想 2. 引用传递 3. 访问权限修饰…...

简易图书管理系统
javawebjspservlet 实体类 package com.ghx.entity;/*** author :guo* date :Created in 2024/12/6 10:13* description:* modified By:* version:*/ public class Book {private int id;private String name;private double pri…...

结构型-组合模式(Composite Pattern)
什么是组合模式 又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 结构 抽象根节点(Co…...
【知识堂】大数据
一、大数据的基本概念 什么是大数据? 大数据(Big Data)是指无法通过传统工具和方法在合理时间内处理的海量数据集合。其关键特征是4V,即数据量大(Volume)、数据种类多(Variety)、处…...
力扣C语言刷题记录(三)搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

在Node.js局域网调试https的Vue项目
需求: 最近在测试在网页端(HTML5)调用移动设备的定位等权限功能,发现某些功能是必须保证域名在https下的否则会出现不正常现象。 解决: 1.在线生成和证书 访问:CSR文件生成工具-中国数字证书CHINASSL …...

3.5 认识决策树
3.5 认识决策树 3.5.1 认识决策树 如何高效的进行决策? 特征的先后顺序 3.5.2 决策树分类原理详解 已知有四个特征,预测 是否贷款给某个人。 先看房子,再看工作,是否贷款。 年龄,信贷情况,工作&#…...

股市复盘笔记
复盘是股市投资中非常重要的一个环节,它指的是投资者在股市收盘后,对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结,以便更好地指导未来的投资决策。以下是对复盘的详细解释: 一、复盘的目的 总结市场走势ÿ…...

Canal 深入解析:从原理到实践的全面解读
Canal 深入解析:从原理到实践的全面解读 官网:https://github.com/alibaba/canal Canal 是阿里巴巴开源的一款分布式增量数据同步工具,广泛应用于数据同步、实时数据处理和数据库的增量备份等场景。它可以通过监听 MySQL 数据库的 binlog&am…...

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了。windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …...

解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204
🛠️ 解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享 📌 引言 在软件开发过程中,持续集成和持续部署(CI/CD)是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具࿰…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...