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);
}
@Override
public boolean isDebugEnabled() {
return logger.isInfoEnabled();
}
@Override
public void error(String s, Throwable e) {
logger.error(s, e);
}
@Override
public void error(String s) {
logger.error(s);
}
@Override
public void debug(String s) {
// 修改这里
logger.info(s);
}
@Override
public void warn(String s) {
logger.warn(s);
}
@Override
public boolean isTraceEnabled() {
// 如果需要,也可以将TRACE级别的日志改为INFO
return logger.isInfoEnabled();
}
@Override
public 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 测试验证
2024-12-02 14:37:20.403 org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
2024-12-02 14:37:20.420 org.mybatis.spring.SqlSessionUtils - SqlSession was not registered for synchronization because synchronization is not active
2024-12-02 14:37:20.517 o.m.s.t.SpringManagedTransaction - JDBC Connection will not be managed by Spring
2024-12-02 14:37:20.528 c.y.mapper.TestYearMapper.selectList - ==>Preparing: SELECT id,receive_year FROM test_year WHERE (receive_year = ?)
2024-12-02 14:37:20.660 c.y.mapper.TestYearMapper.selectList - ==> Parameters: 2024(Integer)
2024-12-02 14:37:20.751 c.y.mapper.TestYearMapper.selectList - <== Columns: id, receive_year
2024-12-02 14:37:20.753 c.y.mapper.TestYearMapper.selectList - <== Row: 1, 2024-01-01
2024-12-02 14:37:20.756 c.y.mapper.TestYearMapper.selectList - <== Total: 1
2024-12-02 14:37:20.762 org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession
2024-12-02 14:37:20.923 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包的日志级别为DEBUG
context.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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]