J2EE开发中,特别是使用了Hibernate的项目,在开发阶段,有时候开发人员想看看程序执行的时候实际执行的SQL和动态SQL传入的参数情况,以调试和判断程序逻辑。本文总结下怎么实现,希望对你有用。~
hibernate打开SQL显示
这个比较简单,大多说人都知道,呵呵,配置如下:
hibernate.show_sql=true
hibernate.format_sql=false
使用log4jdbc
log4jdbc打印执行的SQL(包括参数)和输出数据(有点想MYSQL的CMD命令执行结果)
log4jdbc是在JDBC层切入,打印出实际执行的SQL语句和数据库返回数据,所以,就算不是使用Hibernate也可以使用,因为涉及数据库JDBC驱动的变更,建议在开发环境使用。
http://code.google.com/p/log4jdbc/
1.Maven 依赖(官方在googlecode,目前没有,按springside的文档,使用下面这个代替,测试了OK):
<dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId> <version>0.2.7</version> </dependency>
2.数据库连接配置修改为:
# 自使用驱动,但是请确保你url里面配置数据库对应的驱动是存在的。
jdbc.driver=net.sf.log4jdbc.DriverSpy
# 前端修改为jdbc:log4jdbc
jdbc.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
3.log4j配置,按组件的需求进行输出
# log4jdbc
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.sqlonly=INFO
结果如下:
17:27:07,488 INFO [jdbc.sqltiming] - <select contenttyp0_.id as id3_1_, contenttyp0_.name as name3_1_, contenttyp0_.parentid as parentid3_1_,
contenttyp0_.remrk as remrk3_1_, contenttyp1_.id as id3_0_, contenttyp1_.name as name3_0_,
contenttyp1_.parentid as parentid3_0_, contenttyp1_.remrk as remrk3_0_ from cms_content_type
contenttyp0_ left outer join cms_content_type contenttyp1_ on contenttyp0_.parentid=contenttyp1_.id
where contenttyp0_.id=110 {executed in 2 msec}>
17:27:07,489 INFO [jdbc.resultsettable] - <|---------|---------|-------------|----------|-------|---------|-------------|>
17:27:07,489 INFO [jdbc.resultsettable] - <|ID3_1_ |NAME3_1_ |PARENTID3_1_ |REMRK3_1_ |ID3_0_ |NAME3_0_ |PARENTID3_0_ |>
17:27:07,489 INFO [jdbc.resultsettable] - <|---------|---------|-------------|----------|-------|---------|-------------|>
17:27:07,490 INFO [jdbc.resultsettable] - <|[unread] |JAVA5 |103 |null |103 |[unread] |[unread] |>
17:27:07,490 INFO [jdbc.resultsettable] - <|---------|---------|-------------|----------|-------|---------|-------------|>
安逸~~