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); // 用日誌代替輸出
}
}