这只是个简单的生成代码,并不是完美的。可以将代码拿去自定义的修改和完善。
废话不多说,直接上代码。
package com.xxx.generate.jpaentity;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JavaEntityGenerate {
private final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
// SID 方式
private final static String JDBC_URL = "jdbc:oracle:thin:@[ip或者主机名]:[端口]:[SID]";
// 服务名 方式
//private final static String JDBC_URL = "jdbc:oracle:thin:@[ip或者主机名]:[端口]/[service]";
private final static String DB_USER_NAME = "user_name";
private final static String DB_PASSWORD = "password";
private final static String SCHEMA = "ACS"; // 按需要填写,没有的话留空
private final static String DB_TABLE_NAME = "TABLE_NAME";
public static void main(String[] args) {
//记得加上Oracle驱动。记得加上Oracle驱动。
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(JDBC_URL,DB_USER_NAME,DB_PASSWORD);
// 关键点就是这个查询语句。
String sql = "select identity_column,column_name,data_type,data_length,char_length,data_precision,data_scale,nullable from user_tab_columns where table_name = ?";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, DB_TABLE_NAME);
resultSet = preparedStatement.executeQuery();
String importPackage = "";
StringBuilder sb = new StringBuilder("package xx.xx.xx;\n\n");
sb.append("import java.io.Serializable;\n\n");
sb.append("import javax.persistence.Column;\n");
sb.append("import javax.persistence.Entity;\n");
sb.append("import javax.persistence.GeneratedValue;\n");
sb.append("import javax.persistence.GenerationType;\n");
sb.append("import javax.persistence.Id;\n");
sb.append("import javax.persistence.SequenceGenerator;\n");
sb.append("import javax.persistence.Table;\n");
sb.append("import lombok.Data;\n\n");
//@GeneratedValue(strategy = GenerationType.IDENTITY)
sb.append("/**\n");
sb.append(" *\n");
sb.append(" * @Author: 这个类的作者名字\n");
sb.append(" * @CreateDate : "+ new SimpleDateFormat("yyyy-MM-dd HH:mm").format( new Date()) +"\n");
sb.append(" * @Description: "+DB_TABLE_NAME.toLowerCase()+" table mapping entity classes\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append("@Data\n");
sb.append("@Table(name=\""+ DB_TABLE_NAME +"\"");
if(SCHEMA != null && !"".equals(SCHEMA)) {
sb.append(",schema = \""+ SCHEMA +"\"");
}
sb.append(")\n");
sb.append("@Entity\n");
sb.append("public class " + underlinedTohumpNaming(DB_TABLE_NAME) + "Entity implements Serializable{\n\n");
sb.append("\tprivate static final long serialVersionUID = 1L;\n\n");
while(resultSet.next()) {
String identityColumn = resultSet.getString("IDENTITY_COLUMN");
String columnName = resultSet.getString("COLUMN_NAME");
String type = resultSet.getString("DATA_TYPE");
int length = resultSet.getInt("DATA_LENGTH");
int charLength = resultSet.getInt("CHAR_LENGTH");
int precision = resultSet.getInt("DATA_PRECISION");
int scale = resultSet.getInt("DATA_SCALE");
String nullable = resultSet.getString("NULLABLE");
String javaType = null;
if("YES".equals(identityColumn)) {
/**
* 在有一些oracle的版本中不支持 IDENTITY 的方式,这里只是借助这个等于YES的列来确定主键。
* 如果一个表中有多个列使用了IDENTITY也是有问题的,所以这里的代码需要根据实际情况去更改,或者不要这里的代码。
*/
sb.append("\t@Id\n");
sb.append("\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n");
}
sb.append("\t@Column(name=\"" + columnName +"\",");
// 这只是个简单的生成代码,并不是完美的。可以将代码拿去自定义的修改和完善。只定义了以下的java属性
if("NUMBER".equals(type) && scale > 0) {
if(!importPackage.contains("import java.math.BigDecimal;\n")) {
importPackage += "import java.math.BigDecimal;\n";
}
sb.append("precision = " + precision + ",");
sb.append("scale = " + scale + ",");
javaType = "BigDecimal";
}else if("NUMBER".equals(type)) {
javaType = "Long";
}else if("TIMESTAMP(6)".equals(type) || "TIMESTAMP(3)".equals(type)) {
if(!importPackage.contains("import java.sql.Timestamp;\n")) {
importPackage += "import java.sql.Timestamp;\n";
}
javaType = "Date";
javaType = "Timestamp";
}else if(type.contains("VARCHAR") || "CHAR".equals(type)) {
//sb.append("length = " + length + ",");
sb.append("length = " + charLength + ",");
javaType = "String";
}
if("Y".equals(nullable)) {
sb.append("nullable = true)\n");
}else {
sb.append("nullable = false)\n");
}
String javaField = underlinedTohumpNaming(columnName);
sb.append("\tprivate "+ javaType + " " + javaField.substring(0,1).toLowerCase()+javaField.substring(1) +";\n\n");
}
if(!"".equals(importPackage)) {
sb.insert(48, "\n"+importPackage);
}
sb.append("}\n\n\n\n");
sb.append("--------------------下面是Repository-----------------------------\n\n\n\n");
sb.append("package xx.xx.xx\n");
sb.append("import org.springframework.data.jpa.repository.JpaRepository;\n");
sb.append("//import xx.xx.xx; 引入实体类\n\n");
sb.append("/**\n");
sb.append(" *\n");
sb.append(" * @Author: 这个类的作者名字\n");
sb.append(" * @CreateDate : "+ new SimpleDateFormat("yyyy-MM-dd HH:mm").format( new Date()) + "\n");
sb.append(" * @Description: "+DB_TABLE_NAME.toLowerCase()+" table mapping jpa repository interface.\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append("public interface " + underlinedTohumpNaming(DB_TABLE_NAME) + "Repository extends JpaRepository<");
sb.append(underlinedTohumpNaming(DB_TABLE_NAME) + "Entity,主键类型>{}");
System.out.println(sb.toString());// 这里只是输出到控制台,不会输出到文件,为的是让你们好好检查。
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(resultSet != null) {resultSet.close();}
if(preparedStatement != null) {preparedStatement.close();}
if(conn != null) {conn.close();}
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
public static String underlinedTohumpNaming(String str) {
String javaField = str.toLowerCase();
String[] arr = javaField.split("_");
javaField = arr[0];
for(int j = 1; j < arr.length; j++) {
javaField += arr[j].substring(0,1).toUpperCase() + arr[j].substring(1);
}
return javaField.substring(0, 1).toUpperCase() + javaField.substring(1);
}
}