完美的分表分库方案还未实现
程序员文章站
2022-07-13 08:15:15
...
我在使用jsqlparser解析sql,然后通过解析进行命名转换,做一些orm映射、分表分库功能
http://jsqlparser.sourceforge.net/
之前写了一部分,现在想重写。但是对于jsqlparser使用的访问者模式再加上sql自身语句的特点无从下手。
例如:String statement = "select * from Hero h where h.id in (select userId from User where h.id in (select id from Hero))";
先不看sql的问题,如果把这个sql解析掉应该变为
"select * from t_hero h where h.id in (select user_id from t_user where h.id in (select id from t_hero))";
关键问题来了:1、jsqlparser转换得到的javabean是一个Statement 通过访问者模式访问其属性
访问者模式没办法向内部传递参数,这样一来想把userId 转换成user_id 可以说是没有办法的,
这个是访问column的方法
public void visit(Column tableColumn) {
String tableName = tableColumn.getTable().getWholeTableName();
}
tableColumn的属性table 为空
当然,作为一个Column 自然在sql中有一个所属的table,例如上面的User(t_user)现在,通过jsqlparser转换的bean是不存在这一层关系的。
而我要做的就是通过改造加上这一层关系。
但是我被访问者模式给搞糊涂了,貌似访问者模式只能通过内部访问外部对象,外部无法窥探内部属性。我的理解是,他只能改变自己,而且只能利用方法的参数来处理
而且参数被限定了就如上面的 public void visit(Column tableColumn)
而Column的信息有太少了,导致无法处理Column与Table之间的关系,也就无法修改命名规则
http://jsqlparser.sourceforge.net/
之前写了一部分,现在想重写。但是对于jsqlparser使用的访问者模式再加上sql自身语句的特点无从下手。
例如:String statement = "select * from Hero h where h.id in (select userId from User where h.id in (select id from Hero))";
先不看sql的问题,如果把这个sql解析掉应该变为
"select * from t_hero h where h.id in (select user_id from t_user where h.id in (select id from t_hero))";
关键问题来了:1、jsqlparser转换得到的javabean是一个Statement 通过访问者模式访问其属性
访问者模式没办法向内部传递参数,这样一来想把userId 转换成user_id 可以说是没有办法的,
这个是访问column的方法
public void visit(Column tableColumn) {
String tableName = tableColumn.getTable().getWholeTableName();
}
tableColumn的属性table 为空
当然,作为一个Column 自然在sql中有一个所属的table,例如上面的User(t_user)现在,通过jsqlparser转换的bean是不存在这一层关系的。
而我要做的就是通过改造加上这一层关系。
但是我被访问者模式给搞糊涂了,貌似访问者模式只能通过内部访问外部对象,外部无法窥探内部属性。我的理解是,他只能改变自己,而且只能利用方法的参数来处理
而且参数被限定了就如上面的 public void visit(Column tableColumn)
而Column的信息有太少了,导致无法处理Column与Table之间的关系,也就无法修改命名规则
实际上之前的bolg已经陆陆续续的实现了这种切分功能,但是感觉还是不好,主要原因是对于jsqlparser转换的bean处理不当,希望同样研究过的朋友交流下