目前可以使用MyDaoInterceptor implements DaoInterceptor实现了自定义sql的部分,但是insert(对象)不知道该怎么写,代码如下:
public class MyDaoInterceptor implements DaoInterceptor {
public void filter(DaoInterceptorChain chain) throws DaoException {
DaoStatement st = chain.getDaoStatement();
if (st instanceof NutPojo) {
NutPojo nutpojo=(NutPojo) st;
nutpojo.setBefore(new PojoCallback() {
@Override
public Object invoke(Connection conn, ResultSet rs, Pojo pojo, Statement stmt) throws SQLException {
System.out.println(pojo);
return null;
}
});
// 如果是dao.insert(user)之类的操作,会进入这个分支
} else if (st instanceof NutSql) {
// 如果是自定义SQL,会进入这个分支
Saas_tenant_app saas=SaasCache.getApp();
Saas_tenant_app_allocate_resource res=saas.getRes().get(DynamicDataSourceHolder.db_resource_code);
String dbinstance=res.getDatabase_name();
NutSql nutsql=(NutSql) st;
String sql=nutsql.getSourceSql();
//使用sql解析器改造sql
// 新建 MySQL Parser
SQLStatementParser parser = new MySqlStatementParser(sql);
// 使用Parser解析生成AST,这里SQLStatement就是AST
SQLStatement sqlStatement = parser.parseStatement();
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
sqlStatement.accept(visitor);
Map mapTable = visitor.getTables();
for (Map.Entry entry : mapTable.entrySet()){
sql = sql.replace(entry.getKey().getName(), dbinstance + "."+entry.getKey().getName());
}
nutsql.setSourceSql(sql);
}
chain.doChain();//继续下一个拦截器执行
}
}