> 技术文档 > 模拟idea的SQL Params Setter插件,实现SQL语句的拼接

模拟idea的SQL Params Setter插件,实现SQL语句的拼接

package com.jd.doctor.v2.doctor.entity;import lombok.extern.slf4j.Slf4j;import java.util.*;@Slf4jpublic class SqlFormatUtil { static String preparing = \"SELECT COUNT(1) FROM (SELECT d.id, h.drug_code, h.drug_name, h.py_code, h.wb_code, d.examine, h.drug_type, h.is_split, h.trade_name, h.dosage_code, h.dosage_name, h.specifications, h.manufactor_code, h.manufactor_name, h.approval_number, h.medical_insurance_code, h.medical_insurance_type, h.drug_unit, h.pack_rate, h.base_drug_type, h.ismonitor, h.hospital_branch_code, h.hospital_code, d.pharmacy_code, h.tenant_id, d.deleted AS storedeleted, h.ismedicaluse, h.price_hospital, d.price_drugstore, d.hospital_drug_id, h.default_unit, h.default_way, h.default_frequency, h.default_dose, d.created_time, h.id AS hospitalId, h.deleted, ds.deleted drugstore_deleted, ds.type drugstore_type, d.stock, h.med_list_codg, h.medins_list_codg, h.drug_introduction FROM drug_catalogue_hospital h LEFT JOIN drug_catalogue_drugstore d ON d.hospital_drug_id = h.id AND d.tenant_id = \'100053\' LEFT JOIN drugstore_settings ds ON ds.code = d.pharmacy_code AND ds.deleted = \'N\' AND ds.tenant_id = \'100053\' WHERE h.id IN (SELECT hospital_drug_id FROM drug_catalogue_drugstore WHERE hospital_drug_id = h.id AND deleted = \'N\' AND `status` = 1 AND tenant_id = \'100053\') AND h.tenant_id = \'100053\') c WHERE (deleted = ? AND storedeleted = ? AND drugstore_deleted = ? AND tenant_id = ? AND hospital_code = ? AND pharmacy_code = ? AND hospital_branch_code = ?)\"; static String parameters = \"N(String), N(String), N(String), 100053(String), H0001(String), D72.01.03.05(String), H0001(String)\"; public static void main(String[] args) { String sql = preparing.replaceAll(\"= \\\\?\", \"= %s\"); List list = getParametersMap(parameters); if (!list.isEmpty()) { String newSql = String.format(sql, list.toArray()); log.info(\"--------->\"); log.info(\"格式完成的SQL:{}\", newSql); log.info(\"<---------\"); } } /** * 参数格式化 * @param parameters: 参数字符串 * @return 格式化后的参数集合 */ private static List getParametersMap(String parameters) { List list = new ArrayList(); String[] parametersList = parameters.split(\", \"); for (String s : parametersList) { String type = s.substring(s.lastIndexOf(\"(\") + 1, s.lastIndexOf(\")\")); String parameter = s.substring(0, s.lastIndexOf(\"(\")); list.add(parameterFormat(type, parameter)); } return list; } /** * 单个参数格式化 * @param type:参数类型 * @param parameter:参数值 * @return 格式化后的参数 */ private static String parameterFormat(String type, String parameter) { if (null == type) { throw new RuntimeException(\"类型不能为空!\"); } String parameterFormat; switch (type) { case \"String\": case \"Timestamp\": parameterFormat = \"\'\" + parameter + \"\'\"; break; case \"Boolean\": case \"Integer\": parameterFormat = parameter; break; default: log.info(\"类型不匹配:{}\", type); throw new RuntimeException(\"类型不匹配!\"); } return parameterFormat; }}