从网上下载了代码,但是发现没有DDL建表语句,只能自己手动创建了,感觉太麻烦,就写了一个工具类
将所有的mapper.xml放入到一个文件夹中,程序会自动读取生成建表语句

依赖的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, ");
- // XmlDocument doc = new XmlDocument();
-
- Document doc = getDocument(xmlString);
- String tableName = getTableNameByInsert(doc);
- List
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;
- }
-
- }
-