使用hibernate拦截sql语句并输出获取sql语句

来源:互联网 发布:徐老师的淘宝店二维码 编辑:程序博客网 时间:2024/05/17 23:30

使用Hibernate 拦截执行sql语句,并输出sql语句,获取sql语句

重建包名

org.hibernate.type.descriptor.sql

重建类BasicBinder 

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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语句的类,这里重写,把它覆盖

       原文地址:https://www.cnblogs.com/bornteam/p/5068776.html

转载请声明出处

原创粉丝点击