mybatis mapper.xml转建表语句

从网上下载了代码,但是发现没有DDL建表语句,只能自己手动创建了,感觉太麻烦,就写了一个工具类

将所有的mapper.xml放入到一个文件夹中,程序会自动读取生成建表语句

mybatis mapper.xml转建表语句_第1张图片

依赖的jar


    org.dom4j
    dom4j
    2.1.4


    jaxen
    jaxen
    2.0.0


    org.jdom
    jdom
    1.1.3

package com.example.demo;

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.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import org.springframework.util.StringUtils;
import org.xml.sax.InputSource;

public class Sqlmap2Table {

    // 默认所有的varchar都是512,可以保证满足绝大多数的字段
    private static final String DEFAULT_VARCHAR_LENGTH = "VARCHAR(256)";


    public static void main(String[] args) throws Exception {
        String sqlMapPath = "C:\\Users\\Administrator\\Downloads\\estate-public-master\\src\\main\\java\\com\\wy\\mapping";//这里指定你的sqlmap配置文件所在路径
        analysis(sqlMapPath);
    }


    /* 根据指定的目录进行遍历分析
    *
    * @param path
    * @throws IOException
    * @throws JDOMException
    */
   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配置文件
    *  当然xml文件中必须设置字段类型的属性,否则无法判断字段属性
    * @param sqlMapFile
    * @throws IOException
    * @throws JDOMException
    */
   @SuppressWarnings("unchecked")
   private static void analysisSqlMap(String sqlMapFile) throws IOException, JDOMException {
       // System.out.println("************"+sqlMapFile);
        boolean isNull=false;
       /**
        * 这里要把sqlmap文件中的这一行去掉:
*
* 否则JDom根据文件创建Document对象时,会报找不到www.ibatis.com这个异常,导致渲染不成功。 */ String xmlString = filterRead(sqlMapFile, " resultMap = (List) XPath.selectNodes(doc, "//resultMap"); for (Element e : resultMap) { if (org.apache.commons.lang3.StringUtils.isBlank(tableName)){ String alias = e.getAttributeValue("type"); tableName = getTableName(doc, alias); } List children = e.getChildren(); StringBuilder createTableString = new StringBuilder("create table `" + tableName + "` (\n\t"); int size = 0; boolean isId = false; for (Element child : children) { String jdbcType = child.getAttributeValue("jdbcType"); //获取属性类型 if(StringUtils.isEmpty(jdbcType)){ isNull=true; break; } if (jdbcType.toUpperCase().equals("VARCHAR")) { jdbcType = DEFAULT_VARCHAR_LENGTH; } else if (jdbcType.toUpperCase().equals("CHAR")) { jdbcType = "char(10)"; } else if (jdbcType.toUpperCase().equals("BIGINT")) { jdbcType = "bigint(20)"; } if (jdbcType.toUpperCase().equals("INTEGER")) { jdbcType = "int(11)"; } else if (jdbcType.toUpperCase().equals("DECIMAL")) { jdbcType = "decimal(10,2)"; } else if (jdbcType.toUpperCase().equals("NUMERIC")) { jdbcType = "decimal(10,2)"; } 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"; } String columnName = child.getAttributeValue("column"); createTableString.append("`").append(columnName).append("` ").append(jdbcType); //加入属性和类型 if ("ID".equalsIgnoreCase(columnName)){ createTableString.append(" NOT NULL AUTO_INCREMENT"); isId = true; }else{ createTableString.append(" DEFAULT NULL"); } if (size < children.size() - 1) { createTableString.append(",\n\t"); } size++; } if(isNull){ break; } if (isId){ createTableString.append(",\n\tPRIMARY KEY (`id`) \n"); }else{ createTableString.append("\n"); } createTableString.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;"); System.out.println(createTableString.toString().toLowerCase()); } } private static String getTableNameByInsert(Document doc) throws JDOMException { List resultMap = (List) XPath.selectNodes(doc, "//insert"); for (Element ele : resultMap){ String text = ele.getText(); //System.out.println(ele.getText()); int intoIndex = text.indexOf("into"); if (intoIndex > 0){ String s = text.substring(intoIndex+4); intoIndex = s.indexOf("("); if (intoIndex > 0){ s = s.substring(0,intoIndex); return s.trim().toLowerCase(); } } } return null; } private static String getTableName(Document doc, String alias) throws JDOMException { String tableName = ""; String classPath = null; // 这里的alias可能是一个别名,也可能是一个java类路径,这里我通过该alias是否有点"."这个符号来区别 if (!alias.contains(".")) {// 是JAVA类 // 是别名,就到配置的别名中去找 Element aliasElement = (Element) XPath.selectSingleNode(doc, "//typeAlias[@alias=\"" + alias + "\"]"); alias = aliasElement.getAttributeValue("type"); } int lastIndex = alias.lastIndexOf("."); if (lastIndex > 0) {// 是JAVA类 classPath = alias.substring(lastIndex+1); }else{ classPath = alias; } // int i = classPath.lastIndexOf("DO"); // 取到根据表名生成的DO名称,无“DO”两个字符 //classPath = classPath.substring(0, i); char[] chars = classPath.toCharArray(); boolean isFirst = Boolean.TRUE; // 生成真实的表名 for (char c : chars) { if (!isFirst && c >= 65 && c <= 90) { tableName += "_"; } if (isFirst) { isFirst = Boolean.FALSE; } tableName += c; } // 表名转换为大写返回 return tableName.toUpperCase(); } /** * 过滤性阅读 * * @param filePath 文件路径 * @param notIncludeLineStartWith 不包括的字符,即某行的开头是这样的字符串,则在读取的时候该行忽略 * @return * @throws IOException */ private static String filterRead(String filePath, String notIncludeLineStartWith) throws IOException { String result = ""; FileReader fr = new FileReader(filePath); BufferedReader br = new BufferedReader(fr); String line = br.readLine(); while (line != null) { if (!line.startsWith(notIncludeLineStartWith)) { result += line; } line = br.readLine(); if (line != null && !line.startsWith(notIncludeLineStartWith)) { result += "\n"; } } br.close(); fr.close(); return result; } /** * 根据XML字符串 建立JDom的Document对象 * * @param xmlString XML格式的字符串 * @return Document 返回建立的JDom的Document对象,建立不成功将抛出异常。 * @throws IOException * @throws JDOMException */ private static Document getDocument(String xmlString) throws JDOMException, IOException { // SAXBuilder builder = new SAXBuilder(); // Document anotherDocument = builder.build( new StringReader(xmlString)); // try { // Document doc = (Document)DocumentHelper.parseText(xmlString); // return doc; // // } catch (DocumentException e) { // e.printStackTrace(); // } StringReader st = new StringReader(xmlString); InputSource is = new InputSource(st); Document doc = (new SAXBuilder()).build(is); return doc; } }

你可能感兴趣的:(spring,JAVA,Mysql,xml,java,mybatis)