zoukankan      html  css  js  c++  java
  • 使用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语句的类,这里重写,把它覆盖

  • 相关阅读:
    关于ORALE将多行数据合并成为一行 报错未找到where关键字
    Input限制输入数字
    Dev Gridcontrol每行添加序号或者文本。
    Android studio SDK配置
    介数中心性快速计算
    Buuoj 被嗅探的流量
    Docker安装(win10)
    filter CTF
    MySQLdb._exceptions.OperationalError: (2026, 'SSL connection error: unknown error number')
    DNS解析原理(www.baidu.com)
  • 原文地址:https://www.cnblogs.com/bornteam/p/5068776.html
Copyright © 2011-2022 走看看