灵活控制 Hibernate 的…
来源:互联网 发布:虎嗅 源码 编辑:程序博客网 时间:2024/06/05 01:51
我们在使用Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够。默认时 Hibernate 执行的 SQL语句是打印在控制台上的,它也可以配置为输出给 Log4J 或是Log4Back,还能显示出更详细的参数和取值信息。这里简单讲来。
Hibernate 的配置文件 hibernate.cfg.xml 里提供有三个有关显示 SQL 的配置项,如果是与Spring 联合,也可以配置到 Spring 的配置中。它们的取值是 boolean 值。
1) hibernate.show_sql - 是否显示所生成 SQL 语句,我们最常和它打交道
2) hibernate.format_sql - 是否格式化生成的 SQL 语句,增加可读性,不然全挤在一行
3) hibernate.use_sql_comments - 是否显示注释,用以指出什么操作产生的 SQL语句,相比上面两条而言,这个配置会稍稍陌生些
Hibernate:
hibernate.show_sql 控制全局是否显示生成的 SQL 语句,hibernate.format_sql格式化后的效果如上,不然就是一行,而 hibernate.use_sql_comments 输出的是红色的部分,表明是在加哉securities 集合时所执行的 SQL 语句。
Hibernate 默认是把 SQL语句是输出到控制台,而控制台中的内容查阅起来并不方便,例如超过控制台缓存的内容会被清掉,不是谁都能看到控制台,难以与时间关联起来。虽然有些应用服务器会把控制台输出重定向到文件,但总没有Log4J 或 Slf4J 那样的专业日志工具来得便捷。
因为 Hibernate 在输出 SQL 时使用的 logger 名为 org.hibernate.SQL, 所以想要让 SQL语句输出到 Log4J 或是 Slf4J 日志中(日志文件或是记在别处,由 Appender 决定的),只要在log4j.properties(log4j.xml 参考相应配置) 中加上:
记得同时把 Hibernate 配置文件中(或者 Spring 中关于 Hibernate 的配置中) 的hibernate.show_sql 设置为 false,不然可能在控制台下会有双份输出(Log4J 配置了ConsoleAppender 时)。
如果就用的是 Log4Back 的话,就在 Log4Back 的配置文件 log4back.xml 中加上:
这时的日志输出格式与控制台下没多少分别,只是跟着 Log4J 或 Slf4J 跑而已,像:
20:13:40.757 [http-8080-1] DEBUGorg.hibernate.SQL -
只有红色部分不同,应用上了 Log4J 或 Slf4J 的配置了,可以看到执行的时间、线程等相关信息。
我们想知道前面输出的 SQL 语句中的 ? 参数代表的实际值是什么,还需要打开一个日志org.hibernate.type.descriptor.sql.BasicBinder 的输出级别为 TRACE,这里同时把org.hibernate.type.descriptor.sql.BasicExtractor 的输出级别也设置为TRACE,来看看效果:
log4j.properties 中配置为:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.
logback.xml 中配置为:
之后看输出:
20:13:40.710 [http-8080-1] DEBUG org.hibernate.SQL -
20:13:40.710 [http-8080-1] TRACEorg.hibernate.type.descriptor.sql.BasicBinder - binding parameter[1] as [INTEGER] - 10
20:13:40.710 [http-8080-1] TRACEorg.hibernate.type.descriptor.sql.BasicExtractor - found [1002] ascolumn [id3_0_]
20:13:40.710 [http-8080-1] TRACEorg.hibernate.type.descriptor.sql.BasicExtractor - found [10] ascolumn [post1_7_1_]
红色部分是 org.hibernate.type.descriptor.sql.BasicBinder=TRACE控制的,显示了绑定给 SQL 的参数列表。蓝色部分是org.hibernate.type.descriptor.sql.BasicExtractor=TRACE控制的,显示了查询后记录的字段值。注意这两个属性是要设置到 TRACE 级别,所以在一般日志的全局 DEBUG级别之下,它们会表示不受影响。
有时候想要显示查询中命名参数的值,用 :email 而不是 ? 的形式,则还需要引入两个
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
效果是这样的:
20:13:40.710 [http-8080-1]org.hibernate.engine.query.HQLQueryPlan - find: from User whereemail = :email
20:13:40.710 [http-8080-1] org.hibernate.engine.QueryParameters -named parameters:{email=fantasia@sina.com}
20:13:40.726 [http-8080-1] org.hibernate.SQL -
对上面综合一下,比较好的配置可以参考:
hibernate.cfg.xml 中配置:
<</CODE>property
name
=
"hibernate.show_sql"
>false</</CODE>property
>
<</CODE>property
name
=
"hibernate.format_sql"
>true</</CODE>property
>
<</CODE>property
name
=
"hibernate.use_sql_comments"
>true</</CODE>property
>
<</CODE>prop
key
=
"hibernate.show_sql"
>false</</CODE>prop
>
<</CODE>prop
key
=
"hibernate.format_sql"
>true</</CODE>prop
>
<</CODE>prop
key
=
"hibernate.use_sql_comments"
>true</</CODE>prop
>
而在日志配置中,如 log4j.properties 中配置:
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG
倘若用的是 Slf4J 话,就在 logback.xml 中配置:
<</CODE>logger
name
=
"org.hibernate.type.descriptor.sql.BasicBinder"
level
=
"TRACE"
/>
<</CODE>logger
name
=
"org.hibernate.type.descriptor.sql.BasicExtractor"
level
=
"TRACE"
/>
<</CODE>logger
name
=
"org.hibernate.SQL"
level
=
"DEBUG"
/>
<</CODE>logger
name
=
"org.hibernate.engine.QueryParameters"
level
=
"DEBUG"
/>
<</CODE>logger
name
=
"org.hibernate.engine.query.HQLQueryPlan"
level
=
"DEBUG"
/>
如果你会觉得日志太多的话,反正我是会这么觉得,那么可考虑把org.hibernate.type.descriptor.sql.BasicExtractor 设置为DEBUG,或不设置该配置项。
注: 本文是在 Hibernate 3.6.0 Final下做的测试,如果是用的其他版本的 Hibernate,尤其是 Hibernate 2.x可能配置很不相象了,需斟酌应对。
- 灵活控制 Hibernate 的…
- Javascript 控制 CheckBox 的全选…
- Hibernate Annotation (…
- Join语句的on 与 select xxx in…
- String 的 split …
- iBATIS, Hibernate, and…
- hibernate hql 查询指定…
- hibernate hql 查询指定…
- hibernate映射 Null val…
- 使用myeclipse的hibernate r…
- open(/dev/ietctl, O_RDWR) 控制…
- 如何灵活运用SQL Server 2005 SSIS…
- 我们正在忘却的传统文化 …
- buildbot + bazaar + mysql的测试…
- 图论: 经典的邻接矩阵 + dijkstra …
- 当 今 中 国 的 深 层 悲 剧(转载…
- Lesson 1 A Puma at large 逃遁的…
- 一个米农对 百度 与 谷歌 的评价 …
- tomcat部署项目的几种方式
- tomcat 中部署java web项目
- myeclipse不编译解决方法
- 事物管理
- 设置健康的myeclipse工作区背景色
- 灵活控制 Hibernate 的…
- 使用MyEclipse将项目打成jar包和wa…
- 日志记录的作用和方法
- JBPM API
- jbpm 总结
- Myeclipse10下搭建SSH框架(图解)St…
- 怎样将jpg转成pdf格式
- hibenate集合映射
- Hibernate反向工程使用心得