java解析sql的数据流向关系获取

/**

* @Auther: LGH

* @Date: 2023/11/29 09:15

* @Description:

*/

public class AnalysisDruidSqlUtil {

public static void main(String[] args) {

String sql ="\n" +

"INSERT INTO DMT.M_CQJC_RKSJ_LHQRKJCXXB\n" +

"(ENTITY_ID,\n" +

"ENTITY_NAME,\n" +

"ID,\n" +

"NAME,\n" +

"NAME_EN,\n" +

"CARD_NO,\n" +

"CARD_TYPE,\n" +

"SEX,\n" +

"BIRTHDAY,\n" +

"AGE,\n" +

"TEL,\n" +

"NATIONALITY,\n" +

"NATION,\n" +

"HYZK,\n" +

"POLITICS,\n" +

"EDU_LEVEL,\n" +

"PRINARY_SCHOOL,\n" +

"MIDDLE_SCHOOL,\n" +

"GRANDUATED_SCHOOL,\n" +

"NATIVE_PLACE,\n" +

"HUJI_PLACE,\n" +

"HUJI_TYPE,\n" +

"HUJI_PROVINCE,\n" +

"HUJI_CITY,\n" +

"HUJI_DISTRICT,\n" +

"HUJI_STREET,\n" +

"HUJI_COMMUNITY,\n" +

"HUJI_ADDRESS,\n" +

"YHZGX,\n" +

"HOME_ADDR,\n" +

"STREET_CODE,\n" +

"STREET,\n" +

"COMMUNITY_CODE,\n" +

"COMMUNITY,\n" +

"GRID_CODE,\n" +

"GRID,\n" +

"BUILDING_CODE,\n" +

"BUILDING,\n" +

"BUILDING_TYPE,\n" +

"HOUSE_CODE,\n" +

"ROOMNO,\n" +

"HOUSEDEUSE,\n" +

"HOUSESTAIR,\n" +

"JU_TYPE,\n" +

"ZHUSUO_TYPE,\n" +

"ADDTIME,\n" +

"SHBXH,\n" +

"DWSBBH,\n" +

"CBLX,\n" +

"SBDQZT,\n" +

"SBQT,\n" +

"MATE_CARDNO,\n" +

"MATE_NAME,\n" +

"MATE_HUJI_TYPE,\n" +

"FA_CARDNO,\n" +

"FA_NAME,\n" +

"FA_HUJI_TYPE,\n" +

"MO_CARDNO,\n" +

"MO_NAME,\n" +

"MO_HUJI_TYPE,\n" +

"GLORIOUS_PERMIT_NUMBER,\n" +

"STATISTICS_NUMBER,\n" +

"COMPANY,\n" +

"TYSHXYDM,\n" +

"COMPANY_ADDR_DISTRICT,\n" +

"COMPANY_ADDR,\n" +

"COMPANYTEL,\n" +

"GJJ_NO,\n" +

"GJJ_STATUS,\n" +

"GLJT_LEVEL,\n" +

"YLBZ_LEVEL,\n" +

"SFJZRK,\n" +

"SFLDRK,\n" +

"SFCZRK,\n" +

"SFGLRK,\n" +

"SFGLJT,\n" +

"SFTXRY,\n" +

"SFDBRY,\n" +

"SFLXRY,\n" +

"SFRCYJ,\n" +

"SFGCCZY,\n" +

"SFCJ,\n" +

"SFJS,\n" +

"SFZXXS,\n" +

"SFDJ,\n" +

"SFYLBZ,\n" +

"SFSW,\n" +

"SFWG,\n" +

"SFQY,\n" +

"SFSI,\n" +

"DATA_SOURCE,\n" +

"BY1,\n" +

"BY2,\n" +

"BY3,\n" +

"BY4,\n" +

"BY5,\n" +

"SYS_BULIDING_TIME,\n" +

"CJLB,\n" +

"CJDJ,\n" +

"SFDY,\n" +

"SFGAT,\n" +

"SFTYJR,\n" +

"SFBMDRK,\n" +

"SFSY,\n" +

"SFDBH,\n" +

"SFGE,\n" +

"SFYG,\n" +

"SFLS,\n" +

"SFFLYZ,\n" +

"SFSFJDR,\n" +

"SFSG,\n" +

"SFGQ,\n" +

"SFKJET,\n" +

"SFWRFY,\n" +

"SFSHJJDX,\n" +

"TZQYS,\n" +

"QYFRSL,\n" +

"ZYZSSL,\n" +

"SFBSH ,\n" +

"SFJSZG_KJ ,\n" +

"SFJSZG_WS ,\n" +

"SFZYZG_HS ,\n" +

"SFJSZG_JSJ ,\n" +

"SFZYZG_SHGZ,\n" +

"SFZYZG_YH ,\n" +

"SFSJZS ,\n" +

"SFKCSJZCGCS,\n" +

"SFZYYS ,\n" +

"SFZCAQGCS ,\n" +

"SFYFYZYZG ,\n" +

"SFZJGCS ,\n" +

"SFJLGCS ,\n" +

"SFSWS ,\n" +

"SFJSZG_SJ ,\n" +

"SFZYZG_FCJJ,\n" +

"SFZCXFGCS ,\n" +

"SFJSZG_JJZY,\n" +

"SFZCJZS ,\n" +

"SFZYZG_GCZX,\n" +

"SFZDJB ,\n" +

"SFZYZG_JS ,\n" +

"DAT_DT,\n" +

"ETL_DT,\n" +

"GLDM_STA_DT,\n" +

"GLDM_END_DT,\n" +

"GLDM_DEL_FLAG,\n" +

"DSES_UUID)\n" +

"WITH T6 AS\n" +

" (SELECT /*+ PARALLEL(8)*/\n" +

" CARD_NO,\n" +

" SHBXH,\n" +

" DWSBBH,\n" +

" CBLX,\n" +

" SBDQZT,\n" +

" COMPANY,\n" +

" TYSHXYDM,\n" +

" SSQY,\n" +

" JYCS,\n" +

" FRLXDH\n" +

" FROM (SELECT /*+ PARALLEL(8)*/\n" +

" CARD_NO,\n" +

" SHBXH,\n" +

" DWSBBH,\n" +

" CBLX,\n" +

" SBDQZT,\n" +

" COMPANY,\n" +

" TYSHXYDM,\n" +

" SSQY,\n" +

" JYCS,\n" +

" FRLXDH,\n" +

" ROW_NUMBER() OVER(PARTITION BY CARD_NO ORDER BY UPDATETIME DESC) RN\n" +

" FROM SUM.C_RKK_SBXX_LHGRSBXXB\n" +

" WHERE CARD_NO IS NOT NULL)\n" +

" WHERE RN = 1\n" +

" AND SBDQZT = '正常参保'),\n" +

"T8 AS\n" +

" (SELECT T.CARD_NO, T.RELATION_NAME, T.RELATION_CARD_NO, A.HUJI_TYPE\n" +

" FROM (SELECT CARD_NO,\n" +

" RELATION_NAME,\n" +

" RELATION_CARDNO RELATION_CARD_NO,\n" +

" ROW_NUMBER() OVER(PARTITION BY CARD_NO ORDER BY CARD_NO DESC) RN\n" +

" FROM SUM.C_RKK_JTXX_LHQGRGX\n" +

" WHERE RELATION = '配偶') T,\n" +

" SUM.C_RKK_JBXX_LHGMHJXXB A\n" +

" WHERE T.RELATION_CARD_NO = A.CARD_NO(+)\n" +

" AND T.RN = 1),\n" +

"T9 AS\n" +

" (SELECT T.CARD_NO, T.RELATION_NAME, T.RELATION_CARD_NO, A.HUJI_TYPE\n" +

" FROM (SELECT CARD_NO,\n" +

" RELATION_NAME,\n" +

" RELATION_CARD_NO,\n" +

" ROW_NUMBER() OVER(PARTITION BY CARD_NO ORDER BY CARD_NO DESC) RN\n" +

" FROM SUM.C_RKK_JTXX_LHQGRGXB\n" +

" WHERE RELATION = '父亲') T,\n" +

" SUM.C_RKK_JBXX_LHGMHJXXB A\n" +

" WHERE T.RELATION_CARD_NO = A.CARD_NO(+)\n" +

" AND T.RN = 1),\n" +

"T10 AS\n" +

" (SELECT T.CARD_NO, T.RELATION_NAME, T.RELATION_CARD_NO, A.HUJI_TYPE\n" +

" FROM (SELECT CARD_NO,\n" +

" RELATION_NAME,\n" +

" RELATION_CARD_NO,\n" +

" ROW_NUMBER() OVER(PARTITION BY CARD_NO ORDER BY CARD_NO DESC) RN\n" +

" FROM SUM.C_RKK_JTXX_LHQGRGXB\n" +

" WHERE RELATION = '母亲') T,\n" +

" SUM.C_RKK_JBXX_LHGMHJXXB A\n" +

" WHERE T.RELATION_CARD_NO = A.CARD_NO(+)\n" +

" AND T.RN = 1)\n" +

"SELECT /*+ PARALLEL(8)*/\n" +

" '100046' AS ENTITY_ID,\n" +

" '人口数据' AS ENTITY_NAME,\n" +

" T1.IDCODE AS ID,\n" +

" T1.NAME,\n" +

" T1.NAME_EN,\n" +

" T1.CARD_NO,\n" +

" T1.CARD_TYPE,\n" +

" T1.SEX,\n" +

" T1.BIRTHDAY,\n" +

" T1.AGE,\n" +

" CASE\n" +

" WHEN T13.CARDNO IS NOT NULL THEN\n" +

" T13.MTEL\n" +

" ELSE\n" +

" NVL(T1.MTEL, '未知')\n" +

" END TEL,\n" +

" T1.NATIONALITY,\n" +

" T1.NATION,\n" +

" T1.HYZK,\n" +

" T1.POLITICS,\n" +

" -- 个人文化程度(学历)\n" +

" CASE\n" +

" WHEN T2.CARD_NO IS NOT NULL AND T2.NJ = '幼儿园' THEN\n" +

" '幼儿园'\n" +

" WHEN T2.CARD_NO IS NOT NULL AND\n" +

" T2.NJ NOT IN ('七年级', '八年级', '九年级') THEN\n" +

" '小学'\n" +

" WHEN T2.CARD_NO IS NOT NULL AND T2.NJ IN ('七年级', '八年级', '九年级') THEN\n" +

" '初中'\n" +

" WHEN T3.CARD_NO IS NOT NULL THEN\n" +

" T3.XL\n" +

" ELSE\n" +

" T1.EDU_LEVEL\n" +

" END EDU_LEVEL,\n" +

" -- 小学学校\n" +

" CASE\n" +

" WHEN T2.CARD_NO IS NOT NULL AND\n" +

" T2.NJ NOT IN ('七年级', '八年级', '九年级') AND T2.NJ <> '幼儿园' THEN\n" +

" T2.SCHOOL\n" +

" ELSE\n" +

" '未知'\n" +

" END PRINARY_SCHOOL,\n" +

" -- 中学学校\n" +

" CASE\n" +

" WHEN T2.CARD_NO IS NOT NULL AND T2.NJ IN ('七年级', '八年级', '九年级') THEN\n" +

" T2.SCHOOL\n" +

" ELSE\n" +

" '未知'\n" +

" END MIDDLE_SCHOOL,\n" +

" NVL(T3.BYYX, '未知') GRANDUATED_SCHOOL,\n" +

" NVL(T1.NATIVE_PLACE, '未知') NATIVE_PLACE,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_PLACE\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_PLACE,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_TYPE\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_TYPE,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_PROVINCE\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_PROVINCE,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_CITY\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_CITY,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_DISTRICT\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_DISTRICT,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_STREET\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_STREET,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_COMMUNITY\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_COMMUNITY,\n" +

" CASE\n" +

" WHEN T4.CARD_NO IS NOT NULL THEN\n" +

" T4.HUJI_ADDRESS\n" +

" ELSE\n" +

" '未知'\n" +

" END HUJI_ADDRESS,\n" +

" -- 与户主关系(深户)\n" +

" T1.YHZGX YHZGX,\n" +

" NVL(T5.HOME_ADDR, '未知') HOME_ADDR,\n" +

" NVL(T5.STREET_CODE, '未知') STREET_CODE,\n" +

" NVL(T5.STREET, '未知') STREET,\n" +

" NVL(T5.COMMUNITY_CODE, '未知') COMMUNITY_CODE,\n" +

" NVL(T5.COMMUNITY, '未知') COMMUNITY,\n" +

" NVL(T5.GRID_CODE, '未知') GRID_CODE,\n" +

" NVL(T5.GRID, '未知') GRID,\n" +

" NVL(T5.BUILDING_CODE, '未知') BUILDING_CODE,\n" +

" NVL(T5.BUILDING, '未知') BUILDING,\n" +

" NVL(T5.BUILDING_TYPE, '未知') BUILDING_TYPE,\n" +

" T1.HOUSECODE,\n" +

" T5.ROOMNO,\n" +

" NVL(T5.HOUSEDEUSE, '未知') HOUSEDEUSE,\n" +

" T5.HOUSESTAIR,\n" +

" NVL(T5.JUZHU_TYPE, '未知') JUZHU_TYPE,\n" +

" NVL(T5.ZHUSUO_TYPE, '未知') ZHUSUO_TYPE,\n" +

" T5.ADDTIME,\n" +

" T6.SHBXH,\n" +

" T6.DWSBBH,\n" +

" T6.CBLX,\n" +

" T6.SBDQZT,\n" +

" -- 社保群体\n" +

" CASE\n" +

" WHEN T6.CBLX = '单位缴纳' OR T12.IDCARD IS NOT NULL THEN\n" +

" '是'\n" +

" ELSE\n" +

" '否'\n" +

" END SBQT,\n" +

" T8.RELATION_CARD_NO MATE_CARDNO,\n" +

" T8.RELATION_NAME MATE_NAME,\n" +

" T8.HUJI_TYPE MATE_HUJI_TYPE,\n" +

" T9.RELATION_CARD_NO FA_CARDNO,\n" +

" T9.RELATION_NAME FA_NAME,\n" +

" T9.HUJI_TYPE FA_HUJI_TYPE,\n" +

" T10.RELATION_CARD_NO MO_CARDNO,\n" +

" T10.RELATION_NAME MO_NAME,\n" +

" T10.HUJI_TYPE MO_HUJI_TYPE,\n" +

" '' GLORIOUS_PERMIT_NUMBER,\n" +

" '' STATISTICS_NUMBER,\n" +

" T6.COMPANY,\n" +

" T6.TYSHXYDM,\n" +

" T6.SSQY COMPANY_ADDR_DISTRICT,\n" +

" T6.JYCS COMPANY_ADDR,\n" +

" T6.FRLXDH COMPANYTEL,\n" +

" T7.GJJ_NO,\n" +

" T7.GJJ_STATUS,\n" +

" T11.GLJT_LEVEL,\n" +

" T11.YLBZ_LEVEL,\n" +

" T11.SFJZRK,\n" +

" T11.SFLDRK,\n" +

" T11.SFCZRK,\n" +

" T11.SFGLRK,\n" +

" T11.SFGLJT,\n" +

" T11.SFTXRY,\n" +

" T11.SFDBRY,\n" +

" T11.SFLXRY,\n" +

" T11.SFRCYJ,\n" +

" T11.SFGCCZY,\n" +

" T11.SFCJ,\n" +

" T11.SFJS,\n" +

" T11.SFZXXS,\n" +

" NVL(T11.SFDJ, '未知') SFDJ,\n" +

" T11.SFYLBZ,\n" +

" T11.SFSW,\n" +

" T11.SFWG,\n" +

" T11.SFQY,\n" +

" T11.SFSI,\n" +

" T1.DATA_SOURCE,\n" +

" '',\n" +

" '',\n" +

" '',\n" +

" '',\n" +

" '',\n" +

" T1.SYS_BUILDING_TIME,\n" +

" T16.CJLB,\n" +

" T16.CJDJ,\n" +

" T11.SFDY,\n" +

" T11.SFGAT,\n" +

" T11.SFTYJR,\n" +

" T11.SFBMDRK,\n" +

" T11.SFSY,\n" +

" T11.SFDBH,\n" +

" T11.SFGE,\n" +

" T11.SFYG,\n" +

" T11.SFLS,\n" +

" T11.SFFLYZ,\n" +

" T11.SFSFJDR,\n" +

" T11.SFSG,\n" +

" T11.SFGQ,\n" +

" T11.SFKJET,\n" +

" T11.SFWRFY,\n" +

" T11.SFSHJJDX,\n" +

" NVL(T17.TZQYS, 0) TZQYS,\n" +

" NVL(T18.QYFRSL, 0) QYFRSL,\n" +

" NVL(T19.ZYZSSL, 0) ZYZSSL,\n" +

" T11.SFBSH,\n" +

" T11.SFJSZG_KJ,\n" +

" T11.SFJSZG_WS,\n" +

" T11.SFZYZG_HS,\n" +

" T11.SFJSZG_JSJ,\n" +

" T11.SFZYZG_SHGZ,\n" +

" T11.SFZYZG_YH,\n" +

" T11.SFSJZS,\n" +

" T11.SFKCSJZCGCS,\n" +

" T11.SFZYYS,\n" +

" T11.SFZCAQGCS,\n" +

" T11.SFYFYZYZG,\n" +

" T11.SFZJGCS,\n" +

" T11.SFJLGCS,\n" +

" T11.SFSWS,\n" +

" T11.SFJSZG_SJ,\n" +

" T11.SFZYZG_FCJJ,\n" +

" T11.SFZCXFGCS,\n" +

" T11.SFJSZG_JJZY,\n" +

" T11.SFZCJZS,\n" +

" T11.SFZYZG_GCZX,\n" +

" T11.SFZDJB,\n" +

" T11.SFZYZG_JS,\n" +

" COALESCE(T1.DAT_DT, '${DAT_DT}') AS DAT_DT,\n" +

" '${ETL_DT}' AS ETL_DT,\n" +

" '${DAT_DT}' AS GLDM_STA_DT,\n" +

" '30001231' AS GLDM_END_DT,\n" +

" '0' AS GLDM_DEL_FLAG,\n" +

" SYS_GUID() AS DSES_UUID\n" +

" FROM SUM.C_RKK_JBXX_LHGMJBXXB T1, -- 罗湖公民基本信息表\n" +

" SUM.C_RKK_JYXX_LHXSXXB T2, -- 罗湖区学生信息\n" +

" (SELECT *\n" +

" FROM (SELECT T.*,\n" +

" ROW_NUMBER() OVER(PARTITION BY CARD_NO ORDER BY BYYX NULLS LAST, SYS_BULIDING_TIME DESC) RN\n" +

" FROM SUM.C_RKK_JBXX_LHGRXLXXB T)\n" +

" WHERE RN = 1) T3, -- 罗湖个人学历信息表\n" +

" ATM.B_RKK_JBXX_LHGMHJXXB T4, -- 罗湖公民户籍信息表\n" +

" SUM.C_RKK_JZXX_LHGMJZXXB T5,\n" +

" T6,\n" +

" SUM.C_RKK_GJJXX_LHGRGJJXXB T7, -- 罗湖区公积金缴纳人员基本信息\n" +

" T8,\n" +

" T9,\n" +

" T10,\n" +

" DMT.M_CQJC_RKSJ_LHQRKBQXXB T11, -- 罗湖区人口标签信息表\n" +

" (SELECT DISTINCT IDCARD_NEW IDCARD\n" +

" FROM STD.S_PCXT_LHQZHCSJSZX_FK_USERS_ZX_CUR\n" +

" WHERE TYPE = 2) T12,\n" +

" SUM.C_RKK_JBXX_LHGMDHHMXXB T13,\n" +

" SUM.C_RKK_JKXX_LHCJRXXXB T16, -- 残疾人信息\n" +

" (SELECT DISTINCT TZRZJHM, TZQYS\n" +

" FROM SUM.C_RKK_ZCXX_QYGRGDXX\n" +

" WHERE TZRZJHM IN (SELECT CARD_NO FROM SUM.C_RKK_JBXX_LHGMJBXXB)) T17, -- 企业个人股东(投资者)信息\n" +

" (SELECT DISTINCT CARD_NO, QYSL AS QYFRSL\n" +

" FROM SUM.C_RKK_ZCXX_LHGMGRZCXXB\n" +

" WHERE CARD_NO IN (SELECT CARD_NO FROM SUM.C_RKK_JBXX_LHGMJBXXB)) T18, -- 罗湖公民个人资产信息表(企业法人)\n" +

" (SELECT DISTINCT CARD_NO, ZSSL AS ZYZSSL\n" +

" FROM SUM.C_RKK_ZZXX_ZYJSRYZGZXX) T19 -- 专业技术人员资格证信息\n" +

" WHERE T1.CARD_NO = T2.CARD_NO(+)\n" +

" AND T1.CARD_NO = T3.CARD_NO(+)\n" +

" AND T1.CARD_NO = T4.CARD_NO(+)\n" +

" AND T1.CARD_NO = T5.CARD_NO(+)\n" +

" AND T1.CARD_NO = T6.CARD_NO(+)\n" +

" AND T1.CARD_NO = T7.CARD_NO(+)\n" +

" AND T1.CARD_NO = T8.CARD_NO(+)\n" +

" AND T1.CARD_NO = T9.CARD_NO(+)\n" +

" AND T1.CARD_NO = T10.CARD_NO(+)\n" +

" AND T1.CARD_NO = T11.CARD_NO(+)\n" +

" AND T1.CARD_NO = T12.IDCARD(+)\n" +

" AND T1.CARD_NO = T13.CARDNO(+)\n" +

" AND T1.CARD_NO = T16.CARD_NO(+)\n" +

" AND T1.CARD_NO = T17.TZRZJHM(+)\n" +

" AND T1.CARD_NO = T18.CARD_NO(+)\n" +

" AND T1.CARD_NO = T19.CARD_NO(+)" ;

sql="merge into dmt.m_qyfw_jbxx_frxx a\n" +

"using (select * from (\n" +

"select a.*,row_number()over(partition by tyshxydm_new order by updatetime desc) rn from atm.b_frk_jbxx_ssztjbxx a where xzqy='罗湖区')\n" +

"where rn=1) b\n" +

"on (a.tyshxydm=b.tyshxydm_new)\n" +

"when matched then update set \n" +

"A.std_adrees=B.std_adrees,\n" +

"a.std_street=b.std_street,\n" +

"a.std_community=b.std_community;\n" ;

AnalysisDruidSqlUtil.AnalysisSql(sql,null);

}

public static TableVo AnalysisSql(String sql,String dbType ) {

TableVo tableVo=new TableVo();

if (dbType==null){

dbType = JdbcConstants.MYSQL.name(); // 可以是ORACLE、POSTGRESQL、SQLSERVER、ODPS等

}

List<TableMapVo> tableMapVos=new ArrayList<>();

Map<String,String> tablsmap=new HashMap<>();

Map<String,String> tablsSchemaMap=new HashMap<>();

SQLStatement stmt = SQLUtils.parseSingleStatement(sql, dbType); // 将 SQL 语句解析为 SQLStatement 对象

Map<Integer,String> mapInsertCols=new HashMap<>();

Map<Integer,ColifoVo> mapSelectCols=new HashMap<>();

String targetTable =null;

String sourceTable1=null;

int count=1;

if (stmt instanceof SQLInsertStatement) {

SQLInsertStatement insert = (SQLInsertStatement) stmt;

List<SQLExpr> sqlSelectItems= insert.getColumns();

for (SQLExpr sqlExpr:sqlSelectItems){

System.out.println(sqlExpr.toString());

mapInsertCols.put(count,sqlExpr.toString());

count++;

}

targetTable = insert.getTableName().getSimpleName(); // 获取目标表名

System.out.println(insert.getColumnsString());

SQLSelect source = insert.getQuery(); // 找出来源表查询

List<SQLTableSource> sourceTables = new ArrayList<>(); // 存储来源表的列表

Set<String> sourceTableAliases = new HashSet<>(); // 存储来源表别名的集合

getSources(source.getQueryBlock().getFrom(), sourceTables, sourceTableAliases,tableMapVos,tablsmap,tablsSchemaMap); // 获取主表及其关联的所有来源表

sourceTable1 =sourceTables.get(0).getAlias(); // 获取查询表别名

if (sourceTables.get(0) instanceof SQLExprTableSource) { // 如果是基本表,则直接获取表名

SQLExprTableSource exprTableSource = (SQLExprTableSource) (sourceTables.get(0));

System.out.println(exprTableSource.getAlias());

String sourceTableName = exprTableSource.getName().getSimpleName();

sourceTable1=sourceTableName;

if (exprTableSource.getExpr() instanceof SQLPropertyExpr ){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)exprTableSource.getExpr();

tablsSchemaMap.put(sourceTable1,sqlPropertyExpr.getOwnerName());

}

}

Map<SQLTableSource, String> sourceTableMap = new HashMap<>(); // 存储来源表与对应别名或表名的映射关系

for (SQLTableSource sourceTable : sourceTables) {

if (sourceTable instanceof SQLExprTableSource) { // 如果是基本表,则直接获取表名

SQLExprTableSource exprTableSource = (SQLExprTableSource) sourceTable;

System.out.println(exprTableSource.getAlias());

String sourceTableName = exprTableSource.getName().getSimpleName();

if (tablsmap.containsKey(exprTableSource.getAlias())){

tablsmap.put(exprTableSource.getAlias(),sourceTableName);

if (exprTableSource.getExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr= (SQLPropertyExpr) exprTableSource.getExpr();

tablsSchemaMap.put(sourceTableName,sqlPropertyExpr.getOwnerName()) ;

}

}else{

System.out.println("无别名"+sourceTableName);

}

sourceTableMap.put(sourceTable, sourceTableName);

} else if (sourceTable instanceof SQLSubqueryTableSource) { // 如果是子查询,则递归解析

SQLSubqueryTableSource subqueryTableSource = (SQLSubqueryTableSource) sourceTable;

System.out.println(subqueryTableSource.getAlias());

String name=null;

if (subqueryTableSource.getAlias()!=null){

name=subqueryTableSource.getAlias();

}

SQLSelect subquery = subqueryTableSource.getSelect();

List<SQLTableSource> subquerySources = new ArrayList<>();

Set<String> subqueryAliases = new HashSet<>();

if (subquery.getQuery() instanceof SQLUnionQuery){

SQLUnionQuery sqlUnionQuery=(SQLUnionQuery)subquery.getQuery();

List<SQLSelectQuery> sqlSelectQueries= sqlUnionQuery.getRelations();

for (SQLSelectQuery sqlSelectQuery:sqlSelectQueries){

MySqlSelectQueryBlock source1= (MySqlSelectQueryBlock)sqlSelectQuery;

getSources(source1.getFrom(), subquerySources, subqueryAliases,tableMapVos,tablsmap,tablsSchemaMap);

}

}else{

getSources(subquery.getQueryBlock().getFrom(), subquerySources, subqueryAliases,tableMapVos,tablsmap,tablsSchemaMap);

}

for (SQLTableSource subquerySource : subquerySources) {

if (!sourceTables.contains(subquerySource)) {

// sourceTables.add(subquerySource); // 将子查询中的来源表加入列表中

}

String alias = subqueryAliases.contains(subquerySource.getAlias()) ? subquerySource.getAlias() : null; // 子查询中的来源表可能存在别名,进行处理

if (alias == null && subquerySource instanceof SQLExprTableSource) { // 如果没有别名,则使用表名作为键

SQLExprTableSource exprTableSource = (SQLExprTableSource) subquerySource;

alias = exprTableSource.getName().getSimpleName();

if (name!=null){

alias=name;

if (exprTableSource.getExpr() instanceof SQLPropertyExpr ){

System.out.println(((SQLPropertyExpr) exprTableSource.getExpr()).getName());

}

}

/* if (alias == null && ((SQLExprTableSource) subquerySource).getExpr() instanceof SQLExprTableSource){

SQLExprTableSource exprTableSource = (SQLExprTableSource) subquerySource;

alias = exprTableSource.getName().getSimpleName();

}*/

}

sourceTableMap.put(subquerySource, alias);

if (subqueryTableSource.getAlias()!=null){

if (tablsmap.containsKey(subqueryTableSource.getAlias())&&tablsmap.get(subqueryTableSource.getAlias()).toLowerCase().indexOf("select")>-1){

tablsmap.put(subqueryTableSource.getAlias(),subquerySource.toString());

}

}

System.out.println("来源表ming: " + alias);

}

} else {

throw new UnsupportedOperationException("不支持的子查询类型: " + sourceTable.getClass());

}

}

SQLSelectQueryBlock firstQueryBlock=source.getFirstQueryBlock();

List<SQLSelectItem> selectItems=firstQueryBlock.getSelectList();

String tableSql=null;

Integer scount=1;

for (SQLSelectItem sqlSelectItem : selectItems) {

String selectColumnAlias = sqlSelectItem.getAlias();

SQLExpr expr = sqlSelectItem.getExpr();

System.out.println(expr.toString());

sql=expr.toString().trim().toLowerCase();

if (expr instanceof SQLPropertyExpr) {

SQLPropertyExpr selectColumnExpr = (SQLPropertyExpr)expr;

ColifoVo colifoVo=new ColifoVo(getTableNameByAlias(selectColumnExpr.getOwnernName(),tablsmap),selectColumnExpr.getName());

System.out.println("表名:"+colifoVo.getSourceTableName()+",列名:"+colifoVo.getSourceColName());

setSelectCols(mapSelectCols,scount,colifoVo);

}else if (expr instanceof SQLIdentifierExpr) {

/**

* 查源表

*/

SQLIdentifierExpr selectColumnExpr = (SQLIdentifierExpr)expr;

ColifoVo colifoVo=new ColifoVo(sourceTable1,selectColumnExpr.getName());

System.out.println("列名:{"+selectColumnExpr.getName()+"},别名:{}"+selectColumnAlias);

mapSelectCols.put(scount,colifoVo);

}else if (expr instanceof SQLMethodInvokeExpr) {

SQLMethodInvokeExpr sqlMethodInvokeExpr = (SQLMethodInvokeExpr)expr;

List<SQLExpr> sqlExprs=sqlMethodInvokeExpr.getArguments();

for (SQLExpr sqlExpr:sqlExprs){

if (sqlExpr instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr= (SQLPropertyExpr) sqlExpr;

if (sqlPropertyExpr.getOwner() instanceof SQLIdentifierExpr){

SQLIdentifierExpr sqlIdentifierExpr=(SQLIdentifierExpr) sqlPropertyExpr.getOwner();

System.out.println(sqlIdentifierExpr.getName());

ColifoVo colifoVo=new ColifoVo(getTableNameByAlias(sqlPropertyExpr.getOwnerName(),tablsmap),sqlPropertyExpr.getName());

System.out.println("表名:"+colifoVo.getSourceTableName()+",列名:"+colifoVo.getSourceColName());

setSelectCols(mapSelectCols,scount,colifoVo);

}else{

setSelectColsNUll(mapSelectCols,scount);

}

}else if (sqlExpr instanceof SQLCharExpr ||sqlExpr instanceof SQLIntegerExpr ){

System.out.println("判断固定值");

}else{

setSelectColsNUll(mapSelectCols,scount);

}

}

} else if (expr instanceof SQLCaseExpr) {

List<SQLCaseExpr.Item> items=((SQLCaseExpr) expr).getItems();

if (CollectionUtils.isEmpty(items)){

for (SQLCaseExpr.Item item:items){

if (item.getConditionExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr) item.getConditionExpr();

System.out.println(sqlPropertyExpr.getOwnerName());

System.out.println(sqlPropertyExpr.getName());

ColifoVo colifoVo=new ColifoVo(((SQLPropertyExpr) item.getConditionExpr()).getOwnerName(),((SQLPropertyExpr) item.getConditionExpr()).getName());

setSelectCols(mapSelectCols,scount,colifoVo);

} else if (item.getConditionExpr() instanceof SQLBinaryOpExpr){

SQLBinaryOpExpr sqlBinaryOpExpr=(SQLBinaryOpExpr) item.getConditionExpr();

ColifoVo colifoVo= getTableAndColBySQLBinaryOpExpr(sqlBinaryOpExpr,tablsmap);

setSelectCols(mapSelectCols,scount,colifoVo);

if (item.getValueExpr()!=null&&item.getValueExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr =(SQLPropertyExpr)item.getValueExpr();

ColifoVo colifoVo1= getTableAndColBySQLPropertyExpr(sqlPropertyExpr,tablsmap);

setSelectCols(mapSelectCols,scount,colifoVo1);

}

}else{

setSelectColsNUll(mapSelectCols,scount);

}

}

}else{

setSelectColsNUll(mapSelectCols,scount);

}

}else if (expr instanceof SQLCharExpr) {

System.out.println("固定项值");

setSelectColsNUll(mapSelectCols,scount);

}else if (sql.indexOf("select")<0) {

ColifoVo colifoVo=new ColifoVo(sourceTable1,sql);

mapSelectCols.put(scount,colifoVo);

}else{

ColifoVo colifoVo=new ColifoVo(sourceTable1,sql);

mapSelectCols.put(scount,colifoVo);

}

/**

* 防止出现解析不了的情况

*/

if (!mapSelectCols.containsKey(count)){

setSelectColsNUll(mapSelectCols,scount);

}

scount++;

}

for (SQLTableSource sourceTable : sourceTables) {

String sourceTableName = sourceTableMap.get(sourceTable);

System.out.println("来源表: " + sourceTableName);

}

if (count==scount){

for (int i=0;i<count;i++){

}

}

System.out.println("目标表: " + targetTable);

/**

* 存储列的衍射关系

*/

addTableColMap(mapInsertCols,mapSelectCols,tableMapVos,targetTable);

for (TableMapVo tableMapVo:tableMapVos){

if (tablsmap.containsKey(tableMapVo.getSourceTableName())){

tableMapVo.setSourceTableName(tablsmap.get(tableMapVo.getSourceTableName()));

}

if (tablsmap.containsKey(tableMapVo.getTargetTableName())){

tableMapVo.setTargetTableName(tablsmap.get(tableMapVo.getTargetTableName()));

}

System.out.println("关联表1"+tableMapVo.getSourceTableName()+"关联表字段1"+tableMapVo.getSourceColName()+"关联表2"+tableMapVo.getTargetTableName()+"关联表字段2"+tableMapVo.getTargetColName());

}

}else if (stmt instanceof SQLMergeStatement){

Map<String,String> updateSourceTableCol=new HashMap<>();

Map<String,String> updateTargetTableCol=new HashMap<>();

SQLMergeStatement statement=(SQLMergeStatement)stmt;

if (statement.getInto() instanceof SQLExprTableSource){

SQLExprTableSource source=(SQLExprTableSource)statement.getInto();

if (source.getExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)source.getExpr();

targetTable=sqlPropertyExpr.getName();

tablsmap.put(source.getAlias(),sqlPropertyExpr.getName());

tablsSchemaMap.put(sqlPropertyExpr.getName(),sqlPropertyExpr.getOwnerName()) ;

}

}

if (statement.getUsing() instanceof SQLSubqueryTableSource){

SQLSubqueryTableSource subqueryTableSource = (SQLSubqueryTableSource) statement.getUsing();

System.out.println(subqueryTableSource.getAlias());

String name=null;

if (subqueryTableSource.getAlias()!=null){

name=subqueryTableSource.getAlias();

}

SQLSelect subquery = subqueryTableSource.getSelect();

if (subquery.getQuery() instanceof MySqlSelectQueryBlock){

MySqlSelectQueryBlock mySqlSelectQueryBlock=(MySqlSelectQueryBlock)subquery.getQuery();

if (mySqlSelectQueryBlock.getFrom() instanceof SQLExprTableSource){

SQLExprTableSource exprTableSource = (SQLExprTableSource) mySqlSelectQueryBlock.getFrom() ;

System.out.println(exprTableSource.getName().getSimpleName());

String sourceTableName = exprTableSource.getName().getSimpleName();

sourceTable1=sourceTableName;

tablsmap.put(name,sourceTableName);

if (exprTableSource.getExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr= (SQLPropertyExpr) exprTableSource.getExpr();

tablsSchemaMap.put(sourceTableName,sqlPropertyExpr.getOwnerName()) ;

}

}else if (mySqlSelectQueryBlock.getFrom() instanceof SQLSubqueryTableSource){

SQLSubqueryTableSource tableSource = (SQLSubqueryTableSource) mySqlSelectQueryBlock.getFrom();

SQLSelect subquery1 = tableSource.getSelect();

if (subquery1.getQuery() instanceof MySqlSelectQueryBlock){

MySqlSelectQueryBlock mySqlSelectQueryBlock1=(MySqlSelectQueryBlock)subquery1.getQuery();

if (mySqlSelectQueryBlock1.getFrom() instanceof SQLExprTableSource){

SQLExprTableSource exprTableSource = (SQLExprTableSource) mySqlSelectQueryBlock1.getFrom() ;

System.out.println(exprTableSource.getName().getSimpleName());

String sourceTableName = exprTableSource.getName().getSimpleName();

sourceTable1=sourceTableName;

tablsmap.put(name,sourceTableName);

if (exprTableSource.getExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr= (SQLPropertyExpr) exprTableSource.getExpr();

tablsSchemaMap.put(sourceTableName,sqlPropertyExpr.getOwnerName()) ;

}

}

}

}

}

}

if (statement.getUpdateClause() instanceof SQLMergeStatement.MergeUpdateClause){

SQLMergeStatement.MergeUpdateClause mergeUpdateClause=(SQLMergeStatement.MergeUpdateClause) statement.getUpdateClause();

List<SQLUpdateSetItem> items= mergeUpdateClause.getItems();

if (CollectionUtils.isNotEmpty(items)){

for (SQLUpdateSetItem item:items){

if (item.getColumn() instanceof SQLPropertyExpr){

TableMapVo tableMapVo=new TableMapVo();

SQLPropertyExpr sqlPropertyExpr= (SQLPropertyExpr) item.getColumn();

System.out.println(sqlPropertyExpr.getOwnerName());

if (sqlPropertyExpr.getOwner() instanceof SQLIdentifierExpr){

SQLIdentifierExpr sqlIdentifierExpr=(SQLIdentifierExpr) sqlPropertyExpr.getOwner();

if (tablsmap.containsKey(sqlIdentifierExpr.getName().toLowerCase())){

if (tablsmap.get(sqlIdentifierExpr.getName().toLowerCase()).equalsIgnoreCase(sourceTable1)){

tableMapVo.setSourceTableName(sourceTable1);

tableMapVo.setSourceColName(sqlPropertyExpr.getName());

}

if (tablsmap.get(sqlIdentifierExpr.getName().toLowerCase()).equalsIgnoreCase(targetTable)){

tableMapVo.setTargetTableName(targetTable);

tableMapVo.setTargetColName(sqlPropertyExpr.getName());

}

}

updateSourceTableCol.put(sqlPropertyExpr.getName(),tablsSchemaMap.get(sqlIdentifierExpr.getName()));

}

if (item.getValue() instanceof SQLCharExpr){

continue;

}

if (item.getValue() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr1= (SQLPropertyExpr) item.getValue();

if (sqlPropertyExpr1.getOwner() instanceof SQLIdentifierExpr){

SQLIdentifierExpr sqlIdentifierExpr=(SQLIdentifierExpr) sqlPropertyExpr1.getOwner();

if (tablsmap.containsKey(sqlIdentifierExpr.getName().toLowerCase())){

if (tablsmap.get(sqlIdentifierExpr.getName().toLowerCase()).equalsIgnoreCase(sourceTable1)){

tableMapVo.setSourceTableName(sourceTable1);

tableMapVo.setSourceColName(sqlPropertyExpr.getName());

}

if (tablsmap.get(sqlIdentifierExpr.getName().toLowerCase()).equalsIgnoreCase(targetTable)){

tableMapVo.setTargetTableName(targetTable);

tableMapVo.setTargetColName(sqlPropertyExpr.getName());

}

}

updateSourceTableCol.put(sqlPropertyExpr.getName(),tablsSchemaMap.get(sqlIdentifierExpr.getName()));

}

}

if (StringUtils.isNotEmpty(tableMapVo.getSourceTableName())&&StringUtils.isNotEmpty(tableMapVo.getTargetTableName())){

tableMapVos.add(tableMapVo);

}else{

tableVo=new TableVo();

}

}

}

}

}

if (statement.getOn() instanceof SQLBinaryOpExpr){

SQLBinaryOpExpr sqlBinaryOpExpr=(SQLBinaryOpExpr)statement.getOn();

if (sqlBinaryOpExpr.getLeft() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)sqlBinaryOpExpr.getLeft();

System.out.println(sqlPropertyExpr.getOwnerName()+sqlPropertyExpr.getName());

}

if (sqlBinaryOpExpr.getRight() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)sqlBinaryOpExpr.getRight();

System.out.println(sqlPropertyExpr.getOwnerName()+sqlPropertyExpr.getName());

}

}

for (TableMapVo tableMapVo:tableMapVos){

if (tablsmap.containsKey(tableMapVo.getSourceTableName())){

tableMapVo.setSourceTableName(tablsmap.get(tableMapVo.getSourceTableName()));

}

if (tablsmap.containsKey(tableMapVo.getTargetTableName())){

tableMapVo.setTargetTableName(tablsmap.get(tableMapVo.getTargetTableName()));

}

System.out.println("关联表1"+tableMapVo.getSourceTableName()+"关联表字段1"+tableMapVo.getSourceColName()+"关联表2"+tableMapVo.getTargetTableName()+"关联表字段2"+tableMapVo.getTargetColName());

}

}

tableVo.setTableMapVos(tableMapVos);

tableVo.setTablsSchemaMap(tablsSchemaMap);

return tableVo;

}

/**

* 存储列的衍射关系

*/

public static void addTableColMap(Map<Integer,String> mapInsertCols,Map<Integer,ColifoVo> mapSelectCols,List<TableMapVo> tableMapVos,String targetTable ){

if (mapInsertCols!=null&&mapSelectCols!=null){

int size= mapInsertCols.values().size();

for (int i=0;i<size;i++){

ColifoVo colifoVo=mapSelectCols.get(i);

if (colifoVo!=null&&CollectionUtils.isNotEmpty(colifoVo.getColifoVoList())){

for (ColifoVo vo:colifoVo.getColifoVoList()){

if (vo!=null){

TableMapVo vo1=new TableMapVo(vo.getSourceTableName(),vo.getSourceColName(),mapInsertCols.get(i),targetTable) ;

tableMapVos.add(vo1);

}

}

}

}

}

}

public static void setSelectCols(Map<Integer,ColifoVo> mapSelectCols,Integer scount,ColifoVo vo ){

if (mapSelectCols.containsKey(scount)){

ColifoVo colifoVo=mapSelectCols.get(scount);

List<ColifoVo> colifoVoList=colifoVo.getColifoVoList();

colifoVoList.add(vo);

mapSelectCols.put(scount,colifoVo);

}else{

ColifoVo colifoVo=new ColifoVo();

List<ColifoVo> colifoVoList=new ArrayList<>();

colifoVoList.add(vo);

colifoVo.setColifoVoList(colifoVoList);

mapSelectCols.put(scount,colifoVo);

}

}

public static void setSelectColsNUll(Map<Integer,ColifoVo> mapSelectCols,Integer scount ){

setSelectCols(mapSelectCols,scount,null);

}

public static ColifoVo getTableAndColBySQLBinaryOpExpr(SQLBinaryOpExpr sqlBinaryOpExpr,Map<String,String> tablsmap){

ColifoVo colifoVo=new ColifoVo();

if (sqlBinaryOpExpr.getLeft() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)sqlBinaryOpExpr.getLeft();

colifoVo.setSourceTableName(getTableNameByAlias(sqlPropertyExpr.getOwnerName(),tablsmap));

colifoVo.setSourceColName(sqlPropertyExpr.getName());

System.out.println("表名:"+colifoVo.getSourceTableName()+",列名:"+colifoVo.getSourceColName());

}

return colifoVo;

}

public static ColifoVo getTableAndColBySQLPropertyExpr(SQLPropertyExpr sqlPropertyExpr,Map<String,String> tablsmap){

ColifoVo colifoVo=new ColifoVo();

if (sqlPropertyExpr.getOwner() instanceof SQLIdentifierExpr){

SQLIdentifierExpr sqlIdentifierExpr=(SQLIdentifierExpr)sqlPropertyExpr.getOwner();

colifoVo.setSourceTableName(getTableNameByAlias(sqlIdentifierExpr.getName(),tablsmap));

colifoVo.setSourceColName(sqlPropertyExpr.getName());

System.out.println("表名:"+colifoVo.getSourceTableName()+",列名:"+colifoVo.getSourceColName());

}

return colifoVo;

}

public static String getTableNameByAlias(String alias,Map<String,String> tablsmap){

if (tablsmap.containsKey(alias)){

if (tablsmap.get(alias)!=null&&!tablsmap.get(alias).isEmpty()){

alias=tablsmap.get(alias);

}

}

return alias;

}

public static ColifoVo getTableAndColPoint(String string,Map<String,String> tablsmap){

String[] s1= string.trim().split(".");

String name=s1[0];

if (tablsmap.containsKey(name)){

name=tablsmap.get(name);

}

ColifoVo colifoVo=new ColifoVo(name,s1[1].toString());

return colifoVo;

}

public static ColifoVo getTableAndColByBlank(String string,Map<String,String> tablsmap){

ColifoVo colifoVo=new ColifoVo();

String[] s1=string.trim().split(" ");

for (String s2:s1){

colifoVo=getTableAndColPoint(s2,tablsmap);

}

return colifoVo;

}

public static void SQLBinaryOpExpr() {

String sql = "select * from users where id > 1 and age = 18";

SQLStatement stmt1 = SQLUtils.parseSingleStatement(sql, DbType.mysql); // 将 SQL 语句解析为 SQLStatement 对象

if (stmt1 instanceof SQLSelectStatement) {

SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) stmt1;

sqlSelectStatement.getSelect().getFirstQueryBlock();

SQLSelectQueryBlock selectQueryBlock =sqlSelectStatement.getSelect().getFirstQueryBlock();

SQLExpr where = selectQueryBlock.getWhere();

List<SQLObject> conditions = where.getChildren();

// [id > 1 , age = 18] 出现了操作符所以是SQLBinaryOpExpr

for (SQLObject condition : conditions) {

/*SQLBinaryOpExpr conditionExpr =Utils.cast(condition, SQLBinaryOpExpr.class);

SQLBinaryOperator operator = conditionExpr.getOperator();

SQLIdentifierExpr conditionColumn = Utils.cast(conditionExpr.getLeft(), SQLIdentifierExpr.class);

SQLValuableExpr conditionColumnValue = Utils.cast(conditionExpr.getRight(), SQLValuableExpr.class);

Utils.print("条件字段:{},操作符号:{},条件值:{}", conditionColumn.getName(), operator.name, conditionColumnValue);*/

}

}

}

/**

* 解析查询字段,注意是否使用了别名.u.id as userId, u.name as userName, u.age as userAge<br>

* userId(sqlSelectItem.getAlias)<br>

* 如果有别名: u.id( id = SQLPropertyExpr.getName,u = SQLPropertyExpr.getOwnernName)<br>

* 如果没别名: id(id = SQLIdentifierExpr.name)

*

* @param selectColumnList 查询字段

*/

private void parseSQLSelectItem(List<SQLSelectItem> selectColumnList) {

for (SQLSelectItem sqlSelectItem : selectColumnList) {

// u.id as userId(selectColumnAlias)

String selectColumnAlias = sqlSelectItem.getAlias();

// u.id = SQLPropertyExpr

SQLExpr expr = sqlSelectItem.getExpr();

/* if (expr instanceof SQLPropertyExpr) {

SQLPropertyExpr selectColumnExpr = cast(expr, SQLPropertyExpr.class);

print("列名:{},别名:{},表别名:{}", selectColumnExpr.getName(), selectColumnAlias, selectColumnExpr.getOwnernName());

}

if (expr instanceof SQLIdentifierExpr) {

SQLIdentifierExpr selectColumnExpr = cast(expr, SQLIdentifierExpr.class);

print("列名:{},别名:{}", selectColumnExpr.getName(), selectColumnAlias);

}*/

}

}

/**

*

* @param tableSource 存储来源表的列表

* @param sources 存储来源表别名的集合

* @param aliases 存储来源表和对应别名或者表名的映射关系

*/

private static void getSources(SQLTableSource tableSource, List<SQLTableSource> sources, Set<String> aliases, List<TableMapVo> tableMapVos, Map<String,String> tablsmap,Map<String,String> tablsSchemaMap) {

if (tableSource == null) {

return;

}

if (tableSource instanceof SQLJoinTableSource) {

SQLJoinTableSource join = (SQLJoinTableSource) tableSource;

SQLBinaryOpExpr sqlBinaryOpExpr=(SQLBinaryOpExpr)join.getCondition();

if (sqlBinaryOpExpr!=null){

SQLBinaryOperator operator = sqlBinaryOpExpr.getOperator();

if (operator!=null&&operator.name.equals("=")){

System.out.println(operator.name);

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)sqlBinaryOpExpr.getLeft();

System.out.println("关联关系表1"+ getTableNameByAlias(sqlPropertyExpr.getOwnerName(),tablsmap)+"表别名"+sqlPropertyExpr.getOwnerName()+"关联字段:"+sqlPropertyExpr.getName());

SQLPropertyExpr sqlPropertyExpr2=(SQLPropertyExpr)sqlBinaryOpExpr.getRight();

System.out.println("关联关系表2"+ getTableNameByAlias(sqlPropertyExpr2.getOwnerName(),tablsmap)+"表别名"+sqlPropertyExpr2.getOwnerName()+"关联字段:"+sqlPropertyExpr2.getName());

TableMapVo vo=new TableMapVo( getTableNameByAlias(sqlPropertyExpr.getOwnerName(),tablsmap),sqlPropertyExpr.getName(),getTableNameByAlias(sqlPropertyExpr2.getOwnerName(),tablsmap),sqlPropertyExpr2.getName());

// tableMapVos.add(vo);

}

}

getSources(join.getLeft(), sources, aliases,tableMapVos,tablsmap,tablsSchemaMap);

getSources(join.getRight(), sources, aliases,tableMapVos,tablsmap,tablsSchemaMap);

} else {

if (tableSource instanceof SQLSubqueryTableSource){

SQLSubqueryTableSource subqueryTableSource=(SQLSubqueryTableSource)tableSource;

String name=null;

if (subqueryTableSource.getAlias()!=null){

name=subqueryTableSource.getAlias();

}

if (subqueryTableSource.getSelect().getQuery() instanceof MySqlSelectQueryBlock){

MySqlSelectQueryBlock mySqlSelectQueryBlock= (MySqlSelectQueryBlock)subqueryTableSource.getSelect().getQuery() ;

if ( mySqlSelectQueryBlock.getFrom() instanceof SQLSubqueryTableSource) {

List<SQLTableSource> subquerySources = new ArrayList<>();

Set<String> subqueryAliases = new HashSet<>();

getSources(mySqlSelectQueryBlock.getFrom(), subquerySources, subqueryAliases,tableMapVos,tablsmap,tablsSchemaMap);

}else if ( mySqlSelectQueryBlock.getFrom() instanceof SQLExprTableSource) {

SQLExprTableSource source=(SQLExprTableSource)mySqlSelectQueryBlock.getFrom();

if (source.getExpr() instanceof SQLPropertyExpr){

SQLPropertyExpr sqlPropertyExpr=(SQLPropertyExpr)source.getExpr();

System.out.println(sqlPropertyExpr.getName());

if (name==null){

if ( tableSource.getParent().getParent()!=null&&tableSource.getParent().getParent().getParent() instanceof SQLSubqueryTableSource){

SQLSubqueryTableSource subqueryTableSource1=(SQLSubqueryTableSource)tableSource.getParent().getParent().getParent();

if (subqueryTableSource1.getAlias()!=null){

name=subqueryTableSource1.getAlias();

}

}

}

tablsmap.put(name,sqlPropertyExpr.getName());

tablsSchemaMap.put(sqlPropertyExpr.getName(),sqlPropertyExpr.getOwnerName());

}

}

//sources.add(subqueryTableSource);

}

}

if (!sources.contains(tableSource)) {

sources.add(tableSource);

String alias = tableSource.getAlias();

if (alias != null) {

aliases.add(alias);

}

if (tablsmap.containsKey(alias)){

if (tablsmap.get(alias).toLowerCase().trim().indexOf("select")>-1){

tablsmap.put(alias,tableSource.toString());

}

}else{

tablsmap.put(alias,tableSource.toString());

}

}

}

}

}

相关推荐
heyCHEEMS23 分钟前
[USACO09OCT] Bessie‘s Weight Problem G Java
java·开发语言·算法
兔子蟹子1 小时前
JAVA中Spring全局异常处理@ControllerAdvice解析
java·spring
深鱼~1 小时前
【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿
数据库·redis·缓存
nicepainkiller1 小时前
redis高阶2 高性能
数据库·redis·缓存
prinrf('千寻)1 小时前
项目右键没有add as maven project选项
java·maven
Algorithm15761 小时前
Redis的ZSet对象底层原理——跳表
数据库·redis·缓存
工业互联网专业1 小时前
基于springboot+vue的健康健身追踪系统
java·vue.js·spring boot·毕业设计·源码·课程设计·健康健身追踪系统
杰仔正在努力1 小时前
Java + Seleium4.X + TestNG自动化技术
java·开发语言·自动化
weixin_307779132 小时前
Azure Synapse Dedicated SQL pool企业权限管理
开发语言·数据仓库·sql·azure·etl
lynn-662 小时前
JAVA-使用Apache POI导出数据到Excel,并把每条数据的图片打包成zip附件项
java·apache·excel