有⼀天,公司的项⽬经理急匆匆的跑过来跟我说,公司招了⼀个新研发,不⼩⼼把数据库给删了,这个数据库还没来得及备份,咋办啊,没办法,只能通过mapper⽂件反向⽣成表结构了,mybatis⾥通过表结构⽣成l⽂件,百度⼀搜⼀⼤把,通过l⽂件⽣成表结构⽹上还真没有,花了点时间终于完成了,在此记录下,献给需要的朋友,还是希望⼤家不要⽤上吧。
主要两个Java⽂件,解析xml时⽤了dom4j,所以需要引⼊dom4j的jar包。把这两个Java⽂件放到mapper的根⽬录
public class MapperSearch {
public static void main(String[] args) throws Exception {
// 这个⽬录很重要,为mapper的根⽬录,所有的l⽂件都要在这个⽬录下⾯
String packageName = "com.dao";
StringBuilder sb = new StringBuilder();
searchFile( packageName, sb);
// 导出⽂件
File fp=new File("d:\\database.sql");使用dom4j解析xml文件
PrintWriter pfp= new PrintWriter(fp);
pfp.String());
pfp.close();
}
// 查mapper⽂件, 并⽣成sql语句
public static void  searchFile(String packageName,StringBuilder sb) throws Exception{
URL url = ClassLoader().place(".", "/"));
File dir = new File());
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
place(".", "/") + "/" + Name(),sb);
} else {
Name().indexOf("l")>0){
//System.out.Name());
sb.append(MapperParse.parse(file));
}
}
}
}
}
public class MapperParse {
public static String parse(File f) throws Exception {
// 解析l⽂件
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
String sql = "";
try {
// 通过reader对象的read⽅法加载l⽂件,获取docuemnt对象。
Document document = ad(f);
// 通过document对象获取根节点bookstore
Element mapper = RootElement();
/
/ 通过element对象的elementIterator⽅法获取迭代器
Iterator it = mapper.elementIterator();
// 遍历迭代器,获取根节点中的信息(书籍)
String table = "";
String columns = "";
while (it.hasNext()) {
Element resultMap = (Element) it.next();
// table = searchTable(resultMap);
if (im().length() == 0) {
columns = searchColumns(resultMap);
}
if (im().length() == 0) {
table = searchTable(resultMap);
}
if (im().length() != 0 && im().length() != 0) {
break;
}
}
if (im().length() != 0 && im().length() != 0) {
sql = "CREATE TABLE `" + im() + "` ( `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 (Name().equals("id") && Value().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 (Name().equals("id") && Value().equals("BaseResultMap")) {                    Iterator itt = el.elementIterator();
while (itt.hasNext()) {
Element result = (Element) ();
if (!Name().equals("id")) {
List<Attribute> resultAttrs = result.attributes();
for (Attribute resultAttr : resultAttrs) {
if (Name().equals("column")) {
sql = sql + "`" + Value() + "` ";
}
if (Name().equals("jdbcType")) {
if (Value().equals("VARCHAR")) {
sql = sql + " varchar(50) DEFAULT NULL, ";
}
if (Value().equals("TIMESTAMP")) {
sql = sql + " datetime DEFAULT NULL, ";
}
if (Value().equals("CHAR")) {
sql = sql + " char(36) DEFAULT NULL, ";
}
if (Value().equals("DATE")) {
sql = sql + " date DEFAULT NULL, ";
}
if (Value().equals("DECIMAL")) {
sql = sql + " decimal(18,4) DEFAULT NULL, ";
}
if (Value().equals("TINYINT")) {
sql = sql + " tinyint(4) DEFAULT NULL, ";
}
if (Value().equals("INTEGER")) {
sql = sql + " int(11) DEFAULT NULL, ";
}
}
}
}
}
}
}
}
return sql;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。