一、mybatis方式
在你的application.yml文件下面加入下面這段代碼
mybatis configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
項目啟動在你的控制台看到上面這種就說明配置成了:
打印出來的形式如下
Creating a new SqlSession Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e943ddb] JDBC Connection [HikariProxyConnection@898692052 wrapping com.mysql.jdbc.JDBC4Connection@6a0c5a04] will be managed by Spring ==> Preparing: DELETE FROM user_info WHERE uid in ( ? , ? , ? ) ==> Parameters: 44(Long), 45(Long), 46(Long) <== Updates: 0 Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e943ddb] Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e943ddb] Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e943ddb] Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e943ddb]
二、日志方式
在你的application.yml文件下面加入下面這段代碼
logging:
level:
com.seamax.bdsearch.dao: DEBUG
注意:com.seamax.bdsearch.dao = 你的mapper包。
打印出來的形式如下:
2019-01-24 08:02:14.245 [http-nio-8060-exec-2] DEBUG c.s.a.m.m.U.getUsernameExistSet 159 - ==> Preparing: SELECT username FROM user_info WHERE username in ( ? , ? , ? ) 2019-01-24 08:02:14.245 [http-nio-8060-exec-2] DEBUG c.s.a.m.m.U.getUsernameExistSet 159 - ==> Parameters: nike16(String), nike14(String), nike15(String) 2019-01-24 08:02:14.307 [http-nio-8060-exec-2] DEBUG c.s.a.m.m.U.getUsernameExistSet 159 - <== Total: 0 2019-01-24 08:02:14.323 [http-nio-8060-exec-2] DEBUG c.s.a.m.mapper.UserMapper.saveBatch 159 - ==> Preparing: INSERT INTO user_info ( username, password, email, telphone, birthday, createTime, updateTime ) values ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? ) 2019-01-24 08:02:14.323 [http-nio-8060-exec-2] DEBUG c.s.a.m.mapper.UserMapper.saveBatch 159 - ==> Parameters: nike14(String), 4f757a334d69b32b586f3694fbaaa9a9869aee184f98e009b6e02b170f92eb9f(String), hgaha@qq.com(String), null, 2018-03-02 02:01:02.0(Timestamp), 2019-01-24 08:02:14.307(Timestamp), 2019-01-24 08:02:14.307(Timestamp), nike15(String), 18a1c9f3e7a69e3f72ab5d80caea96e5c90f5fada8f9a7e92238dc4242ba03f8(String), hgaha@qq.com(String), null, 2018-03-02 02:01:02.0(Timestamp), 2019-01-24 08:02:14.307(Timestamp), 2019-01-24 08:02:14.307(Timestamp), nike16(String), 5912bd4ff3ae134b15347610b64d9f352dd3c89dd2fb5c495cf4699683b33271(String), hgaha@qq.com(String), null, 2018-03-02 02:01:02.0(Timestamp), 2019-01-24 08:02:14.307(Timestamp), 2019-01-24 08:02:14.307(Timestamp) 2019-01-24 08:02:14.338 [http-nio-8060-exec-2] DEBUG c.s.a.m.mapper.UserMapper.saveBatch 159 - <== Updates: 3
三、log4jdbc-log4j2使用
有時候我們程序的接口比較耗時,需要優化,這時我們可能需要了解該接口執行了哪些sql語句以及耗時
1.引入jar包
<!--監控sql日志--> <dependency> <groupId>org.bgee.log4jdbc-log4j2</groupId> <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId> <version>1.16</version> </dependency>
2.引入配置文件 log4jdbc.log4j2.properties
內容為:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
3.logback-spring.xml 里加入如下內容
<logger name="jdbc.connection" level="OFF"/> <logger name="jdbc.resultset" level="OFF"/> <logger name="jdbc.resultsettable" level="OFF"/> <logger name="jdbc.audit" level="OFF"/> <!--ps:sqltiming和sqlonly差別是多打印了sql語句的耗時,如果不想要這個時間可以修改篩選里面的項。--> <logger name="jdbc.sqltiming" level="INFO"/> <logger name="jdbc.sqlonly" level="OFF"/>
4.配置文件中修改部分屬性值
如圖:
即:
driver-class-name 修改為:net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url 修改為:jdbc:log4jdbc:mysql:// (在原來的jdbc后面加了:log4jdbc:)
---------------------------------------------------------------------------
以上完成任務,下面看下效果
---------------------------------------------------------------------------
注意:除了打印sql執行時間外,打印的sql語句是包含sql所帶的參數的,select語句的話where后面帶參數值,insert語句的話插入對象的值都有
四、p6spy使用
1.導入依賴
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.8.6</version> </dependency>
2.修改application.properties中的數據庫驅動和url
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver #spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=true #更換為com.p6spy.engine.spy.P6SpyDriver spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/data?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=true spring.datasource.username=root spring.datasource.password=123456
3.在application.properties同級目錄下創建spy.properties配置文件
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定義日志打印 logMessageFormat=com.fkzd.framework.config.P6spySqlFormatConfig //自定義P6SpyLogger類的地址 # 使用日志系統記錄sql appender=com.p6spy.engine.spy.appender.StdoutLogger ## 配置記錄Log例外 excludecategories=info,debug,result,batc,resultset # 設置使用p6spy driver來做代理 deregisterdrivers=true # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 實際驅動 driverlist=com.mysql.cj.jdbc.Driver # 是否開啟慢SQL記錄 outagedetection=true # 慢SQL記錄標准 秒 outagedetectioninterval=2
4.自定義sql輸出
import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import com.fkzd.common.utils.DateUtils; import org.apache.commons.lang3.StringUtils; import java.util.Date; /** * 自定義 p6spy sql輸出格式 * */ public class P6spySqlFormatConfig implements MessageFormattingStrategy { /** * 過濾掉定時任務的 SQL */ @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { return StringUtils.isNotBlank(sql) ? DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", new Date()) + " | 耗時 " + elapsed + " ms | SQL 語句:" + StringUtils.LF + sql.replaceAll("[\\s]+", StringUtils.SPACE) + ";" : ""; } }
執行效果