在系统开发过程中,涉及到数据库操作都是SQL的天下,基于ORM的各类框架来简化开发;在JPA/Hibernate方案中,只提供了SQL的打印输出,但并未输入SQL的参数值是多少,这里将解决这个问题,告知具体如何来实现这个操作。

1.  技术栈的介绍

JDK 1.8,  Spring Boot 2.0.3.RELEASE, Mysql 5.7

2.  依赖包

Spring Boot中的JPA依赖包:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>com.googlecode.log4jdbc</groupId><artifactId>log4jdbc</artifactId><version>1.2</version>
</dependency>

3. log4jdbc的介绍

log4jdbc使用SLF4J(Simple Logging Facade For Java)作为日志系统。特性:

  • 支持JDBC3和JDBC4,其中JDBC3对应于JDK 1.4 or 1.5,JDBC4要求JDK 1.6或以上。
  • 支持现有大部分JDBC驱动。
  • 易于配置(在大部分情况下,只需要改变驱动类名并在jdbc url前加上”jdbc:log4“,设置好日志输出级别)。
  • 能够自动把SQL变量值加到SQL输出日志中,改进易读性和方便调试。
  • 能够快速标识出应用程序中执行比较慢的SQL语句。
  • 能够生成SQL连接数信息帮助识别连接池/线程问题。

综合一句话,log4jdbc可以帮我们实现一个抓取SQL中实际使用值的功能。

4.  Spring Boot示例

application.properties内容:

spring.datasource.driver-class-name = net.sf.log4jdbc.DriverSpy
spring.datasource.url= jdbc:log4jdbc:mysql://127.0.0.1:3306/demo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123123
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.initialization-mode=neverspring.datasource.hikari.minimum-idle=0
spring.datasource.hikari.idle-timeout=10800000
spring.datasource.hikari.max-lifetime=21600000
spring.datasource.hikari.connection-timeout=6000
spring.datasource.hikari.initialization-fail-timeout=0
spring.datasource.hikari.data-source-properties.useUnicode=true
spring.datasource.hikari.data-source-properties.characterEncoding=utf8
spring.datasource.hikari.data-source-properties.useSSL=false
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=512
spring.datasource.hikari.data-source-properties.allowMultiQueries=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=81920
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=false
spring.datasource.hikari.data-source-properties.useOldAliasMetadataBehavior=true
spring.datasource.hikari.data-source-properties.createDatabaseIfNotExist=truespring.jpa.open-in-view=false
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.hbm2ddl.import_files=data.sql
spring.jpa.show-sql=true

这里需要注意的是mysql的原来的驱动程序.driver-class-name 和mysql的url

spring.datasource.driver-class-name = net.sf.log4jdbc.DriverSpy
spring.datasource.url= jdbc:log4jdbc:mysql://127.0.0.1:3306/demo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false

将被  net.sf.log4jdbc.DriverSpy来替代,可以理解为DriverSpy做为mysql驱动的代理来捕捉SQL的信息。

数据库连接的URL需要进行修改为:

原来的: jdbc:mysql://localhost:3306/mealsystem

现在的:  jdbc:log4jdbc:mysql://localhost:3306/mealsystem

除此之外,无需额外的变化需求,其余代码都一致即可获得运行中的SQL信息。

2018-09-04 11:18:52.429  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.isValid(5) returned true
2018-09-04 11:18:52.429  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.getAutoCommit() returned true
2018-09-04 11:18:52.429  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.setAutoCommit(false) returned
Hibernate: select userpo0_.id as id1_0_0_, userpo0_.address as address2_0_0_, userpo0_.books as books3_0_0_, userpo0_.name as name4_0_0_, userpo0_.phone as phone5_0_0_ from user userpo0_ where userpo0_.id=?
2018-09-04 11:18:52.468  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.new PreparedStatement returned
2018-09-04 11:18:52.468  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.prepareStatement(select userpo0_.id as id1_0_0_, userpo0_.address as address2_0_0_, userpo0_.books as books3_0_0_, userpo0_.name as name4_0_0_, userpo0_.phone as phone5_0_0_ from user userpo0_ where userpo0_.id=?) returned net.sf.log4jdbc.PreparedStatementSpy@810bf7d
2018-09-04 11:18:52.475  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setInt(1, 1) returned
2018-09-04 11:18:52.477  INFO 10184 --- [nio-8081-exec-2] jdbc.sqlonly                             : select userpo0_.id as id1_0_0_, userpo0_.address as address2_0_0_, userpo0_.books as books3_0_0_,
userpo0_.name as name4_0_0_, userpo0_.phone as phone5_0_0_ from user userpo0_ where userpo0_.id=1 2018-09-04 11:18:52.478  INFO 10184 --- [nio-8081-exec-2] jdbc.sqltiming                           : select userpo0_.id as id1_0_0_, userpo0_.address as address2_0_0_, userpo0_.books as books3_0_0_,
userpo0_.name as name4_0_0_, userpo0_.phone as phone5_0_0_ from user userpo0_ where userpo0_.id=1 {executed in 1 msec}
2018-09-04 11:18:52.481  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.new ResultSet returned
2018-09-04 11:18:52.481  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.executeQuery() returned net.sf.log4jdbc.ResultSetSpy@2bb7b913
2018-09-04 11:18:52.489  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.next() returned true
2018-09-04 11:18:52.498  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.getString(address2_0_0_) returned bj0
2018-09-04 11:18:52.498  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.wasNull() returned false
2018-09-04 11:18:52.498  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.getString(books3_0_0_) returned [{"name": "c++", "price": 53.9}, {"name": "java", "price": 100}]
2018-09-04 11:18:52.498  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.wasNull() returned false
2018-09-04 11:18:52.538  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.getString(name4_0_0_) returned xiaoming
2018-09-04 11:18:52.538  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.wasNull() returned false
2018-09-04 11:18:52.538  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.getString(phone5_0_0_) returned ["15510062270", "15516676760"]
2018-09-04 11:18:52.538  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.wasNull() returned false
2018-09-04 11:18:52.543  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.next() returned false
2018-09-04 11:18:52.575  INFO 10184 --- [nio-8081-exec-2] jdbc.resultset                           : 2. ResultSet.close() returned
2018-09-04 11:18:52.576  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.getMaxRows() returned 0
2018-09-04 11:18:52.576  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.getQueryTimeout() returned 0
2018-09-04 11:18:52.576  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.close() returned
Hibernate: update user set address=?, books=?, name=?, phone=? where id=?
2018-09-04 11:18:52.596  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.new PreparedStatement returned
2018-09-04 11:18:52.596  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.prepareStatement(update user set address=?, books=?, name=?, phone=? where id=?) returned net.sf.log4jdbc.PreparedStatementSpy@741f652
2018-09-04 11:18:52.596  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setString(1, "bj0") returned
2018-09-04 11:18:52.597  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setString(2, "[{"name":"c++","price":53.9},{"name":"java","price":100.0}]") returned
2018-09-04 11:18:52.597  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setString(3, "xiaoming") returned
2018-09-04 11:18:52.597  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setString(4, "["15510062270","15516676760"]") returned
2018-09-04 11:18:52.597  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.setInt(5, 1) returned
2018-09-04 11:18:52.597  INFO 10184 --- [nio-8081-exec-2] jdbc.sqlonly                             : update user set address='bj0', books='[{"name":"c++","price":53.9},{"name":"java","price":100.0}]',
name='xiaoming', phone='["15510062270","15516676760"]' where id=1 2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.sqltiming                           : update user set address='bj0', books='[{"name":"c++","price":53.9},{"name":"java","price":100.0}]',
name='xiaoming', phone='["15510062270","15516676760"]' where id=1 {executed in 1 msec}
2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.executeUpdate() returned 1
2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.getMaxRows() returned 0
2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.getQueryTimeout() returned 0
2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. PreparedStatement.close() returned
2018-09-04 11:18:52.605  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.commit() returned
2018-09-04 11:18:52.605  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.setAutoCommit(true) returned
2018-09-04 11:18:52.607  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.clearWarnings() returned
2018-09-04 11:18:52.607  INFO 10184 --- [nio-8081-exec-2] jdbc.audit                               : 2. Connection.clearWarnings() returned 

可以发现其select和update语句是有具体的值存在的,额外还有执行所使用的时间。

2018-09-04 11:18:52.478  INFO 10184 --- [nio-8081-exec-2] jdbc.sqltiming                           : select userpo0_.id as id1_0_0_, userpo0_.address as address2_0_0_, userpo0_.books as books3_0_0_,
userpo0_.name as name4_0_0_, userpo0_.phone as phone5_0_0_ from user userpo0_ where userpo0_.id=1 {executed in 1 msec}2018-09-04 11:18:52.598  INFO 10184 --- [nio-8081-exec-2] jdbc.sqltiming                           : update user set address='bj0', books='[{"name":"c++","price":53.9},{"name":"java","price":100.0}]',
name='xiaoming', phone='["15510062270","15516676760"]' where id=1 {executed in 1 msec}

6. 参考资料

  • http://www.cnblogs.com/xdp-gacl/p/4081848.html
  • http://my.oschina.net/kzhou/blog/149532

Spring Boot DATA JPA抓取SQL运行时的传递进去的参数信息相关推荐

  1. Spring Boot Data JPA

    Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能. Spring Data JPA提供的接口 Repository:最顶层的接口,是一个空的接口,目的是为了统一 ...

  2. Spring Boot&JPA&Hibernate&Oracle

    在本教程中,我们将展示如何创建一个Spring Boot应用程序,该应用程序通过Hibernate与Oracle数据源进行通信. 先决条件: Eclipse IDE(最新版本) Maven的4 Jav ...

  3. 使用PostgreSQL使用Spring Boot和JPA构建基本应用

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个不平 ...

  4. spring boot 系列之四:spring boot 整合JPA

    上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...

  5. oracle tcpdump生成bpf,[20140212]linux下使用tcpdump抓取sql语句

    [20140212]linu下使用tcpdump抓取sql语句.txt 我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到" ...

  6. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

  7. Spring Boot基础学习笔记07:Spring Boot整合JPA

    文章目录 零.学习目标 1.熟悉Spring Data JPA基本语法和使用 2.掌握Spring Boot与JPA的整合使用 一.Spring Data JPA概述 1.Spring Data JP ...

  8. Spring boot整合jpa Jquery实现三级联动

    Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...

  9. Spring Boot整合JPA和人大金仓(Kingbase8)数据库

    Spring Boot整合JPA和人大金仓(Kingbase8)数据库 简介 在开发Java应用程序时,使用JPA(Java Persistence API)可以方便地进行数据库操作.而人大金仓(Ki ...

  10. Spring Boot整合Jpa多数据源

    Spring Boot整合Jpa多数据源 本文是Spring Boot整合数据持久化方案的最后一篇,主要和大伙来聊聊Spring Boot整合Jpa多数据源问题.在Spring Boot整合JbdcT ...

最新文章

  1. CNN可视化最新研究方法进展(附结构、算法)
  2. c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针
  3. boost::fusion::joint_view用法的测试程序
  4. 千万不要在深夜提交代码
  5. 产品经理装逼词汇大全
  6. Programming WCF Services翻译笔记(八)
  7. php 怎么更新浏览器缓存文件在哪里,PHP 设置动态网页在浏览器的缓存
  8. 波音737-800座位图哪个好_留学生坐飞机出国千万别选这些座位!航空公司不会告诉你的选座秘密........
  9. (原创) 心电图机静态心电自动分析算法介绍
  10. Qt将GeoJson文件转为mif文件的示例
  11. 数据库基础笔试题(附带答案)
  12. 计算机未来走向论文,计算机应用技术于目前的应用情况和未来走向
  13. word打字时后面的字会消失是什么原因?如何解决?
  14. Excel 里筛选手机号码所属运营商
  15. 开源社区“大牛”关于“开源”的大讨论
  16. 描述一系列的几何图形,包括矩形,圆形,三角形
  17. python10086查询系统_Python数字移动设备取证
  18. 力矩 torque详解
  19. 【技巧】Edge浏览器更换chrome主题、选项卡悬浮预览(开启实验功能)
  20. 夏普GP2Y1010AU0F灰尘传感器使用

热门文章

  1. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_2 RequestBody注解
  2. 阶段3 1.Mybatis_09.Mybatis的多表操作_8 mybatis多对多操作-查询角色获取角色下所属用户信息...
  3. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_02.三层架构和ssm框架的对应关系
  4. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_2_冗余的Runnable代码...
  5. Python入门之面向对象module,library,package之间区别
  6. 深度学习如何入门?知乎
  7. 很感谢你能来,不遗憾你离开(好文章)
  8. 关于一个类中方法的调用
  9. 技术分析淘宝的超卖宝贝
  10. 非常的好的协同过滤入门文章(ZZ)