springboot使用tk.mybatis通用mapper使用log4j打印sql

本文介绍如何在SpringBoot项目中配置并使用Log4j进行日志记录,包括排除默认日志框架,引入Log4j依赖,配置log4j.properties文件,以及在启动类中设置日志配置。

springboot使用log4j打日志,非常简单,首页需要在pom文件中屏蔽掉默认的日志方式spring-boot-starter-logging,并引入log4j相关依赖(如果其他依赖也使用了跟log4j不相容的也排除掉即可):

<!-- log4j start -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
</dependency>
<!-- log4j end -->

在项目目录下创建res文件夹,创建log4j.properties文件,你也可以放到src/main/resources下面,此时不需要再加如下的语句:

PropertyConfigurator.configure(System.getProperty("logging.config", "res/log4j.properties"));

我们这里使用res目录是考虑到不同的环境可能需要不同的日志级别,只需要修改res目录下的配置即可。在启动类中这样设置:

@EnableAutoConfiguration
@ComponentScan(basePackages = "cn.lovecto.promotion")
@MapperScan(basePackages = "cn.lovecto.promotion.dao.mapper")//数据库访问mapper接口所在包名
@EnableScheduling
@EnableAsync
@EnableTransactionManagement
public class Application {

    public static void main(String[] args) {
        //放到自定义的res目录下的方式
        PropertyConfigurator.configure(System.getProperty("logging.config", "res/log4j.properties"));
        SpringApplication.run(Application.class, args);
    }

}

log4j.properties在springboot中的配置并没有什么特殊说明的,由于我们使用tk.mybatis通用mapper,如果要打印日志查看sql,可以在log4j.properties中加入如下内容即可。

log4j.rootLogger=INFO,err,stdout
#数据库访问mapper接口所在包日志级别
log4j.logger.cn.lovecto.promotion.dao.mapper=DEBUG,db

#db.log,每天一个文件
log4j.logger.db=DEBUG,db
log4j.appender.db=org.apache.log4j.DailyRollingFileAppender
log4j.appender.db.Threshold=DEBUG
log4j.appender.db.File=./logs/db.log
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH\:mm\:ss} [%F\:%L] %m %n

运行单元测试,控制台和db.log中打印出:

DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] ==>  Preparing: SELECT id,promotion_name,advance_start_time,booking_start_time,booking_end_time,checkin_start_time,checkin_end_time,promotion_type,promotion_value,promotion_icon,remark,enable_inventory,inventory,promotion_price_icon,inventory_factor,use_coupon,max_ordernum,enable_refund,refund_percent,quantity_limit,status FROM promotion WHERE ( booking_start_time >= ? and booking_end_time < ? )  
DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] ==> Parameters: 2018-08-03 15:52:28.123(Timestamp), 2018-08-03 15:52:28.123(Timestamp) 
DEBUG 2018-08-03 15:52:28 [BaseJdbcLogger.java:159] <==      Total: 0 
### MyBatis中BuilderException异常分析与解决 在使用MyBatis框架时,`BuilderException` 异常通常与SQL映射配置或动态SQL生成相关。当遇到 `java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.()` 问题时,这表明系统无法正确初始化 `BaseSelectProvider` 类,可能的原因包括注解使用错误、依赖冲突或扫描配置不正确。 以下是对该问题的详细分析和解决方案: #### 1. 异常原因分析 - **注解使用错误** 如果在Spring Boot项目的启动类上使用了错误的包扫描注解(例如使用Spring的 `@MapperScan` 而非tk-mybatis提供的 `@MapperScan`),会导致MyBatis无法正确加载自定义的Mapper接口[^2]。 - **依赖冲突** 如果项目中存在多个版本的MyBatistk-mybatis依赖,可能会导致类加载失败,进而引发 `NoSuchMethodException` 异常。 - **未正确配置动态SQL** `BaseSelectProvider` 是一个用于生成动态SQL的工具类。如果在Mapper XML文件中定义的SQL语句不符合预期格式,或者未正确引用动态SQL方法,也可能触发此异常[^1]。 #### 2. 解决方案 - **确保正确的注解使用** 在Spring Boot启动类上,应使用tk-mybatis提供的 `@MapperScan` 注解,并明确指定Mapper接口所在的包路径。例如: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **检查依赖版本一致性** 确保项目中的MyBatistk-mybatis依赖版本一致。可以通过以下方式检查依赖树并排除冲突: ```bash mvn dependency:tree ``` 示例依赖配置如下: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency> ``` - **验证Mapper XML配置** 检查Mapper XML文件中是否正确引用了 `BaseSelectProvider` 的方法。例如: ```xml <select id="selectByExample" resultType="com.example.model.User"> ${sql} </select> ``` 确保 `${sql}` 动态SQL占位符与 `BaseSelectProvider` 方法返回值匹配[^2]。 #### 3. 示例代码 以下是一个完整的示例,展示如何正确配置MyBatistk-mybatis以避免 `BuilderException` 和 `NoSuchMethodException`: ```java // 启动类配置 @SpringBootApplication @MapperScan(basePackages = "com.example.mapper", sqlProviderPackage = "tk.mybatis.mapper.provider") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // Mapper接口示例 @Mapper public interface UserMapper extends BaseMapper<User> { @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<User> selectByExample(UserExample example); } ``` #### 4. 注意事项 - 确保 `BaseSelectProvider` 所属的包路径已正确配置到 `@MapperScan` 的 `sqlProviderPackage` 属性中。 - 如果仍出现异常,可以尝试启用MyBatis的日志功能以获取更多调试信息: ```properties mybatis.configuration.log-impl=STDOUT_LOGGING ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值