逆向生成实体类等文件,是项目常用技能,单纯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的代码,一直在调试过程,也让朋友帮了忙,尽快写出来,下期见。