创建Sqlmap2Table类
上代码
注意:此方式只支持xxxMapper.xml内有resultMap且与实体类对应;type必须是实体类类名,例如:com.aaa.aaaa.ddd.pojo.xxx,在生成的sql语句中可能出现LONGVARCHAR类型,可根据实际使用替换成VARCHAR或者TEXT
package com.wcs.biz.assist;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
* 根据Ibatis的SqlMap配置文件,重新生成表结构。<br>
* 要求所有的sqlmap中对应的字段都有jdbcType这个属性。
*/
public class Sqlmap2Table {
// 默认所有的varchar都是512,可以保证满足绝大多数的字段,根据项目需求
private static final String DEFAULT_VARCHAR_LENGTH = "VARCHAR(255)";
public static void main(String[] args) throws JDOMException, IOException {
String sqlMapPath = "H:/workspace/bn/bn_assist-base-prod/assist-service/src/main/resources/mybatis/mapper";//这里指定你的xml配置文件所在路径
analysis(sqlMapPath);
}
/**
* 根据指定的目录进行遍历分析
*/
private static void analysis(String path) throws IOException, JDOMException {
File filePath = new File(path);
if (filePath.isDirectory() && !filePath.getName().equals(".svn")) {
File[] fileList = filePath.listFiles();
for (File file : fileList) {
if (file.isDirectory()) analysis(file.getAbsolutePath());
else analysisSqlMap(file.getAbsolutePath());
}
}
}
/**
* 分析单个的sqlmap配置文件
*/
private static void analysisSqlMap(String sqlMapFile) throws IOException, JDOMException {
boolean isNull = false;
String xmlString = filterRead(sqlMapFile).replaceAll("\n", "");
Document doc = getDocument(xmlString);
Element rootElement = doc.getRootElement();
List<Element> resultMap = rootElement.getChildren("resultMap");
//List<Element> resultMap = (List<Element>) XPath.selectNodes(doc, "//resultMap");
for (Element e : resultMap) {
String alias = e.getAttributeValue("type");
String tableName = getTableName(alias);
List<Element> children = e.getChildren();
StringBuilder createTableString = new StringBuilder("create table " + tableName + "(\n\t");
int size = 0;
for (Element child : children) {
String jdbcType = child.getAttributeValue("jdbcType");
if (StringUtils.isEmpty(jdbcType)) {
isNull = true;
break;
}
switch (jdbcType.toUpperCase()) {
case "VARCHAR":
jdbcType = DEFAULT_VARCHAR_LENGTH;
break;
case "CHAR":
jdbcType = "char(10)";
break;
case "BIGINT":
jdbcType = "bigint(20)";
break;
}
switch (jdbcType.toUpperCase()) {
case "INTEGER":
jdbcType = "int(11)";
break;
case "DECIMAL":
jdbcType = "decimal(10,2)";
break;
case "NUMERIC":
jdbcType = "decimal(10,2)";
break;
}
if (jdbcType.toUpperCase().equals("DOUBLE")) jdbcType = "double";
if (jdbcType.toUpperCase().equals("REAL")) jdbcType = "double";
if (jdbcType.toUpperCase().equals("BOOLEAN")) jdbcType = "tinyint(1)";
if (jdbcType.toUpperCase().equals("FLOAT")) jdbcType = "float";
createTableString.append(child.getAttributeValue("column")).append(" ").append(jdbcType);
if (size < children.size() - 1) createTableString.append(",\n\t");
else createTableString.append("\n");
size++;
}
if (isNull) break;
createTableString.append(");");
System.out.println(createTableString.toString());
}
}
private static String getTableName(String classPath){
StringBuilder tableName = new StringBuilder();
String[] classPathArray = classPath.split("\\.");
char[] chars = classPathArray[classPathArray.length - 1].toCharArray();
boolean isFirst = Boolean.TRUE;
// 生成真实的表名
for (char c : chars) {
if (!isFirst && c >= 65 && c <= 90) tableName.append("_");
if (isFirst) isFirst = Boolean.FALSE;
tableName.append(c);
}
// 表名转换为大写返回
return tableName.toString().toUpperCase();
}
/**
* 过滤性阅读
* @param filePath 文件路径
*
*/
private static String filterRead(String filePath) throws IOException {
StringBuilder result = new StringBuilder();
FileReader fr = new FileReader(filePath);
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
while (line != null) {
if (!line.startsWith("<!DOCTYPE")) result.append(line);
line = br.readLine();
if (line != null && !line.startsWith("<!DOCTYPE")) result.append("\n");
}
br.close();
fr.close();
return result.toString();
}
/**
* 根据XML 字符串 建立JDom的Document对象
*/
private static Document getDocument(String xmlString) throws JDOMException, IOException {
SAXBuilder builder = new SAXBuilder();
return builder.build(new StringReader(xmlString));
}
}
本文由: lanyan1214的文章改造,如有侵权请联系删除.