有一天,公司的项目经理急匆匆的跑过来跟我说,公司招了一个新研发,不小心把数据库给删了,这个数据库还没来得及备份,咋办啊,没办法,只能通过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;
}
}