根据实体类生成对应sql语句
package com.chixing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* @Description:
* @Author: kcheng
* @Date: 2021/3/23 10:56
*/
public class GenerateSqlTest {
private static final Logger logger = LoggerFactory.getLogger(GenerateSqlTest.class);
public static void main(String[] args) {
//实体类所在的package在磁盘上的绝对路径 d:/workspace/
String packageName = "D:/work/idea/Ylsn-master/Ylsn-master/Ylsn10.22/src/main/java/com/chixing/entity";
//生成sql的文件夹
String filePath = "D:/work/idea/Ylsn-master/Ylsn-master";
//项目中实体类的路径
String prefix = "com.chixing.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 2019年1月14日
* @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 = " DEFAULT NULL,";//CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
for (Field f : fields) {
column.append(" \n `"+HumpToUnderline(f.getName())+"` ").append(getObjectValue(f)).append(varchar);
}
StringBuffer sql = new StringBuffer();
String classNewName = HumpToUnderline(className);
classNewName = classNewName.substring(1,classNewName.length());
sql.append("\n DROP TABLE IF EXISTS `"+classNewName+"`; ")
.append(" \n CREATE TABLE `"+classNewName+"` (")
.append(" \n `id` int(11) NOT NULL AUTO_INCREMENT,")
.append(""+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;
} catch (Exception e) {
logger.debug("生成失败!");
e.printStackTrace();
return null;
}
}
/**
* 获取包下的所有类名称,获取的结果类似于 XXX.java
* @author
* @date 2019年1月14日
* @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 2019年1月14日
* @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();
}
}
}
/***
* 驼峰命名转为下划线命名
*
* @param para
* 驼峰命名的字符串
*/
public static String HumpToUnderline(String para){
StringBuilder sb=new StringBuilder(para);
int temp=0;//定位
if (!para.contains("_")) {
for(int i=0;i<para.length();i++){
if(Character.isUpperCase(para.charAt(i))){
sb.insert(i+temp, "_");
temp+=1;
}
}
}
return sb.toString().toUpperCase().toLowerCase();
}
//根据属性类型生成对应sql类型
public static String getObjectValue(Field field) throws Exception {
// 获取实体类的所有属性,返回Field数组
if (field != null) {// --for() begin
//System.out.println(field.getGenericType());//打印该类的所有属性类型
// 如果类型是String
if (field.getGenericType().toString().equals(
"class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
// 拿到该属性的gettet方法
/**
* 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的
* 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX)
* 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范
*/
return "varchar(255)";
}
// 如果类型是Integer
if (field.getGenericType().toString().equals(
"class java.lang.Integer")) {
return "int(11)";
}
// 如果类型是Double
if (field.getGenericType().toString().equals(
"class java.lang.Double")) {
return "decimal(16,2)";
}
// 如果类型是Boolean 是封装类
if (field.getGenericType().toString().equals(
"class java.lang.Boolean")) {
return "char(1)";
}
// 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的
// 反射找不到getter的具体名
if (field.getGenericType().toString().equals("boolean")) {
return "char(1)";
}
// 如果类型是Date
if (field.getGenericType().toString().equals(
"class java.util.Date")) {
return "datetime";
}
// 如果类型是Short
if (field.getGenericType().toString().equals(
"class java.lang.Short")) {
return "int(11)";
}
// 如果类型是int
if (field.getGenericType().toString().equals("int")) {
return "int(11)";
}
// 如果还需要其他的类型请自己做扩展
}//if (object!=null ) ----end
return "varchar(255)";
}
// 把一个字符串的第一个字母大写、效率是最高的、
private static String getMethodName(String fildeName) throws Exception{
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
}
生成测试数据
引入依赖
<!--测试数据生成工具-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>java-testdata-generator</artifactId>
<version>1.1.2</version>
</dependency>
测试代码
package com.chixing;
import cn.binarywang.tools.generator.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @Description:
* @Author: sunjiacheng
* @Date: 2021/3/23 11:22
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class GenerateDataTest {
@Test
public void test1() {
//身份证号码
ChineseIDCardNumberGenerator cidcng = (ChineseIDCardNumberGenerator) ChineseIDCardNumberGenerator.getInstance();
System.out.println(cidcng.generate());
//中文姓名
ChineseNameGenerator cng = ChineseNameGenerator.getInstance();
System.out.println(cng.generate());
//英文姓名
EnglishNameGenerator eng = EnglishNameGenerator.getInstance();
System.out.println(eng.generate());
//手机号
ChineseMobileNumberGenerator cmng = ChineseMobileNumberGenerator.getInstance();
System.out.println(cmng.generate());
//电子邮箱
EmailAddressGenerator eag = (EmailAddressGenerator) EmailAddressGenerator.getInstance();
System.out.println(eag.generate());
//居住地址
ChineseAddressGenerator cag = (ChineseAddressGenerator) ChineseAddressGenerator.getInstance();
System.out.println(cag.generate());
}
}
3528

被折叠的 条评论
为什么被折叠?



