一、引言
在我們日常開發工作當中,避免不了查看當前程序所執行的SQL語句,便於程序員排憂解難吶。
MP提供了兩種方式,用於輸出每條SQL語句及其執行時間,針對執行較長時間的SQL可以停止運行,有助於發現問題。
這兩種方式只適用於開發環境,不建議生產環境使用。
二、性能分析插件
該插件 3.2.0 以上版本移除,推薦使用第二種方式(執行SQL分析打印)方式。
步驟一:在MP配置類中配置該插件,並且只適用於DEV環境
/**
* @Auther: IT賤男
* @Date: 2019/6/12 15:06
* @Description: MybatisPlus配置類
*/
@Configuration
public class MyBatisPlusConfig {
/**
* SQL執行效率插件
*
* @return
*/
@Bean
@Profile({"dev"}) // 指定環境爲dev生效
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
// sql美化打印
interceptor.setFormat(true);
// 設置SQL超時時間
interceptor.setMaxTime(5000L);
return interceptor;
}
}
步驟二:設置環境爲dev,可以在yml如下配置,或者直接測試類中也是可以設置的,如圖。
spring:
profiles:
active: dev
步驟三:測試測試,在控制檯中打印selectList這個方法執行了32 ms,同時也打印了最後執行的sql語句。
@Test
public void select(){
List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getAge, 18));
users.forEach(System.out::println);
}
DEBUG==> Preparing: SELECT id,login_name,name,password,email,salt,sex,age,phone,user_type,status,organization_id,create_time,update_time,version FROM sys_user WHERE is_delete='0' AND age = ?
DEBUG==> Parameters: 18(Integer)
DEBUG<== Total: 0
Time:35 ms - ID:com.example.demo.mapper.UserMapper.selectList
Execute SQL:
SELECT
id,
login_name,
name,
password,
email,
salt,
sex,
age,
phone,
user_type,
status,
organization_id,
create_time,
update_time,
version
FROM
sys_user
WHERE
is_delete='0'
AND age = 18
三、執行SQL分析打印
這個功能依賴p6spy組件,完美的輸出打印SQL以及執行時長,支持MP3.1.0以上版本。
步驟一:引入p6spy的maven依賴
<!--SQL 分析打印-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.2</version>
</dependency>
步驟二:更改yml連接數據庫配置,主要修改driver-class-name、url中jdbc後需要加上p6spy
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://127.0.0.1:3360/test?userSSL=false
username: root
password: 123456
profiles:
active: dev
步驟三:新增spy.properties文件,內容如下,可以根據需求相對應的修改文件。
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日誌打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日誌輸出到控制檯,解開註釋就行了
# appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 指定輸出文件位置
logfile=sql.log
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前綴
useprefix=true
# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實際驅動可多個
#driverlist=org.h2.Driver
# 是否開啓慢SQL記錄
outagedetection=true
# 慢SQL記錄標準 2 秒
outagedetectioninterval=2
步驟四:輸出文件格式內容如下
Consume Time:15 ms 2019-09-20 11:50:31
Execute SQL:SELECT id,login_name,name,password,email,salt,sex,age,phone,user_type,status,organization_id,create_time,update_time,version FROM sys_user WHERE is_delete='0' AND age = 18