在网上可能很多人问到到底怎么查看hibernate生成的SQL参数值,可以看到非常多的方法,最多的就是说下载一个P6SPY来查看,其实只要自己看看hibernate的源代码,就可以发现,hibernate所有的参数值的设置都是交由org.hibernate.type.descriptor.ValueBinder接口上的bind方法进行绑定。而在ValueBinder的子类BasicBinder的bind方法上面有一段代码:
if ( LOG.isTraceEnabled() ) {
LOG.trace(
String.format(
BIND_MSG_TEMPLATE,
index,
JdbcTypeNameMapper.getTypeName( sqlDescriptor.getSqlType() ),
getJavaDescriptor().extractLoggableRepresentation( value )
)
);
}
这段代码的含义我想所有人都能看得懂吧,如果开启了trace级别的日志,那么就把参数的类型和值输出,所以,最简单,最正确的做法是,在log4j中开启对org.hibernate.type的TRACE(而不是网上很多人说的DEBUG)日志输出级别就可以啦:
<logger name="org.hibernate.type.descriptor.sql">
<level value="TRACE"></level>
<appender-ref ref="console"/>
</logger>
控制台输出:
721 [main] DEBUG org.hibernate.SQL - insert into Department (name) values (?)
731 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - d1
741 [main] DEBUG org.hibernate.SQL - insert into Department (name) values (?)
741 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - d2
751 [main] DEBUG org.hibernate.SQL - insert into Department (name) values (?)
751 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - d3
751 [main] DEBUG org.hibernate.SQL - insert into Employee (DEPT_ID) values (?)
761 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - 2
843 [main] DEBUG org.hibernate.SQL - select department0_.id as id1_0_0_, department0_.name as name2_0_0_ from Department department0_ where department0_.id=?
853 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [BIGINT] - 1
这不所有东西都输出来了么?