基于 Oracle 数据库生成 JPA 实体类代码。基于Oracle怎样生成 JPA 实体类代码

这只是个简单的生成代码,并不是完美的。可以将代码拿去自定义的修改和完善。

废话不多说,直接上代码。

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);
    }
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值