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 评论