java 实体类生成代码
摘要:
根据数据库表自己动生成实体类代码,因为之前一直用的破解的IDEA,现在换成社区版的,没这个功能。
package com.idowcn.superstore.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
/**
*
*/
public class DBTools {
//数据库连接
private static final String url = "jdbc:mysql://127.0.0.1:3306/dev_test?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT";
private static final String name = "root";
private static final String pass = "test";
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static final String dbName = "dev_test";
private static final String author = "yihuas@163.com";
private static final String sRootPath = System.getProperty("user.dir") + "\\";
private static final String packagename = "package com.idowcn.test"; //工程所在包名称
private Connection conn;
private List<String> tables = new ArrayList<String>();
private boolean bCancel = false;
private boolean bWhole = false;
public void addTableName(String sTableName) {
tables.add(sTableName);
}
//从数据库返回所有表名称
public void addTableName() {
try {
DatabaseMetaData dbMetaData = conn.getMetaData();
ResultSet rs = dbMetaData.getTables(null, null, null, new String[]{"TABLE"});
while (rs.next()) {// ///TABLE_TYPE/REMARKS
if (rs.getString("TABLE_CAT").compareToIgnoreCase(dbName) == 0) {
// System.out.println("表名:" + rs.getString("TABLE_NAME"));
addTableName(rs.getString("TABLE_NAME"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//获取conn
public void InitConnection() throws Exception {
try {
bWhole = false;
bCancel = false;
Class.forName(driver).newInstance();
conn = java.sql.DriverManager.getConnection(url, name, pass);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
//释放conn
public void finalize() {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void GenerateEntity() {
for (String tableName : tables) {
if (bCancel) break;
String sPackage = packagename + ".entity.master";
String sql = "select * from " + tableName;
String sClassName = convertTableName(tableName) + "Entity";
String sHashCode = "";
StringBuffer sEquals = new StringBuffer();
StringBuffer sEqualsObject = new StringBuffer();
StringBuffer fileHeader = new StringBuffer();
StringBuffer fileContent = new StringBuffer();
try {
fileHeader.append(sPackage + ";\r\n");
fileHeader.append("\r\n");
fileHeader.append("import javax.persistence.*;\r\n");
fileHeader.append("import java.util.Objects;\r\n");
fileHeader.append("import java.util.Date;\r\n");
fileHeader.append("import java.sql.Blob;\r\n");
fileHeader.append("\r\n");
//注释部分
fileHeader.append(" /**\r\n");
fileHeader.append(" * " + tableName.toUpperCase() + " Entity\r\n");
fileHeader.append(" * " + new Date() + " " + author + "\r\n");
fileHeader.append(" */ \r\n");
fileHeader.append("@Entity\r\n");
fileHeader.append("@Table(name = \"" + tableName + "\", schema = \"" + dbName + "\")\r\n");
fileHeader.append("public class " + sClassName + " {\r\n");
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ResultSetMetaData meta = rs.getMetaData();
int columeCount = meta.getColumnCount();
// System.out.println("表 "+ tableName + "共有 "+columeCount+" 个字段。字段信息如下:");
for (int i = 1; i < columeCount + 1; i++) {
String sNullable = "false";
String sLength = "";
String sRawFieldName = meta.getColumnName(i);
String sFieldName = convertFieldName(sRawFieldName, false);
String sFieldTypeName = sqlType2JavaType(meta.getColumnTypeName(i));
String sGSFieldName = convertFieldName(sRawFieldName, true);
fileHeader.append("\tprivate " + sFieldTypeName + " " + sFieldName + ";\r\n");
// System.out.println(sRawFieldName);
// System.out.println(meta.getColumnType(i));
if (meta.isAutoIncrement(i)) {
fileContent.append("\t@Id\r\n");
fileContent.append("\t@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n");
} else {
fileContent.append("\t@Basic\r\n");
}
if (meta.isNullable(i) == 1) sNullable = "true";
if (meta.getColumnType(i) == -1) sLength = " , length = -1 ";
if (meta.getColumnType(i) == 12) sLength = " , length = " + meta.getPrecision(i);
fileContent.append("\t@Column(name = \"" + sRawFieldName + "\", nullable = " + sNullable + sLength + " )\r\n");
fileContent.append("\tpublic " + sFieldTypeName + " get" + sGSFieldName + "(){\r\n");
fileContent.append("\t\treturn " + sFieldName + ";\r\n");
fileContent.append("\t}\r\n");
fileContent.append("\tpublic void set" + sGSFieldName + "(" + sFieldTypeName + " " + sFieldName + "){\r\n");
fileContent.append("\t\tthis." + sFieldName + "=" + sFieldName + ";\r\n");
fileContent.append("\t}\r\n");
fileContent.append("\r\n");
if (sqlType2equals(meta.getColumnTypeName(i))) {
sEqualsObject.append("\t\t\t\tObjects.equals(" + sFieldName + ", that." + sFieldName + ") &&\r\n");
} else {
sEquals.append("\t\t\t\t" + sFieldName + " == that." + sFieldName + " &&\r\n");
}
sHashCode += "," + sFieldName;
}
fileHeader.append("\r\n");
fileHeader.append(fileContent);
fileHeader.append("\r\n");
fileHeader.append("\t@Override\r\n");
fileHeader.append("\tpublic boolean equals(Object o) {\r\n");
fileHeader.append("\tif (this == o) return true;\r\n");
fileHeader.append("\t\tif (o == null || getClass() != o.getClass()) return false;\r\n");
fileHeader.append("\t\t" + sClassName + " that = (" + sClassName + ") o;\r\n");
fileHeader.append("\t\treturn \r\n");
if (sEqualsObject.length() == 0) {
sEquals.delete(sEquals.length() - 5, sEquals.length());
fileHeader.append(sEquals + ";\r\n");
}
if (sEqualsObject.length() > 0) {
fileHeader.append(sEquals);
sEqualsObject.delete(sEqualsObject.length() - 5, sEqualsObject.length());
fileHeader.append(sEqualsObject + ";\r\n");
}
fileHeader.append("\t}\r\n");
fileHeader.append("\t@Override\r\n");
fileHeader.append("\tpublic int hashCode() {\r\n");
fileHeader.append("\t\treturn Objects.hash(" + sHashCode.substring(1) + ");\r\n");
fileHeader.append("\t}\r\n");
fileHeader.append("}\r\n");
// System.out.println(fileHeader);
BuildFile(sPackage, sClassName, fileHeader);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void GenerateDto() {
for (String tableName : tables) {
if (bCancel) break;
String sPackage = packagename + ".dto.master";
String sClassName = convertTableName(tableName) + "Dto";
String sql = "select * from " + tableName;
StringBuffer fileHeader = new StringBuffer();
StringBuffer fileContent = new StringBuffer();
try {
fileHeader.append(sPackage + ";\r\n");
fileHeader.append("\r\n");
fileHeader.append("import java.io.Serializable;\r\n");
fileHeader.append("import java.util.Date;\r\n");
fileHeader.append("import java.sql.Blob;\r\n");
fileHeader.append("\r\n");
//注释部分
fileHeader.append(" /**\r\n");
fileHeader.append(" * " + tableName.toUpperCase() + " DTO\r\n");
fileHeader.append(" * " + new Date() + " " + author + "\r\n");
fileHeader.append(" */ \r\n");
fileHeader.append("public class " + sClassName + " implements Serializable {\r\n");
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
ResultSetMetaData meta = rs.getMetaData();
int columeCount = meta.getColumnCount();
// System.out.println("表 "+ tableName + "共有 "+columeCount+" 个字段。字段信息如下:");
for (int i = 1; i < columeCount + 1; i++) {
String sRawFieldName = meta.getColumnName(i);
String sFieldName = convertFieldName(sRawFieldName, false);
String sFieldTypeName = sqlType2JavaType(meta.getColumnTypeName(i));
String sGSFieldName = convertFieldName(sRawFieldName, true);
fileHeader.append("\tprivate " + sFieldTypeName + " " + sFieldName + ";\r\n");
fileContent.append("\tpublic " + sFieldTypeName + " get" + sGSFieldName + "(){\r\n");
fileContent.append("\t\treturn " + sFieldName + ";\r\n");
fileContent.append("\t}\r\n");
fileContent.append("\tpublic void set" + sGSFieldName + "(" + sFieldTypeName + " " + sFieldName + "){\r\n");
fileContent.append("\t\tthis." + sFieldName + "=" + sFieldName + ";\r\n");
fileContent.append("\t}\r\n");
}
fileHeader.append("\r\n");
fileHeader.append(fileContent);
fileHeader.append("}\r\n");
// System.out.println(fileHeader);
BuildFile(sPackage, sClassName, fileHeader);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void GenerateDao() {
for (String tableName : tables) {
if (bCancel) break;
String sPackage = packagename + ".repository.master";
String sClassName = convertTableName(tableName) + "Dao";
String sEntityName = convertTableName(tableName) + "Entity";
StringBuffer fileHeader = new StringBuffer();
try {
fileHeader.append(sPackage + ";\r\n");
fileHeader.append("\r\n");
fileHeader.append("import org.springframework.data.domain.Page;\r\n");
fileHeader.append("import org.springframework.data.domain.Pageable;\r\n");
fileHeader.append("import org.springframework.data.jpa.repository.JpaRepository;\r\n");
fileHeader.append("import org.springframework.data.jpa.repository.Modifying;\r\n");
fileHeader.append("import org.springframework.data.jpa.repository.Query;\r\n");
fileHeader.append("import org.springframework.stereotype.Repository;\r\n");
fileHeader.append("import " + packagename.substring(8) + ".entity.master." + sEntityName + ";\r\n");
fileHeader.append("\r\n");
fileHeader.append("import java.util.List;");
fileHeader.append("\r\n");
//注释部分
fileHeader.append(" /**\r\n");
fileHeader.append(" * " + tableName.toUpperCase() + " DAO\r\n");
fileHeader.append(" * " + new Date() + " " + author + "\r\n");
fileHeader.append(" */ \r\n");
fileHeader.append("@Repository\r\n");
fileHeader.append("public interface " + sClassName + " extends JpaRepository<" + sEntityName + ",Integer> {\r\n");
fileHeader.append("\r\n");
fileHeader.append("}\r\n");
// System.out.println(fileHeader);
BuildFile(sPackage, sClassName, fileHeader);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void BuildFile(String sPackageName, String sFileName, StringBuffer fileContent) {
try {
String sLongFileName = sRootPath + "src\\main\\java\\" + sPackageName.replace(".", "\\").substring(8) + "\\" + sFileName + ".java";
File file = new File(sLongFileName);
if (!bWhole && file.exists()) {
System.out.print("file " + sFileName + ".java already exist,Enter (a all overwrite, y overwrite , n skip or q quit):");
Scanner sc = new Scanner(System.in);
String x = sc.nextLine();
if (x.trim().compareTo("q") == 0) {
bCancel = true;
return;
}
if (x.trim().compareTo("a") == 0) {
bWhole = true;
} else if (x.trim().compareTo("y") != 0) return;
}
System.out.println(sLongFileName);
FileWriter fw = new FileWriter(sLongFileName);
PrintWriter pw = new PrintWriter(fw);
pw.println(fileContent);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 功能:转换表名称为类名称,去掉前缀
*
* @param str
* @return
*/
private String convertTableName(String str) {
String sTableName = "";
String[] arr = str.split("_");
for (int i = 1; i < arr.length; i++) {
sTableName += FirstCase(arr[i]);
}
return sTableName;
}
/**
* 转换字段将字段以“_”进行切分跳过第一个元素
* bFirstCase 要求第一个单词首字母大写 通常是用于 get set 方法
* @param str
* @return
*/
private String convertFieldName(String str, boolean bFirstCase) {
String[] arr = str.split("_");
String sFieldName = arr[0];
if (bFirstCase) {
if (sFieldName.compareToIgnoreCase("f") != 0) //外键 f 为首单词时不大写
sFieldName = FirstCase(sFieldName);
}
for (int i = 1; i < arr.length; i++) {
sFieldName += FirstCase(arr[i]);
}
return sFieldName;
}
/**
* 首字母大写转换
*
* @param str
* @return
*/
private String FirstCase(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}
/**
* 功能:获得列的数据类型
*
* @param sqlType
* @return
*/
private String sqlType2JavaType(String sqlType) {
if (sqlType.equalsIgnoreCase("bit")) {
return "boolean";
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return "byte";
} else if (sqlType.equalsIgnoreCase("smallint")) {
return "short";
} else if (sqlType.equalsIgnoreCase("int")|| sqlType.equalsIgnoreCase("INT UNSIGNED")) {
return "int";
} else if (sqlType.equalsIgnoreCase("bigint")) {
return "long";
} else if (sqlType.equalsIgnoreCase("float")) {
return "float";
} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
|| sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")|| sqlType.equalsIgnoreCase("DECIMAL UNSIGNED")) {
return "double";
} else if (sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")
|| sqlType.equalsIgnoreCase("text")|| sqlType.equalsIgnoreCase("longtext")
|| sqlType.equalsIgnoreCase("MEDIUMTEXT")) {
return "String";
} else if (sqlType.equalsIgnoreCase("datetime")) {
return "Date";
} else if (sqlType.equalsIgnoreCase("image") || sqlType.equalsIgnoreCase("GEOMETRY")) {
return "Blod";
}
System.out.println(sqlType);
return null;
}
private boolean sqlType2equals(String sqlType) {
if (sqlType.equalsIgnoreCase("bit")) {
return false;
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return false;
} else if (sqlType.equalsIgnoreCase("smallint")) {
return false;
} else if (sqlType.equalsIgnoreCase("int") || sqlType.equalsIgnoreCase("INT UNSIGNED")) {
return false;
} else if (sqlType.equalsIgnoreCase("bigint")) {
return false;
} else if (sqlType.equalsIgnoreCase("float")) {
return false;
} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
|| sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")|| sqlType.equalsIgnoreCase("DECIMAL UNSIGNED")) {
return false;
}
return true;
}
public static void main(String[] args) throws Exception {
try {
DBTools TmpTool = new DBTools();
TmpTool.InitConnection();
TmpTool.addTableName();
TmpTool.GenerateEntity();
TmpTool.GenerateDto();
TmpTool.GenerateDao();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}