我转载了CSDN一篇5万+访问量的文章

逆向生成实体类等文件,是项目常用技能,单纯IDEA插件也可以实现将数据库表字段直接生成到指定文件夹下的实体类,Mybatis的逆向工程还可生成Controller,service,impl,mapper,mapper.xml等文件,Hibernate也可搭配MVC生成除此之外的前端页面,今天这篇文章,将介绍根据实体类生成建表SQL语句。

先介绍下idea生成实体类的方法。

1.绑定数据库

2.同步数据库后,选择要生成实体类的表

3.指定文件夹即可

接下来为转载正文

通过实体类生成对应的建表语句

最近的工作是把json解析后存入数据库,要求根据其结构创建对应的表去存放这些数据,然后就开始建起了实体类,花了整整一天时间,见了60多个类。。。想着要把这些类再创建成表简直是要疯掉。。还好我机智的想到了可以用反射解决这个问题。

我要做的很简单

1.根据类名称获取其字段名称;

2.根据其字段名称拼接成sql语句即可。

《注意文中目前写死了生成String与int类型,其他自行更改》

接着就在第二天花了半小时捣鼓出了以下代码:

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * sql自动生成
 * @author 
 * @date 2018年4月11日
 */
public class SqlGenerator {
  private static final Logger logger = LoggerFactory.getLogger(SqlGenerator.class);
  
  public static void main(String[] args) {
    //实体类所在的package在磁盘上的绝对路径
    String packageName = "E:/report";
    //生成sql的文件夹
    String filePath = "E:/create/";
    //项目中实体类的路径
    String prefix = "com.example.entity.";
    String className = "";

    StringBuffer sqls = new StringBuffer();
    //获取包下的所有类名称
    List<String> list = getAllClasses(packageName);
    for (String str : list) {
      className = prefix + str.substring(0, str.lastIndexOf("."));
      String sql = generateSql(className, filePath);
      sqls.append(sql);
    }
    System.out.println(sqls.toString());
    StringToSql(sqls.toString(), filePath + "report.sql");

  }
  /**
   * 根据实体类生成建表语句
   * @author  
   * @date  2018年4月11日
   * @param className 全类名  
   * @param filePath 磁盘路径  如 : d:/workspace/
   */
  public static String generateSql(String className,String filePath){
    try {
      Class<?> clz = Class.forName(className);
      className = clz.getSimpleName();
      Field[] fields = clz.getDeclaredFields();
      StringBuffer column = new StringBuffer();
      String varchar = " varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,";
      for (Field f : fields) {
        column.append(" \n `"+f.getName()+"`").append(varchar);
      }
      StringBuffer sql = new StringBuffer();
      sql.append("\n DROP TABLE IF EXISTS `"+className+"`; ")
        .append(" \n CREATE TABLE `"+className+"`  (")
        .append(" \n `id` int(11) NOT NULL AUTO_INCREMENT,")
        .append(" \n "+column)
        .append(" \n PRIMARY KEY (`id`) USING BTREE,")
        .append("\n INDEX `id`(`id`) USING BTREE")
        .append(" \n ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci;");
      return sql.toString();
    } catch (ClassNotFoundException e) {
      logger.debug("该类未找到!");
      return null;
    }
    
  }
  
  /**
   * 获取包下的所有类名称,获取的结果类似于 XXX.java
   * @author  
   * @date  2018年4月11日
   * @param packageName
   * @return
   */
  public static List<String> getAllClasses(String packageName){
    List<String> classList = new ArrayList<String>();
    String className="";
    File f = new File(packageName);
    if(f.exists() && f.isDirectory()){
      File[] files = f.listFiles();
      for (File file : files) {
         className = file.getName();
         classList.add(className);
      }
      return classList;
    }else{
      logger.debug("包路径未找到!");
      return null;
    }
  }
  /**
   * 将string 写入sql文件
   * @author  
   * @date  2018年4月11日
   * @param str
   * @param path
   */
  public static void StringToSql(String str,String path){
    byte[] sourceByte = str.getBytes();  
    if(null != sourceByte){  
        try {  
            File file = new File(path);     //文件路径(路径+文件名)  
            if (!file.exists()) {   //文件不存在则创建文件,先创建目录  
                File dir = new File(file.getParent());  
                dir.mkdirs();  
                file.createNewFile();  
            }  
            FileOutputStream outStream = new FileOutputStream(file);    //文件输出流用于将数据写入文件  
            outStream.write(sourceByte);  
            outStream.flush();
            outStream.close();  //关闭文件输出流  
            System.out.println("生成成功");
        } catch (Exception e) {  
          e.printStackTrace();
        }  
    }  
  }
}

写这段代码的时候还顺便做了个package下的类名扫描,这样就不用一个一个生成建表语句了。

注意事项:

//实体类所在的package在磁盘上的绝对路径
//绝对路径一定要书写到根目录否则读取不到String packageName = "F:\\Subversion\\main\\java\\com\\project\\system\\dept\\domain";
//生成sql的文件夹
String filePath = "F:\\upload";
//项目中实体类的路径,以点结尾String prefix = "com.system.dept.domain.";
String className = "Dept.java";

我自己测试结果:

————————————————

版权声明:本文为CSDN博主「lygogogo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ly690226302/article/details/79920319

还没完,仍然继续转载了一篇以前令我万分头疼的Thymleaf复选框回显问题,我当时因为复选框对齐回显样式问题折腾了不少时间,然后朋友圈的小伙子实现了他,并因此上过CSDN的首页推荐,2400+的访问量。

在Thymeleaf中执行Java方法,实现CheckBox的自选中

今天在开发中遇到了一个需求就是页面返回的时候让checkbox回显的,本来用JS来写并没有什么难度的。但是要使用Thymeleaf就变得有些复杂。thymeleaf有一个特性就是可以在标签中执行Java的方法。

<label class="checkbox-inline i-checks"  th:each="data : ${list}">  
    <input th:attr="checked=${methodService.contains(data.id,proofsList)?true:false}" type="checkbox" name="proofs[]"  th:value="${data.id}" id="inlineCheckbox1" />
</lable>

这里主要说明一下这个methodService.contains方法,它接受两个参数一个是id,一个是list

public class MethodService {
 
    public boolean contains(String id,List<Proof> proofs){
        System.out.println(proofs);
        List<String> ids = new ArrayList<>();
        for(Proof p: proofs){
           ids.add(p.getId());
        }
        return (ids.contains(id));
    }
}

这一步很重要 你要把这个调用的类放到Request域中,或者Session中,当然页面取值的时候也是不相同的。在Session中取值如下:session.proofsList

MethodService md = new MethodService();
 mmap.put("methodService",md);
 mmap.put("proofsList",proofsList);

————————————————

版权声明:本文为CSDN博主「Crowno17」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_24532581/article/details/85320870

近期素材较少,研究过关于逆向生成全套代码,包括CRUD的代码,一直在调试过程,也让朋友帮了忙,尽快写出来,下期见。

原文发布于微信公众号 - 赵KK日常技术记录(gh_cc4c9f1a9521)

原文发表时间:2019-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券