mapper.xml 反向生成表结构

有一天,公司的项目经理急匆匆的跑过来跟我说,公司招了一个新研发,不小心把数据库给删了,这个数据库还没来得及备份,咋办啊,没办法,只能通过mapper文件反向生成表结构了,mybatis里通过表结构生成mapper.xml文件,百度一搜一大把,通过mapper.xml文件生成表结构网上还真没有,花了点时间终于完成了,在此记录下,献给需要的朋友,还是希望大家不要用上吧。

主要两个Java文件,解析xml时用了dom4j,所以需要引入dom4j的jar包。把这两个Java文件放到mapper的根目录

public class MapperSearch {

    public static void main(String[] args) throws Exception {

        // 这个目录很重要,为mapper的根目录,所有的mapper.xml文件都要在这个目录下面
        String packageName = "com.dao";
        StringBuilder sb = new StringBuilder();
        searchFile( packageName, sb);
        
        // 导出文件
        File fp=new File("d:\\database.sql");
        PrintWriter pfp= new PrintWriter(fp);
        pfp.print(sb.toString());
        pfp.close();
        
    }
    
    // 查找mapper文件, 并生成sql语句
    public static void  searchFile(String packageName,StringBuilder sb) throws Exception{
        URL url = MapperSearch.class.getClassLoader().getResource(packageName.replace(".", "/"));
        File dir = new File(url.getFile());
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                searchFile(packageName.replace(".", "/") + "/" + file.getName(),sb);
            } else {
                if(file.getName().indexOf("Mapper.xml")>0){
                    //System.out.println(file.getName());
                    sb.append(MapperParse.parse(file));
                }
            }
        }
    }
}

public class MapperParse {

    public static String parse(File f) throws Exception {
        // 解析mapper.xml文件
        // 创建SAXReader的对象reader
        SAXReader reader = new SAXReader();
        String sql = "";
        try {
            // 通过reader对象的read方法加载mapper.xml文件,获取docuemnt对象。
            Document document = reader.read(f);
            // 通过document对象获取根节点bookstore
            Element mapper = document.getRootElement();
            // 通过element对象的elementIterator方法获取迭代器
            Iterator it = mapper.elementIterator();
            // 遍历迭代器,获取根节点中的信息(书籍)
            String table = "";
            String columns = "";
            while (it.hasNext()) {
                Element resultMap = (Element) it.next();

                // table = searchTable(resultMap);
                if (columns.trim().length() == 0) {
                    columns = searchColumns(resultMap);
                }
                if (table.trim().length() == 0) {
                    table = searchTable(resultMap);
                }
                if (table.trim().length() != 0 && columns.trim().length() != 0) {
                    break;
                }

            }
            if (table.trim().length() != 0 && columns.trim().length() != 0) {
                sql = "CREATE TABLE `" + table.trim() + "` ( `id` char(36) NOT NULL COMMENT '主键ID'," + columns
                        + "PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;\r\n";
            } else {
                sql = "表文件 -----" + f.getName() + "----------有问题,请自行查看";
            }

            System.out.println(sql);

        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sql;
    }

    public static String searchTable(Element e) {
        String table = "";
        if (e.getName().equals("delete")) {
            List<Attribute> resultMapAttrs = e.attributes();
            for (Attribute attr : resultMapAttrs) {
                if (attr.getName().equals("id") && attr.getValue().equals("deleteByPrimaryKey")) {
                    String delSql = e.getText();
                    table = delSql.substring(delSql.indexOf("from") + 4, delSql.indexOf("where")).replaceAll("\n\t\t",
                            "");

                }
            }
        }
        return table;
    }

    public static String searchColumns(Element el) {
        String sql = "";
        if (el.getName().equals("resultMap")) {
            List<Attribute> resultMapAttrs = el.attributes();
            for (Attribute attr : resultMapAttrs) {
                if (attr.getName().equals("id") && attr.getValue().equals("BaseResultMap")) {
                    Iterator itt = el.elementIterator();
                    while (itt.hasNext()) {
                        Element result = (Element) itt.next();
                        if (!result.getName().equals("id")) {
                            List<Attribute> resultAttrs = result.attributes();
                            for (Attribute resultAttr : resultAttrs) {
                                if (resultAttr.getName().equals("column")) {
                                    sql = sql + "`" + resultAttr.getValue() + "` ";
                                }
                                if (resultAttr.getName().equals("jdbcType")) {
                                    if (resultAttr.getValue().equals("VARCHAR")) {
                                        sql = sql + " varchar(50) DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("TIMESTAMP")) {
                                        sql = sql + " datetime DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("CHAR")) {
                                        sql = sql + " char(36) DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("DATE")) {
                                        sql = sql + " date DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("DECIMAL")) {
                                        sql = sql + " decimal(18,4) DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("TINYINT")) {
                                        sql = sql + " tinyint(4) DEFAULT NULL, ";
                                    }
                                    if (resultAttr.getValue().equals("INTEGER")) {
                                        sql = sql + " int(11) DEFAULT NULL, ";
                                    }
                                }

                            }
                        }
                    }
                }

            }

        }
        return sql;
    }
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值