您的位置:首页 > 数据库

项目配置p6spy打印ibatis的完整sql

2015-05-31 13:38 323 查看
项目使用ibatis,开启了打印sql功能,可是打印到控制台的sql中带有? , 例如:

select o.id,o.orgName,o.hrCode,o.hrpCode,o.displayName from T_UAM_STAFF s where s.hrStatus<? and s.userId=? and s.locked=?

想要在数据库中执行该sql,需要知道sql的参数值,并手工改sql的? 为实际值,有时还要使用 ' ' 包裹字符串类的数据,在插入数据时有时需要写很多值.十分不方便.

可以使用p6spy开源框架来打印sql,效果如下:

select o.id,o.orgName,o.hrCode,o.hrpCode,o.displayName from T_UAM_STAFF s where s.hrStatus<3 and s.userId=208736283 and s.locked=0

配置如下:

1、将p6spy.jar放到lib下,引入工程。

2、将spy.properties放到src下,最后部署到类路径下。

在官网下载的文件中添加如下内容:

logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat

appender=com.p6spy.engine.spy.appender.StdoutLogger

databaseDialectDateFormat=yy-MMM-dd hh:mm:ss,SSS

3 、修改spring-default.xml文件,

<!--添加 配置p6spy -->

<bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource">

<constructor-arg>

<ref local="talkwebDataSource"/>

</constructor-arg>

</bean>

修改配置:

<bean class="com.talkweb.ecm.business.util.datasource.DynamicDataSource"

id="dataSource">



<bean class="com.talkweb.ecm.business.util.datasource.DynamicDataSource"

id="talkwebDataSource">

4.公司配置ibatis的日志级别为debug才打印了sql,如果觉得日志太多影响调试可以修改下配置级别(可选)

修改log4j.properties中log4j.logger.com.ibatis配置节中debug为info即可.

注:使用p6spy不仅可打印ibatis中的sql,在和hibernate集成时也可打印sql.

参考文章:http://copperfield.iteye.com/blog/1144369
http://blog.csdn.net/blackwingzhong/article/details/3858356
深入研究及扩展:
http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/
遇到的问题及解决办法:

1.下载jar时打不开官网,估计是被墙掉了.

在maven上找了一下找到了最新的的p6spy-2.1.4.jar ,下载那个zip包,里面有jar包,spy.properties文件和源代码.

2.按照大多数配置的方法进行配置启动报错,主要参考:http://copperfield.iteye.com/blog/1144369

1、添加p6spy.jar。

2、将spy.properties放到src下,最后部署到类路径下。

3、修改database.properties中的数据库驱动,如:database.connection.driver=com.p6spy.engine.spy.P6SpyDriver

4、修改spy.properties中的属性:

realdriver=oracle.jdbc.driver.OracleDriver

5、修改sql日志的输出方式,第三个是输出到控制台,第四个是输出到文件。

appender=com.p6spy.engine.logging.appender.StdoutLogger

仔细看spy.properties文件,没有发现realdriver的配置,而发现了#realdatasource和#realdatasourceclass,怀疑是网上查出的资料太老,版本是1.xx的,而我下载的jar是最新的2.14.jar的,所以配置有所改变,使用realdatasource 和realdatasourceclass替换了realdriver仍报错.

3.项目是用c3p0连接池,怀疑是连接池造成的.搜索后发现这篇文章http://blog.csdn.net/blackwingzhong/article/details/3858356

阅读公司的配置数据库文件后发现发现公司的配置中为了支持动态链接增加了自己的数据源配置.

修改配置,在c3p0和公司配置之间加入了p6spy的配置,启动正常.输出sql替换了问号

4.默认打印格式为: current time|execution time|category|statement SQL string|effective SQL string

原始sql和真正被执行的sql显示在一行了,默认的配置为:logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat

我的解决方式是,在配置文件中增加配置项:logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat

这样就能把真正执行的sql换行显示.

网上还有一种办法,自己定义一个类继承原有类,并修改打印方式,有兴趣的可以看这里:
http://wenku.baidu.com/link?url=bOCRT1z50Ew_l_cfV9jltCc88MDt3a8UO5ZZuXGEYtPrTvDsYKMXZ7-nFXmp4MTB8IcndpgXjgZhZAdu2ETjhNwHzoxjTH6tLn1Byd7WQHu
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: