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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在实现基于框架结构前后端分离的图书信息管理系统时,使用mybatis-plus数据库逆向工程生成主要的包的步骤如下: 1. 首先,需要在pom.xml文件中添加mybatis-plus的依赖,以及MySQL数据库的驱动依赖。 2. 然后,在项目的src/main/java目录下创建一个com.example.bookmanage.mapper包,用于存放Mapper接口。 3. 接着,在src/main/resources目录下创建一个mybatis-plus的generator目录,用于存放代码生成器的配置文件。 4. 在generator目录下创建一个generatorConfig.xml的配置文件,用于配置代码生成器的参数。在该文件中,需要配置数据库连接信息、生成代码的包路径、生成的表格、生成的代码类型等。 5. 配置完generatorConfig.xml文件后,需要在pom.xml文件中添加maven插件mybatis-plus-generator-plugin,用于执行代码生成器。 6. 在执行代码生成器之前,需要先在MySQL数据库中创建对应的表格,并插入一些测试数据。这是因为mybatis-plus的代码生成器需要读取数据库中的表格信息,才能生成对应的Java代码。 7. 执行代码生成器的命令是:mvn mybatis-plus:generator。执行后,mybatis-plus会自动读取generatorConfig.xml文件中的配置信息,生成对应的Java代码。 8. 生成的Java代码会被存放在src/main/java目录下的com.example.bookmanage.entity、com.example.bookmanage.mapper、com.example.bookmanage.service和com.example.bookmanage.controller等包中。其中,entity包存放实体类,mapper包存放Mapper接口,service包存放Service接口和实现类,controller包存放控制器类。 总的来说,使用mybatis-plus数据库逆向工程生成主要的包,可以大大提高开发效率,减少手动编写重复代码的工作量。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值