Hibernate使用金仓数据库时某些功能没有模式名,实现一个自动添加模型名的拦截器Java

实现一个可以在hibernate中使用的可以给表名加模式名的拦截器。

主要是通过实现EmptyInterceptor类的onPrepareStatement方法来完成的。

该方法接收一个字符串参数sql,表示即将执行的SQL语句,返回值是修改后的SQL语句。

package cn.rengs.interceptor;

import org.hibernate.EmptyInterceptor;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class KingbaseInterceptor extends EmptyInterceptor {
    public static String schema;
    // 这个类是sql
    @Override
    public String onPrepareStatement(String sql) {
        return addSchema(sql, schema);
    }

    private String addSchema(String sql, String schema) {
        // 获取当前查询,修改,新增,删除的表名
        ArrayList<String> tableNames = getTableName(sql.toLowerCase());
        // 如果表名不为空,且不是系统表,且不是视图
        if (tableNames != null && tableNames.size() > 0) {
            for (String tableName : tableNames) {
                // 生成正则表达式
                if (tableName.indexOf(".") > -1) {
                    continue;
                }
                Pattern pattern = Pattern.compile("[\\s,](" + tableName + ")[\\s.,]");
                Matcher matcher = pattern.matcher(sql);
                while (matcher.find()) {
                    String match = matcher.group();
                    String replacement = match.replaceAll(tableName, schema + "." + tableName);
                    sql = sql.replace(match, replacement);
                }
            }
        }
        return sql;
    }
    private ArrayList<String> getTableName(String sql) {
        ArrayList<String> tableNames = new ArrayList<>();
        // 获取表名的位置
        int fromIndex = sql.indexOf("from");
        if (fromIndex > 0) {
            int whereIndex = sql.indexOf("where");
            int joinIndex = sql.indexOf("join");
            if (whereIndex > 0 && (whereIndex < joinIndex || joinIndex == -1)) {
                sql = sql.substring(fromIndex + 4, whereIndex);
                String[] sqlTableList = sql.split(",");
                for (String sqlTable : sqlTableList) {
                    tableNames.add(sqlTable.trim());
                }
            } else {
                // 获取表名
                String tableName = sql.substring(fromIndex + 4).trim();
                // 如果表名是以空格分隔的,取第一个
                if (tableName.contains(" ")) {
                    tableName = tableName.substring(0, tableName.indexOf(" "));
                }
                tableNames.add(tableName);
            }
        }
        // 获取insert into时的表名
        int insertIndex = sql.indexOf("insert into");
        if (insertIndex == 0) {
            String tableName = sql.substring(insertIndex + 11).trim();
            if (tableName.contains(" ")) {
                tableName = tableName.substring(0, tableName.indexOf(" "));
            }
            tableNames.add(tableName);
        }
        // 获取update时的表名
        int updateIndex = sql.indexOf("update");
        if (updateIndex == 0) {
            String tableName = sql.substring(updateIndex + 6).trim();
            if (tableName.contains(" ")) {
                tableName = tableName.substring(0, tableName.indexOf(" "));
            }
            tableNames.add(tableName);
        }
        // 获取delete from时的表名
        int deleteIndex = sql.indexOf("delete from");
        if (deleteIndex == 0) {
            String tableName = sql.substring(deleteIndex + 11).trim();
            if (tableName.contains(" ")) {
                tableName = tableName.substring(0, tableName.indexOf(" "));
            }
            tableNames.add(tableName);
        }

        // 获取join的表名
        String joinSql = sql + "";
        int leftIndex = joinSql.indexOf(" join ");
        while (leftIndex > -1) {
            String tableName = joinSql.substring(leftIndex + 6).trim();
            if (tableName.contains(" ")) {
                tableName = tableName.substring(0, tableName.indexOf(" "));
            }
            tableNames.add(tableName);
            joinSql = joinSql.substring(leftIndex + 4);
            leftIndex = joinSql.indexOf("join");
        }

        return tableNames;
    }

}


评论列表
0/1000
共 0 评论