上一篇我們介紹了Mybatis中的參數(shù),本篇我們使用JDK Log打印一下Mybatis運行時的日志,看一下Mybatis執(zhí)行的過程。
這里我選取上一篇的示例進行JDK Log的集成,這里如果您想對上一篇進行詳細了解,可以參考:
Mybatis參數(shù)(parameterType)https://blog.csdn.net/m1729339749/article/details/132548838
一、配置Mybatis
在mybatis-config.xml文件中配置logImpl
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="JDK_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="horse"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="demo/UserInfoMapper.xml" />
</mappers>
</configuration>
在配置文件中,我們配置了logImpl,值配置成了JDK_LOGGING,代表的是使用JDK提供的日志系統(tǒng)
二、JDK日志配置
在resources目錄下新建logging.properties配置文件
handlers=java.util.logging.ConsoleHandler
.level=FINER
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n
handlers:代表的是日志處理器,java.util.logging.ConsoleHandler處理器用于直接在控制臺打印日志
.level:代表的是全局日志級別
java.util.logging.ConsoleHandler.level:設置的是處理器需要處理的日志級別
java.util.logging.ConsoleHandler.formatter:設置的是處理器打印日志使用的格式化器
java.util.logging.SimpleFormatter.format:設置的是處理器打印日志的格式
????? 1$:代表的是執(zhí)行時間
? ? ? 2$:代表的是調用源(Jdk Log的調用源都為Jdk14LoggingImpl)
????? 3$:代表的是日志名稱
????? 4$:代表的是日志級別
????? 5$:代表的是日志內(nèi)容
????? 6$:代表的是異常信息
格式的定義需要參考java.util.Formatter類
三、引入日志配置
JDK Log提供了兩種引入日志配置的方式:
1、class配置
我們在cn.horse.demo下新建JdkLogConfig類
JdkLogConfig類:
package cn.horse.demo;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
public class JdkLogConfig {
public JdkLogConfig() {
try {
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
LogManager.getLogManager().readConfiguration(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
在程序入口(main方法)配置系統(tǒng)屬性:
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
或者在運行時配置VM參數(shù):
-Djava.util.logging.config.class=cn.horse.demo.JdkLogConfig
class配置方式更加靈活,配置來源更加多樣化,例如可以從Mysql、ldap等庫中讀取
2、file配置(不建議使用)
在程序入口(main方法)配置系統(tǒng)屬性:
System.setProperty("java.util.logging.config.file", "日志配置文件的絕對路徑(不能包含中文、空格)");
或者在運行時配置VM參數(shù):
-Djava.util.logging.config.file=日志配置文件的絕對路徑(不能包含中文、空格)
四、示例測試
測試:
這里我們查詢年齡大于21歲的所有用戶
StatementUtils.find("cn.horse.demo.UserInfoMapper.findByAge", 21);
執(zhí)行的結果如下:
2023-08-29 16:11:27.767 詳細 org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl' adapter.
2023-08-29 16:11:27.843 詳細 org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl' adapter.
2023-08-29 16:11:27.854 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.855 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-08-29 16:11:27.900 詳細 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
2023-08-29 16:11:28.058 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1379435698.
2023-08-29 16:11:28.059 詳細 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.062 詳細 cn.horse.demo.UserInfoMapper.findByAge - ==> Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ?
2023-08-29 16:11:28.094 詳細 cn.horse.demo.UserInfoMapper.findByAge - ==> Parameters: 21(Integer)
2023-08-29 16:11:28.105 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Columns: ID, name, AGE
2023-08-29 16:11:28.106 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Row: 2, 李四, 22
2023-08-29 16:11:28.108 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Row: 3, 王五, 24
2023-08-29 16:11:28.109 詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Total: 2
2023-08-29 16:11:28.110 詳細 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.113 詳細 org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@523884b2]
2023-08-29 16:11:28.114 詳細 org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1379435698 to pool.
{id: 2, name: 李四, age: 22}
{id: 3, name: 王五, age: 24}
在日志中我們可以看到預處理SQL語句,傳遞參數(shù),返回的查詢結果
2023-08-29 16:11:28.062 詳細 cn.horse.demo.UserInfoMapper.findByAge - ==> Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ?
2023-08-29 16:11:28.094 詳細 cn.horse.demo.UserInfoMapper.findByAge - ==> Parameters: 21(Integer)
2023-08-29 16:11:28.105 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Columns: ID, name, AGE
2023-08-29 16:11:28.106 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Row: 2, 李四, 22
2023-08-29 16:11:28.108 較詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Row: 3, 王五, 24
2023-08-29 16:11:28.109 詳細 cn.horse.demo.UserInfoMapper.findByAge - <== Total: 2
預處理:Preparing: SELECT ID, USERNAME name, AGE FROM T_USER WHERE AGE > ?
傳遞參數(shù):Parameters: 21(Integer)
查詢結果:Columns: ID, name, AGE
??????????? Row: 2, 李四, 22
??????????? Row: 3, 王五, 24
??????????? Total: 2
五、日志篩選
上面的日志信息打印了全部的詳細日志記錄,但是我只對SQL語句執(zhí)行的過程比較關心,其他不相關的信息只會造成干擾,我們需要修改日志的配置,才能輸出我們想要的日志信息:
handlers=java.util.logging.ConsoleHandler
.level=INFO
cn.horse.demo.UserInfoMapper.level=FINER
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n
將全局的日志級別設置為INFO, 將日志名稱以cn.horse.demo.UserInfoMapper命名空間開頭的日志級別設置為FINER
測試:
這里我們查詢年齡大于21歲的所有用戶
StatementUtils.find("cn.horse.demo.UserInfoMapper.findByAge", 21);
執(zhí)行的結果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-685471.html
?詳細日志中只保留了SQL執(zhí)行的過程文章來源地址http://www.zghlxwxcb.cn/news/detail-685471.html
到了這里,關于Mybatis 日志(JDK Log)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!