• 使用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语句的类,这里重写,把它覆盖

  • 相关阅读:
    UVa 106
    UVa 111
    UVa 105
    UVa 104
    UVa 103
    UVa 102
    UVa 101
    UVa 100
    就决定是你了!
    阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
  • 原文地址:https://www.cnblogs.com/bornteam/p/5068776.html
Copyright © 2020-2023  润新知