mybatis\mybatis-plus根据xml文件逆向生成数据库结构

1 篇文章 0 订阅
1 篇文章 0 订阅
该文章介绍了一个Java程序,它读取Ibatis的SqlMap配置文件,解析XML并根据其中的resultMap生成SQL建表语句。程序会检查每个字段的jdbcType,对不同类型的字段设置相应的长度和类型,并将结果打印出来。适用于快速生成数据库表结构,前提是XML配置文件中的字段均有jdbcType属性。
摘要由CSDN通过智能技术生成

创建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的文章改造,如有侵权请联系删除.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值