初衷

本人去git找源码时,发现部分代码,不提供sql文件。实在令人气愤。如果xml很多,一个一个去mysql 工具创建数据库,那也太可怕了。

思路

  1. 将mybatis创建的XML文件解析出来,只用到 resultMap 里面的数据。
  2. 根据mysql 创建数据表语句,将解析得到数据进行拼接。
  3. 将拼接好的数据,保存在一个.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工具相关推荐

  1. mybatis 自动生成integer_通过mybatis-generator-core工具自动关联表生成对应model、mappers及dao层代码类完整教程...

    一.前言 二.方法一(基于批处理方式) 1.在mysql的数据库test中创建guser表脚本CREATE TABLE 'guser' (@b@  'id' int(20) NOT NULL COMM ...

  2. Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功

    Spring+SpringMVC+Mybatis(开发必备技能) 04.mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本.配套使用视频,100%运行成功 百度网 ...

  3. 【MyBatis】MyBatis自动生成代码之查询爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  4. Mybatis自动生成的Example类的使用与解析

    在上篇文章我有讲到mybatis如何自动生成我们所需的dao代码,今天我们把上篇文章遗留的问题给大家讲解一下.个人拙见,欢迎补充. 上篇文章中我有说过利用Mybatis自动生成的Example类可以满 ...

  5. 简单的利用IDEA搭建SpringBoot+Maven+Mybatis+自动生成代码

    最近在系统的学习SpringBoot框架,并且要用该框架做个项目--网上也大大小小看了很多教程,感觉很多写文章的人都不太负责任,只知道搬运,大概都没有实际操作过,问题也是有很多,所以自己写一篇文章记录 ...

  6. Mybatis自动生成实体类等代码

    Mybatis自动生成实体类等代码 具体步骤 具体步骤 在本机随便找个目录存放以下文件,如图(mybatis-generator-core-1.3.5.jar 和 mysql-connector-ja ...

  7. 让Visual Studio 2013为你自动生成XML反序列化的类

    Visual Sutdio 2013增加了许多新功能,其中很多都直接提高了对代码编辑的便利性.如: 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签,让开发人员可以对所编辑文档的修改.查找.定位情 ...

  8. Mybatis自动生成代码插件generator

    Mybatis自动生成代码插件generator 1.pom maven依赖 <dependencies><dependency><groupId>org.myba ...

  9. 使用mybatis自动生成指定规则的编号

    一.要求 1.如果表中还未有菜单,添加一级菜单,编号为:'300' 2.继续添加一级菜单,编号为:一级菜单最大编号 + 1,如'301','302','303' 3.添加子级菜单:编号 = 父级编号 ...

最新文章

  1. json格式天气数据的获取,jsonp方式获取统计图数据
  2. 某程序员求助:30万年包留在家乡华为,50万年包去新加坡shopee,选哪个?
  3. 从头开始写框架(一):浅谈JS模块化发展
  4. 跨sql server查询mysql_SQL Server 跨数据库查询数据的方法
  5. Window下VS运行达梦DPI
  6. Java的ClassLoader
  7. 微服务的好处与弊端_一文了解微服务的流程和组织
  8. elipse手机设备显示Target unknown或者offline解决方法
  9. Vue.js项目中,当图片无法显示时则显示默认图片
  10. 将一张图片修改为合适的像素大小
  11. CCF NOI1025 统计奖牌
  12. android 手机内存清理,教你彻底清理手机内存的最佳方法,只需一招
  13. phpnow mysql升级,phpnow升级apache版本
  14. 在python中、int表示的是数据类型是_Python3基本数据类型之intstr
  15. Java 依据文件名后缀,获取Content-Type/Mime类型
  16. ROS2使用OpenCV基础
  17. 为什么要找一个不提倡加班的工作?是我我们太懒,不求上进吗?
  18. 垃圾回收篇~~垃圾回收概述
  19. mmdetection的安装并训练自己的VOC数据集
  20. 揭秘马斯克脑机接口公司Neuralink的科学雄心

热门文章

  1. python中imread用法_【转载】Python 中各种imread函数的区别与联系
  2. Gitolite 简介
  3. vue之sourcemap
  4. mysql 快速导出_Mysql 大量数据快速导出
  5. #### 标题关于Quartus Ⅱ启动ModelSim仿真软件时提示Can't lauch the ModelSim的问题
  6. matlab 制作A*B棋盘格
  7. WebAR 开发基本步骤
  8. Golang学习笔记(十七):len函数
  9. 基于知识图谱的语义理解技术及应用
  10. 2013年9月11日热身赛