一、学习目标
在mybatis的学习过程中,总会遇到各种各样的错误,然而寻找错误的过程却并不是很容易。为了解SQL语句的执行情况、参数传递情况、以及执行结果等,所以可以通过日志快速定位问题所在。
二、日志,
1.介绍
在mybatis官方文档中提到,不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging,所以在这种配置环境下的 MyBatis 会把它作为日志工具,记住这点非常重要。这将意味着,它提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。但是如果你又想使用其它日志工具,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择别的日志工具。例如之前博客里使用的设置:
<setting name="logImpl" value="LOG4J"/>
其中,value 可选的值有很多,例如:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING。你也可以调用方法来使用日志工具
org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useLog4J2Logging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();
但是,要注意的是,要调用以上某个方法时,请在调用其它 MyBatis 方法之前调用它,并且仅当运行时类路径中存在该日志工具时,调用与该日志工具对应的方法才会生
2.作用
MyBatis 里的日志扮演着至关重要的角色,主要作用包括但不限于以下几点
1.在开发过程中,日志能够帮助跟踪 SQL 语句的执行情况,这对于调试复杂的数据库操作问题非常有帮助。通过日志,可以清楚地看到 MyBatis 是如何与数据库进行交互的,包括何时打开和关闭数据库连接、何时发送 SQL 查询、何时处理结果集等。
2.日志可以用于监控应用的数据库性能。通过分析日志可以识别出性能瓶颈,进而优化 SQL 语句或数据库结构。在生产环境中,适当的日志记录可以帮助监控应用的健康状况,及时发现并解决潜在的性能问题。
3.当系统出现问题时,日志是诊断问题的首要工具。通过查看日志,可以快速定位问题发生的上下文和原因,进而采取有效的解决措施对于生产环境中的突发问题。
4.通过对日志的分析,可以识别出代码中的冗余或低效部分,进而进行优化和重构,提高系统性能。
3.配置
1.日志工厂
以之前的博客为例,在mybatisConfig.xml文件添加如下配置。
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
配置之前:
配置成功之后:
2.log4j
1.介绍
Log4j是Apache的一个开源项目,它是一款功能强大的日志记录工具,广泛应用于Java开发中,用于控制日志信息的输出。Log4j主要用于记录程序运行时的信息,包括调试信息、错误信息、警告信息等,以便于开发者进行问题追踪和系统维护。
2.导包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3.配置
resources目录下新建log4j.properties文件
在文件里添加:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
4.setting
在第三天关于mybatis配置的博客就提到了<settings></setings>
log4j配置如下:
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
5.测试
以之前的博客为测试案例:
@Test
public void selectUser() {
// 通过MybatisUtils工具类获取SqlSession对象,SqlSession是MyBatis的核心接口,用于执行SQL语句
SqlSession session = MybatisUtils.getSession();
// 通过SqlSession的getMapper方法获取UserMapper接口的代理对象,该对象用于执行与User表相关的数据库操作
UserMapper mapper = session.getMapper(UserMapper.class);
// 调用UserMapper接口的selectUser方法,该方法应该返回User对象的列表
List<User> users = mapper.selectUser();
// 遍历返回的User对象列表
for (User user : users) {
// 打印每个User对象的信息到控制台
System.out.println(user);
}
// 关闭SqlSession,释放数据库连接资源
session.close();
}