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;}}
相关文章:
mybatis mapper.xml转建表语句
从网上下载了代码,但是发现没有DDL建表语句,只能自己手动创建了,感觉太麻烦,就写了一个工具类 将所有的mapper.xml放入到一个文件夹中,程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…...
封装使用Axios进行前后端交互
Axios是一个强大的HTTP客户端,用于在Vue.js应用中进行前后端数据交互。本文将介绍如何在Vue中使用Axios,并通过一个企业应用场景来演示其实际应用。 Axios简介 公众号:Code程序人生,个人网站:https://creatorblog.cn A…...
SOA、分布式、微服务
SOA: SOA是一种软件设计架构,用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务,这些服务通过标准化的接口进行通信,并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…...
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。 import sys import zlib import json import mathKAFKA_MAX_SIZE 1024 * 1024 CONTENT_MIN_MAX_SIZE KAFKA_MAX_SIZE * 0.9def split_data(data):"&q…...
移动端APP测试-如何指定测试策略、测试标准?
制定项目的测试策略是一个重要的步骤,可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等,从而提高测试效率和质量。本篇是一些经验总结,理论分享。并不是绝对正确的,也欢迎大家一起讨论。 文章目录 一、测…...
【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理
文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...
CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )
scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...
9.19号作业
2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...
Mybatis学习笔记9 动态SQL
Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景: 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...
element表格 和后台联调
1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...
基于SSM的智慧城市实验室主页系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)
《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代, 编著成5000页的《尼恩Java面试宝典》,致力于体系化, 系统化,形象化 梳理,形成一个大的知识体系,从而帮助大家 进大厂&a…...
线程池各个参数设置说明
1. corePoolSize 核心线程数 看处理业务属于IO密集型还是属于cpu密集型IO密集型: 通常设置为N1,还有一个计算公式:线程数 cpu数*(线程等待时间/线程总的处理时间) 但是由于服务器除了这个服务可能还部署有其他服务,…...
springBoot对接多个mq并且实现延迟队列---未完待续
mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…...
Pytorch从零开始实战04
Pytorch从零开始实战——猴痘病识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——猴痘病识别环境准备数据集模型选择模型训练数据可视化其他模型图片预测 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytor…...
北大C++课后记录:文件读写的I/O流
前言 文件和平常用到的cin、cout流其实是一回事,可以将文件看作一个有限字符构成的顺序字符流,基于此,也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注:这里的指针并不是普…...
详解Linux的grep命令
2023年9月19日,周二晚上 先写这么多吧,以后有空再更新,还要一些作业没写完.... 目录 概述查看grep命令的所有选项grep的常用选项选项-i选项-v选项-n选项-c编辑选项-l组合使用 概述 grep命令在Linux系统中是一个很重要的文本搜索工具和过…...
spark6. 如何设置spark 日志
spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…...
glibc: strlcpy
https://zine.dev/2023/07/strlcpy-and-strlcat-added-to-glibc/ https://sourceware.org/git/?pglibc.git;acommit;h454a20c8756c9c1d55419153255fc7692b3d2199 https://linux.die.net/man/3/strlcpy https://lwn.net/Articles/612244/ 从这里看,这个strlcpy、st…...
如何在 Buildroot 中配置 Samba
在 Buildroot 中配置 Samba 在 Buildroot 中配置 Samba 可以通过以下步骤完成: 1. 进入 Buildroot 的根目录。 2. 执行 make menuconfig 命令,打开 Buildroot 的配置菜单。 3. 在配置菜单中,使用键盘导航到 "Target packages" 选…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
