欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

完美的分表分库方案还未实现  

程序员文章站 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之间的关系,也就无法修改命名规则



实际上之前的bolg已经陆陆续续的实现了这种切分功能,但是感觉还是不好,主要原因是对于jsqlparser转换的bean处理不当,希望同样研究过的朋友交流下