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" 选…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
