mybatis plus打印sql日记

打印 上一主题 下一主题

主题 585|帖子 585|积分 1755

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级别记载。
  1. package com.ybw.config;
  2. import org.apache.ibatis.logging.Log;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. /**
  6. * mybatis日志级别改为info
  7. *
  8. * @author ybw
  9. * @version V1.0
  10. * @className InfoLevelLog
  11. * @date 2024/12/2
  12. **/
  13. public class InfoLevelLogger implements Log {
  14.     private final Logger logger;
  15.     public InfoLevelLogger(String clazz) {
  16.         this.logger = LoggerFactory.getLogger(clazz);
  17.     }
  18.     @Override
  19.     public boolean isDebugEnabled() {
  20.         return logger.isInfoEnabled();
  21.     }
  22.     @Override
  23.     public void error(String s, Throwable e) {
  24.         logger.error(s, e);
  25.     }
  26.     @Override
  27.     public void error(String s) {
  28.         logger.error(s);
  29.     }
  30.     @Override
  31.     public void debug(String s) {
  32.         // 修改这里
  33.         logger.info(s);
  34.     }
  35.     @Override
  36.     public void warn(String s) {
  37.         logger.warn(s);
  38.     }
  39.     @Override
  40.     public boolean isTraceEnabled() {
  41.         // 如果需要,也可以将TRACE级别的日志改为INFO
  42.         return logger.isInfoEnabled();
  43.     }
  44.     @Override
  45.     public void trace(String s) {
  46.         // 修改这里
  47.         logger.trace(s);
  48.     }
  49. }
复制代码
注册自界说日记实现

mybatis配置

  1. mybatis:
  2.   configuration:
  3.     log-impl: com.ybw.config.InfoLevelLogger
复制代码
mybatis-plus配置

  1. mybatis-plus:
  2.   configuration:
  3.     log-impl: com.ybw.config.InfoLevelLogger
复制代码
测试验证

  1. [INFO ] 2024-12-02 14:37:20.403 [main] org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
  2. [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
  3. [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
  4. [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 = ?)
  5. [INFO ] 2024-12-02 14:37:20.660 [main] c.y.mapper.TestYearMapper.selectList - ==> Parameters: 2024(Integer)
  6. [INFO ] 2024-12-02 14:37:20.751 [main] c.y.mapper.TestYearMapper.selectList - <==    Columns: id, receive_year
  7. [INFO ] 2024-12-02 14:37:20.753 [main] c.y.mapper.TestYearMapper.selectList - <==        Row: 1, 2024-01-01
  8. [INFO ] 2024-12-02 14:37:20.756 [main] c.y.mapper.TestYearMapper.selectList - <==      Total: 1
  9. [INFO ] 2024-12-02 14:37:20.762 [main] org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7a3643e3]
  10. [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、动态配置

代码实现

  1. /**
  2. * sql打印日志
  3. * package命名为mapper方式实现
  4. *
  5. * @methodName: configureLoggers
  6. * @return: void
  7. * @author: ybw
  8. * @date: 2024/7/4
  9. **/
  10. @Bean
  11. public void configureLoggers() {
  12.     LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
  13.     Set<String> mapperPackages = findPackagesWithMapper();
  14.     if (CollectionUtils.isEmpty(mapperPackages)) {
  15.         return;
  16.     }
  17.     mapperPackages.forEach(packageName -> {
  18.         // 设置packageName包的日志级别为DEBUG
  19.         context.getLogger(packageName).setLevel(Level.DEBUG);
  20.     });
  21. }
  22. /**
  23. * 扫描包下所有mapper
  24. *
  25. * @methodName: findPackagesWithMapper
  26. * @return: java.util.Set<java.lang.String>
  27. * @author: ybw
  28. * @date: 2024/7/4
  29. **/
  30. public Set<String> findPackagesWithMapper() {
  31.     // 使用Spring的PathMatchingResourcePatternResolver来查找资源
  32.     PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  33.     MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
  34.     // 示例资源路径,根据实际情况调整
  35.     String packageSearchPath = "classpath*:**/" + MybatisPlusConstant.Package.BASE_PACKAGE + "/**/*.class";
  36.     try {
  37.         Resource[] resources = resolver.getResources(packageSearchPath);
  38.         Set<String> packagesWithMapper = new HashSet<>();
  39.         for (Resource resource : resources) {
  40.             if (resource.isReadable()) {
  41.                 MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
  42.                 String packageName = ClassUtils.getPackageName(metadataReader.getClassMetadata().getClassName());
  43.                 if (packageName.contains(MybatisPlusConstant.Package.PACKAGE_KEYWORD)) {
  44.                     packagesWithMapper.add(packageName);
  45.                 }
  46.             }
  47.         }
  48.         return packagesWithMapper;
  49.     } catch (IOException e) {
  50.         log.error("findPackagesWithMapper error:", e);
  51.     }
  52.     return new HashSet<>();
  53. }
复制代码
源代码

share: 分享仓库 - Gitee.com


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表