使用Hibernate 拦截执行sql语句,并输出sql语句,获取sql语句详解编程语言

重建包名

org.hibernate.type.descriptor.sql

重建类BasicBinder 

代码如下

package org.hibernate.type.descriptor.sql; 
 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
 
import org.hibernate.internal.CoreLogging; 
import org.hibernate.type.descriptor.JdbcTypeNameMapper; 
import org.hibernate.type.descriptor.ValueBinder; 
import org.hibernate.type.descriptor.WrapperOptions; 
import org.hibernate.type.descriptor.java.JavaTypeDescriptor; 
import org.jboss.logging.Logger; 
 
public abstract class BasicBinder<J> implements ValueBinder<J>{ 
 
    private static final Logger log = CoreLogging.logger( BasicBinder.class ); 
 
    private static final String BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [%s]"; 
    private static final String NULL_BIND_MSG_TEMPLATE = "binding parameter [%s] as [%s] - [null]"; 
 
	private final JavaTypeDescriptor<J> javaDescriptor; 
	private final SqlTypeDescriptor sqlDescriptor; 
 
	public JavaTypeDescriptor<J> getJavaDescriptor() { 
		return javaDescriptor; 
	} 
 
	public SqlTypeDescriptor getSqlDescriptor() { 
		return sqlDescriptor; 
	} 
 
	public BasicBinder(JavaTypeDescriptor<J> javaDescriptor, SqlTypeDescriptor sqlDescriptor) { 
		this.javaDescriptor = javaDescriptor; 
		this.sqlDescriptor = sqlDescriptor; 
	} 
 
	@Override 
	public final void bind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException { 
        final boolean traceEnabled = log.isTraceEnabled(); 
       
        if ( value == null ) { 
            if ( traceEnabled ) { 
                log.trace( 
						String.format( 
								NULL_BIND_MSG_TEMPLATE, 
								index, 
								JdbcTypeNameMapper.getTypeName( getSqlDescriptor().getSqlType() ) 
						) 
				); 
            } 
            st.setNull( index, sqlDescriptor.getSqlType() ); 
        } 
        else { 
            if ( traceEnabled ) { 
                log.trace( 
						String.format( 
								BIND_MSG_TEMPLATE, 
								index, 
								JdbcTypeNameMapper.getTypeName( sqlDescriptor.getSqlType() ), 
								getJavaDescriptor().extractLoggableRepresentation( value ) 
						) 
				); 
            } 
             
            doBind( st, value, index, options ); 
        } 
        
        System.out.println(st.toString()); 
	} 
 
	/** 
	 * Perform the binding.  Safe to assume that value is not null. 
	 * 
	 * @param st The prepared statement 
	 * @param value The value to bind (not null). 
	 * @param index The index at which to bind 
	 * @param options The binding options 
	 * 
	 * @throws SQLException Indicates a problem binding to the prepared statement. 
	 */ 
	protected abstract void doBind(PreparedStatement st, J value, int index, WrapperOptions options) throws SQLException; 
 
 
} 

  因为在hibernate机制中,就是用这个类是是执行更新插入sql语句的类,这里重写,把它覆盖

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16861.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论