package org.yeshi.utils.mybatis; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.dom4j.tree.AbstractAttribute; public class ColumnUtil { @SuppressWarnings("rawtypes") public static void addColumnToMapper(String path, String columnName, String property, String type) { File xmlPath = new File(path); SAXReader reader = new SAXReader(); Document document = null; try { document = reader.read(xmlPath); Element root = document.getRootElement(); // 得到根元素的所有子节点 List elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { if (e.getName().equals("resultMap")) { AbstractAttribute attr = (AbstractAttribute) e.attribute("id"); if ("BaseResultMap".equalsIgnoreCase(attr.getValue())) { List list = e.elements("result"); boolean isE = false; for (int i = 0; i < list.size(); i++) { Element item = (Element) list.get(i); attr = (AbstractAttribute) item.attribute("property"); if (attr.getValue().trim().equalsIgnoreCase(property)) { isE = true; break; } } if (!isE) { List li = new ArrayList<>(); li.add(new KeyPair("column", columnName)); li.add(new KeyPair("property", property)); li.add(new KeyPair("jdbcType", type)); e.add(createElement("result", li, null)); } } } else if (e.getName().equals("sql")) { AbstractAttribute attr = (AbstractAttribute) e.attribute("id"); if ("Base_Column_List".equalsIgnoreCase(attr.getValue())) { String columns = e.getText(); String[] cs = columns.split(","); boolean isE = false; for (String c : cs) { if (c.trim().equalsIgnoreCase(columnName)) { isE = true; break; } } if (!isE) { columns += ("," + columnName); e.setText(columns); } } } else if (e.getName().equals("insert")) { AbstractAttribute attr = (AbstractAttribute) e.attribute("id"); if ("insert".equalsIgnoreCase(attr.getValue())) { String insert = e.getText(); String[] cs = insert.split("values "); if (cs.length > 1) { int start = cs[0].indexOf("("); int end = cs[0].indexOf(")"); String columns = cs[0].substring(start, end); String[] cols = columns.split(","); boolean isE = false; for (String col : cols) { if (col.trim().equalsIgnoreCase(columnName)) { isE = true; break; } } if (!isE) { cs[0] = cs[0].replace(columns, columns + ("," + columnName)); start = cs[1].indexOf("("); end = cs[1].indexOf(")"); String columns2 = cs[1].substring(start, end); cs[1] = cs[1].replace(columns2, columns2 + String.format(",#{%s,jdbcType=%s}", property, type)); insert = cs[0] + " values " + cs[1]; e.setText(insert); } } } else if ("insertSelective".equalsIgnoreCase(attr.getValue())) { List trims = e.elements("trim"); Element els = (Element) trims.get(0); boolean isE = false; for (int i = 0; i < els.elements("if").size(); i++) { String cn = ((Element) els.elements("if").get(i)).getText().replace(",", "").trim(); if (columnName.equalsIgnoreCase(cn)) { isE = true; break; } } if (!isE) { List list = new ArrayList<>(); list.add(new KeyPair("test", String.format("%s != null", property))); els.add(createElement("if", list, columnName + ",")); els = (Element) trims.get(1); list = new ArrayList<>(); list.add(new KeyPair("test", String.format("%s != null", property))); els.add(createElement("if", list, String.format("#{%s,jdbcType=%s}", property, type))); } } } else if (e.getName().equals("update")) { AbstractAttribute attr = (AbstractAttribute) e.attribute("id"); if ("updateByPrimaryKeySelective".equalsIgnoreCase(attr.getValue())) { List list = ((Element) e.elements("set").get(0)).elements("if"); boolean isE = false; for (int i = 0; i < list.size(); i++) { if (((Element) list.get(i)).getText().indexOf(columnName) > -1) { isE = true; break; } } if (!isE) { List klist = new ArrayList<>(); klist.add(new KeyPair("test", String.format("%s !=null", property))); ((Element) e.elements("set").get(0)).add(createElement("if", klist, String.format("%s =#{%s,jdbcType=%s},", columnName, property, type))); } } else if ("updateByPrimaryKey".equalsIgnoreCase(attr.getValue())) { String value = e.getText(); // 不存在该列 if (value.indexOf(columnName) <= -1) { int wpos = value.indexOf("where "); if (value.substring(0, wpos).trim().endsWith(",")) value = value.substring(0, wpos) + String.format("%s =#{%s,jdbcType=%s}", columnName, property, type) + " " + value.substring(wpos); else value = value.substring(0, wpos) + "," + String.format("%s =#{%s,jdbcType=%s}", columnName, property, type) + " " + value.substring(wpos); e.setText(value); } } } } } catch (DocumentException e1) { e1.printStackTrace(); } if (document != null) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); try { XMLWriter writer = new XMLWriter(new FileOutputStream(path), format); writer.write(document); } catch (Exception e) { e.printStackTrace(); } } } private static Element createElement(String qName, List keyPairList, String value) { Element element = DocumentHelper.createElement(qName); for (KeyPair kp : keyPairList) { element.addAttribute(kp.key, kp.value); } if (value != null) element.setText(value); return element; } } class KeyPair { String key; String value; public KeyPair(String key, String value) { this.key = key; this.value = value; } public KeyPair() { } }