7、日志
7.1、日志工厂
如果一个数据库操作出现了异常,日志是很好的排错工具。
不使用sout和debug,使用日志工厂排错
Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j 【重要】
- JDK logging
- STDOUT_LOGGING 【重要,系统默认的日志,不其他依赖】
7.1.1、使用自带的STDOU_LOGGING
可以在设置setting标签里选择使用哪一种实现(4.5节讲了setting)。在 mybatis-config.xml 中配置:
<!-- 设置 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
输出了更多的内容:
Opening JDBC Connection
Created connection 516875052.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1ecee32c]
==> Preparing: select * from mybatis.user where id = ?
==> Parameters: 1(Integer)
<== Columns: id, name, pwd
<== Row: 1, dzy, 123456
<== Total: 1
User{id=1, name='dzy', pwd='123456'}
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1ecee32c]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1ecee32c]
Returned connection 516875052 to pool.
7.1.2、使用LOG4J
使用log4j需要先导包。
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
在 src/main/resource 下创建配置文件 log4j.propert。
配置详解:https://blog.csdn.net/eagleuniversityeye/article/details/80582140
这里我们配置得简单一点
# 输出debug级别的日志输出到控制台和文件
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/dzy.log
log4j.appender.file.MaxFileSize = 10MB
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern =%d %p [ %c] - %m %n %d
# 日志输出级别
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
setting里设置:使用 LOG4J:
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
然后执行测试用例,有意义的输出结果如下:
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Opening JDBC Connection
[org.apache.ibatis.datasource.pooled.PooledDataSource]-Created connection 79290250.
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4b9df8a]
[com.dzy.dao.UserMapper.getUserById]-==> Preparing: select * from mybatis.user where id = ?
[com.dzy.dao.UserMapper.getUserById]-==> Parameters: 1(Integer)
[com.dzy.dao.UserMapper.getUserById]-<== Total: 1
User{id=1, name='dzy', pwd='123456'}
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4b9df8a]
[org.apache.ibatis.transaction.jdbc.JdbcTransaction]-Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4b9df8a]
[org.apache.ibatis.datasource.pooled.PooledDataSource]-Returned connection 79290250 to pool.
LOG4J 更详细一些,可以设置的东西多一些。
7.2、LOG4J简单使用
首先要导入包:
import org.apache.log4j.Logger;
然后生成日志对象,参数是当前类的反射对象:
static Logger logger = Logger.getLogger(UserDaoTest.class);
测试三种不同等级的日志:
@Test
public void testLog4j() {
logger.info("info: 使用LOG4J");
logger.debug("debug: 使用LOG4J");
logger.error("error: 使用LOG4J");
}
学过日志之后就应该用日志代替system.out.print,比如查询的测试用例改成:
@Test
public void TestSelectById() {
try (SqlSession session = MybatisUtils.getSqlSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
logger.info(user); // 用日志代替输出
}
}