Mybatis 自动生成XML转换SQL工具
初衷
本人去git找源码时,发现部分代码,不提供sql文件。实在令人气愤。如果xml很多,一个一个去mysql 工具创建数据库,那也太可怕了。
思路
- 将mybatis创建的XML文件解析出来,只用到 resultMap 里面的数据。
- 根据mysql 创建数据表语句,将解析得到数据进行拼接。
- 将拼接好的数据,保存在一个.sql文件中
实践
使用 dom4j-2.1.3.jar 解析xml文件,fastjson-1.2.68.jar 格式化存放解析出来数据。
1、创建 ConvertTool 工具类,用于解析XML文件,数据拼接mysql语句。
public class ConvertTool {public static List<JSONObject> start(String path) throws DocumentException {// 创建saxReader对象 SAXReader reader = new SAXReader();// 通过read方法读取一个文件 转换成Document对象 Document document = reader.read(new File(path));//获取根节点元素对象 Element node = document.getRootElement();List<JSONObject> jsonObject = new ArrayList<>();//读取dom4j.xml文件中所有元素listNodes(node,jsonObject);System.out.println(jsonObject.toString());return jsonObject;}//节点内容public static void listNodes(Element node, List<JSONObject> jsonObject) {String nodeName = node.getName();if ("result".equals(nodeName) || "id".equals(nodeName)|| "resultMap".equals(nodeName) || "mapper".equals(nodeName)) {System.out.println("当前节点的名称::" + node.getName());
// 获取当前节点的所有属性节点 List<Attribute> list = node.attributes();JSONObject item = new JSONObject();// 遍历属性节点 for (Attribute attr : list) {System.out.println(attr.getText()+ "---" + attr.getName()+ "---" + attr.getValue());item.put(attr.getName(), attr.getValue());}if (item.get("namespace") == null) {jsonObject.add(item);}//如果文本内容不是空,则打印if (!(node.getTextTrim().equals(""))) {System.out.println("文本内容::::" + node.getText());}// 当前节点下面子节点迭代器 Iterator<Element> it = node.elementIterator();// 遍历 while (it.hasNext()) {
// 获取某个子节点对象 Element e = it.next();// 对子节点进行遍历 listNodes(e,jsonObject);}} else {return;}}// 将xml解析出来的数据转换成Stringpublic static String handleXMLToText( List<List<JSONObject>> jsonData){StringBuffer stringBuffer = new StringBuffer();String tableName = null; // 数据表名String typeVal = null;String column = null; // 列名String jdbcType = null; // 数据类型for(int i = 0; i < jsonData.size(); i++){List<JSONObject> items = jsonData.get(i);stringBuffer.append("CREATE TABLE ");for (int j = 0; j < items.size(); j++){JSONObject item = items.get(j);if (item.get("column") == null) {typeVal = (String) item.get("type");String[] typeValS = typeVal.split("\\.");tableName = typeValS[typeValS.length - 1];System.out.println("数据表 名::::" + tableName);stringBuffer.append(tableName + "( ");} else {column = (String) item.get("column");jdbcType = (String) item.get("jdbcType");stringBuffer.append(column + " " + jdbcType+ (("VARCHAR".equals(jdbcType))? "(255)" : "")+ (j == items.size() - 1 ? " " : "," + "\r\n"));}}stringBuffer.append("\r\n )\r\n");}System.out.println("数据sql::::" + stringBuffer.toString());return stringBuffer.toString();}}
2、创建 FileTool工具类,用于读写数据。
public class FileTool {public static void wirte(String path,String content){// 构建指定文件File file = new File(path);System.out.println("数据sql 路径::::" + path);// 根据文件创建文件的输出流try (OutputStream os = new FileOutputStream(file)) {// 把内容转换成字节数组byte[] data = content.getBytes();// 向文件写入内容os.write(data);} catch (Exception e) {e.printStackTrace();}}public static List<String> getXMLFiles(String path) {File file = new File(path);//File类型可以是文件也可以是文件夹File[] fileList = file.listFiles();//将该目录下的所有文件放置在一个File类型的数组中List<String> wjList = new ArrayList<String>();//新建一个文件集合for (int i = 0; i < fileList.length; i++) {if (fileList[i].isFile() && fileList[i].getName().endsWith(".xml") ) {//判断是否为XML文件wjList.add(fileList[i].getAbsolutePath());}}return wjList;}
}
3、创建 JFrameMain SWING 可视化窗口类,用于操作以及一些逻辑判断
public class JFrameMain extends JFrame implements ActionListener{JButton open = null;Label pathLabel = null;TextField pathText = null;JButton openTarger = null;Label targerLabel = null;TextField targerText = null;JButton handleStart = null;public static void main(String[] args) {new JFrameMain();}public JFrameMain(){FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 30, 20);Panel pannel = new Panel(layout);pathLabel = new Label();pathLabel.setText("选择XML文件目录:");pannel.add(pathLabel);open=new JButton("选择");open.setSize(80, 40);pannel.add(open);pathText = new TextField();pathText.setColumns(50);pathText.setEnabled(false);pannel.add(pathText);open.setActionCommand("path");open.addActionListener(this);targerLabel = new Label();targerLabel.setText("选择存放目录:");pannel.add(targerLabel);openTarger=new JButton("选择");openTarger.setSize(80, 40);pannel.add(openTarger);targerText = new TextField();targerText.setColumns(50);targerText.setEnabled(false);pannel.add(targerText);openTarger.setActionCommand("target");openTarger.addActionListener(this);handleStart = new JButton("开始");handleStart.setSize(750, 40);pannel.add(handleStart);handleStart.setActionCommand("start");handleStart.addActionListener(this);this.setBounds(400, 200, 700, 200);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.add(pannel);}@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("actionPerformed:"+ e.getActionCommand());// TODO Auto-generated method stubif ("path".equals(e.getActionCommand()) || "target".equals(e.getActionCommand())) {JFileChooser jfc=new JFileChooser();jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );jfc.showDialog(new JLabel(), "选择");File file=jfc.getSelectedFile();if(file.isDirectory()){System.out.println("文件夹:"+file.getAbsolutePath());if ("path".equals(e.getActionCommand())) {pathText.setText(file.getAbsolutePath().toString());} else if ("target".equals(e.getActionCommand())){targerText.setText(file.getAbsolutePath().toString());}}else{JOptionPane.showMessageDialog(null, "请选择文件夹");if ("path".equals(e.getActionCommand())) {pathText.setText("");} else if ("target".equals(e.getActionCommand())){pathText.setText("");}System.out.println("文件:"+file.getAbsolutePath());}System.out.println(jfc.getSelectedFile().getName());} else if ("start".equals(e.getActionCommand())) {String path = pathText.getText();String targetPath = targerText.getText();if ( ( path == null || "".equals(path))|| ( targetPath == null || "".equals(targetPath))) {JOptionPane.showMessageDialog(null, "请选择文件夹");return;}Long startTime = new Date().getTime();System.out.println("开始转换"+ startTime);handleStart.setEnabled(false);handleFile();System.out.println("结束转换"+ new Date().getTime());System.out.println("转换消耗"+ (new Date().getTime() - startTime ));handleStart.setEnabled(true);JOptionPane.showMessageDialog(null, "转换成功转换消耗(ms)" + (new Date().getTime() - startTime ) );}}private void handleFile(){String path = pathText.getText();List<String> datas = FileTool.getXMLFiles(path);System.out.println("xmls文件:"+ datas.toString());List<List<JSONObject>> jsonData = new ArrayList<>();for (int i = 0; i < datas.size(); i++){try {List<JSONObject> item = ConvertTool.start(datas.get(i));jsonData.add(item);} catch (DocumentException e) {e.printStackTrace();}}System.out.println("xmls文件解析:"+ jsonData.toString());String result = ConvertTool.handleXMLToText(jsonData);String targetPath = targerText.getText();targetPath += "\\"+ new Date().getTime()+ ".sql";FileTool.wirte(targetPath, result);}}
运行 JFrameMain 即可。
页面:
源码
Mybatis 自动生成XML转换SQL工具相关推荐
- mybatis 自动生成integer_通过mybatis-generator-core工具自动关联表生成对应model、mappers及dao层代码类完整教程...
一.前言 二.方法一(基于批处理方式) 1.在mysql的数据库test中创建guser表脚本CREATE TABLE 'guser' (@b@ 'id' int(20) NOT NULL COMM ...
- Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功
Spring+SpringMVC+Mybatis(开发必备技能) 04.mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本.配套使用视频,100%运行成功 百度网 ...
- 【MyBatis】MyBatis自动生成代码之查询爬坑记
前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...
- Mybatis自动生成的Example类的使用与解析
在上篇文章我有讲到mybatis如何自动生成我们所需的dao代码,今天我们把上篇文章遗留的问题给大家讲解一下.个人拙见,欢迎补充. 上篇文章中我有说过利用Mybatis自动生成的Example类可以满 ...
- 简单的利用IDEA搭建SpringBoot+Maven+Mybatis+自动生成代码
最近在系统的学习SpringBoot框架,并且要用该框架做个项目--网上也大大小小看了很多教程,感觉很多写文章的人都不太负责任,只知道搬运,大概都没有实际操作过,问题也是有很多,所以自己写一篇文章记录 ...
- Mybatis自动生成实体类等代码
Mybatis自动生成实体类等代码 具体步骤 具体步骤 在本机随便找个目录存放以下文件,如图(mybatis-generator-core-1.3.5.jar 和 mysql-connector-ja ...
- 让Visual Studio 2013为你自动生成XML反序列化的类
Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签,让开发人员可以对所编辑文档的修改.查找.定位情 ...
- Mybatis自动生成代码插件generator
Mybatis自动生成代码插件generator 1.pom maven依赖 <dependencies><dependency><groupId>org.myba ...
- 使用mybatis自动生成指定规则的编号
一.要求 1.如果表中还未有菜单,添加一级菜单,编号为:'300' 2.继续添加一级菜单,编号为:一级菜单最大编号 + 1,如'301','302','303' 3.添加子级菜单:编号 = 父级编号 ...
最新文章
- json格式天气数据的获取,jsonp方式获取统计图数据
- 某程序员求助:30万年包留在家乡华为,50万年包去新加坡shopee,选哪个?
- 从头开始写框架(一):浅谈JS模块化发展
- 跨sql server查询mysql_SQL Server 跨数据库查询数据的方法
- Window下VS运行达梦DPI
- Java的ClassLoader
- 微服务的好处与弊端_一文了解微服务的流程和组织
- elipse手机设备显示Target unknown或者offline解决方法
- Vue.js项目中,当图片无法显示时则显示默认图片
- 将一张图片修改为合适的像素大小
- CCF NOI1025 统计奖牌
- android 手机内存清理,教你彻底清理手机内存的最佳方法,只需一招
- phpnow mysql升级,phpnow升级apache版本
- 在python中、int表示的是数据类型是_Python3基本数据类型之intstr
- Java 依据文件名后缀,获取Content-Type/Mime类型
- ROS2使用OpenCV基础
- 为什么要找一个不提倡加班的工作?是我我们太懒,不求上进吗?
- 垃圾回收篇~~垃圾回收概述
- mmdetection的安装并训练自己的VOC数据集
- 揭秘马斯克脑机接口公司Neuralink的科学雄心