mybatis mapper.xml转建表语句

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

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

依赖的jar

<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version>
</dependency>
<dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.jdom</groupId><artifactId>jdom</artifactId><version>1.1.3</version>
</dependency>

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文件中的这一行去掉:<br>* <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"><br>* 否则JDom根据文件创建Document对象时,会报找不到www.ibatis.com这个异常,导致渲染不成功。*/String xmlString = filterRead(sqlMapFile, "<!DOCTYPE");
//       XmlDocument doc = new XmlDocument();Document doc = getDocument(xmlString);String tableName = getTableNameByInsert(doc);List<Element> resultMap = (List<Element>) 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<Element> 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<Element> resultMap = (List<Element>) 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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134029.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Python数据分析,这里有一条高效的学习路径

无处不在的数据分析 谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

Python中Mock和Patch的区别

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在测试并行开发&#xff08;TPD&#xff09;中&#xff0c;代码开发是第一位的。 尽管如此&#xff0c;我们还是要写出开发的测试&#xff0c…

教育领域数据可视化:点亮知识之路

教育领域一直以来都在不断进步和演变&#xff0c;而数据可视化技术正在为这一领域带来一场革命。在过去的几年里&#xff0c;教育者们越来越意识到&#xff0c;通过将教育数据转化为可视化图表和图形&#xff0c;可以更好地理解学生的表现、需求和趋势&#xff0c;从而提供更好…

科学计算器网站Desmos网站

科学计算器网站Desmos网站 有时在学习工作或者生活中&#xff0c;需要用到计算问题&#xff0c;但由于电脑上没有安装相应的专业软件&#xff0c;难以计算有的问题&#xff0c;因而&#xff0c;本文推荐一种免费的在线计算网站Desmos。 一、Desmos网址 Desmos官网的地址为&a…

doccano 文本标注工具使用

最近在做面向大模型的文本标注工作&#xff0c;涉及到多人协同的问题&#xff0c;因此用到了doccano工具。 这个工具可以使用docker进行安装&#xff0c;安装之后的启动也都比较简单。 关于基础使用&#xff08;例如管理员登录、新建任务、上传数据集等&#xff09;&#xff…

系统架构设计师(第二版)学习笔记----信息系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----信息系统基础 文章目录 一、信息系统概述1.1 信息系统的5个基本功能1.2 信息系统发展阶段1.3 初始阶段的主要特点1.4 传播阶段的主要特点1.5 控制阶段的主要特点1.6 集成阶段的主要特点1.7 信息系统的种类…

计算机是如何工作的(上篇)

计算机发展史 世界上很多的高科技发明,来自于军事领域 计算机最初是用来计算弹道导弹轨迹的 弹道导弹 ~~国之重器,非常重要 两弹一星 原子弹,氢弹,卫星(背后的火箭发射技术) 计算弹道导弹轨迹的计算过程非常复杂,计算量也很大 ~~ 但是可以手动计算出来的(当年我国研究两弹一…

MySQL架构介绍与说明

1、MySQL架构介绍 和其它数据库相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上&#xff0c; 插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的…

【数据结构】C++实现二叉搜索树

二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有结点的值都小于根结点的值。若它的右子树不为空&#xff0c;则右子树上所有结点的值都大于根结…

Spring Boot 动态加载jar文件

Spring Boot 动态加载jar文件 接口实现&#xff1a; package org.bc.device;public interface IDeviceHandler {String start();String stop(); }实现类&#xff1a; package org.bc.device; public class MqttDevice implements IDeviceHandler{ Override public String s…

Linux——Shell脚本编程(2)

一、Shell变量 Linux Shell 中的变量分为&#xff0c;系统变量 和 用户自定义变量 (这个用的比较多)。 系统变量 : $HOME、$PWD、$SHELL、$USER 等等&#xff0c;比如 : echo $HOME 等等.. 显示当前shell中所有变量 : set 举例说明&#xff1a; 二、设置环境变量 记得在注释…

小丑未能阻止抢购iPhone15,预约人数快500万了,而且越贵越买

iPhone15发布后&#xff0c;在昨天开启预约&#xff0c;从某电商平台可以看到预约人数已近300万&#xff0c;加上其他平台&#xff0c;估计预约人数已快500万了&#xff0c;显示出消费者仍然是嘴上说不爱&#xff0c;行动上却是迅速抢购&#xff0c;苹果的真香定律让竞争对手很…

服务器数据恢复-热备盘同步过程中硬盘离线的RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;11块硬盘组建了一组RAID5阵列&#xff0c;另外1块硬盘作为热备盘使用。基于RAID5阵列的LUN分配给linux系统使用&#xff0c;存放Oracle数据库。 服务器故障&#xff1a; RAID5阵列1块硬盘由于未知原因离线…

postgresql 内核源码分析 btree索引插入分析,索引页面分裂流程,多举措进行并发优化,对异常进行保护处理

Btree索引插入流程分析 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&a…

HCIE-HCS规划设计搭建

1、相关术语 1、等价路由 等价路由&#xff08;Equal-cost routing&#xff09;是一种网络路由策略&#xff0c;用于在网络中选择多个具有相同路由度量&#xff08;路由距离或成本&#xff09;的最佳路径之一来转发数据流量。 当存在多个路径具有相同的路由度量时&#xff0c;…

VS Code 安装方法

1.安装控制台程序.NET SDK 功能&#xff1a;应用能够正常的运行和构建。 .NET SDK下载地址&#xff1a;下载 .NET(Linux、macOS 和 Windows) 2.安装驱动编辑器vscode vscode下载地址&#xff1a;https://code.visualstudio.com/Download 选择System Installer&#xff0c;…

windows mysql8.0主从配置

windows mysql8.0主从配置 一、安装两个MySQL并配置 1. 主库配置my.ini&#xff0c;我的主库是安装版 [mysqld] # 设置mysql的安装目录 basedirD:\\soft\\mysql-5.7.39 # 设置mysql数据库的存放目录 datadirD:\\soft\\mysql-5.7.39\\data #设置3306端口 port3306 #主服务器…

乐趣国学—卧薪尝胆

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C#企业办公自动化系统asp.net+sqlserver

办公自动化网站是多层次的技术、设备和系统的综合。一个完整的办公自动化网站应包括信息的生成与输入、信息的加工与处理、信息的存储与检索、信息的复制、信息的传输与交流以及信息安全管理等功能。本软件用于构建、整合、扩展和管理企事业机构的整体信息系统&#xff0c;实现…

linux驱动开发day6--(epoll实现IO多路复用、信号驱动IO、设备树以及节点和属性解析相关API使用)

一、IO多路复用--epoll实现 1.核心&#xff1a; 红黑树、一张表以及三个接口、 2.实现过程及API 1&#xff09;创建epoll句柄/创建红黑树根节点 int epfdepoll_create(int size--无意义&#xff0c;>0即可)----------成功&#xff1a;返回根节点对应文件描述符&#xf…