自动生成实体类(POJO)

###1.工具类

<!-- lang: java -->

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DataBaseForPOJO {

        private String DRIVER ;
    	private String URL ;
    	private String USERNAME ;
    	private String PASSWORD ;
    	
    	private Connection CONN;
    	private Statement STMT;
    	private ResultSet RESULTSET;
    	
    	private String pojoFilePath;
    	private String packageName;
    	
    	public DataBaseForPOJO(){}
    	
    	public DataBaseForPOJO(String DRIVER,String URL,String USERNAME,String PASSWORD){
    		this.DRIVER = DRIVER;
    		this.URL = URL;
    		this.USERNAME = USERNAME;
    		this.PASSWORD = PASSWORD;
    	}
    	
    	private void createConnection(){
    		try {
    			Class.forName(DRIVER);
    			CONN = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    			if(CONN == null){
    				throw new RuntimeException("获取数据库连接错误");
    			}else{
    				STMT = CONN.createStatement();
    			}
    			
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void createPOJO(){
    		try {
    			//获取数据库连接
    			createConnection();
    			DatabaseMetaData database = CONN.getMetaData();
    			
    			List<Object> tables = new ArrayList<Object>();
    			String[] types = {"TABLE"};
    			
    			//获取所有的表名
    			RESULTSET = database.getTables(null, null, null, types);
    			
    			while(RESULTSET.next()){
    				tables.add(RESULTSET.getObject("TABLE_NAME"));
    			}
    			
    			List<Map<String, Object>> tableList = new ArrayList<Map<String, Object>>();
    			
    			for(Object tableName : tables){
    				
    				Map<String, Object> table = new HashMap<String, Object>();
    				
    				List<Map<String, Object>> columnList = new ArrayList<Map<String, Object>>();
    				
    				String sql = "select * from `" + tableName.toString()+"` limit 0,0;" ;
    				System.out.println(sql);
    				PreparedStatement preStmt = CONN.prepareStatement(sql);
    				
    				ResultSet resultSet = preStmt.executeQuery();
    				ResultSetMetaData rsmd = resultSet.getMetaData();
    				
    				int tableLength = rsmd.getColumnCount();
    				
    				System.out.println(tableLength);
    				
    				for (int i = 1; i <= tableLength; i++) {
    					
    					Map<String, Object> column = new HashMap<String, Object>();
    					
    					String columnType = rsmd.getColumnTypeName(i);
    	                String columnTypeClass = rsmd.getColumnClassName(i);  
    	                String columnName = rsmd.getColumnName(i);  
    	                int columnLength = rsmd.getColumnDisplaySize(i);
    	                
    	                column.put("columnType", columnType);
    	                if(checkIsCharArray(columnType, columnTypeClass)){
    	                	column.put("columnTypeClass", "java.lang.Character[]");
    	                }else{
    	                	column.put("columnTypeClass", columnTypeClass);
    	                }
    	                column.put("columnName", columnName);
    	                column.put("columnLength", columnLength);
    	                
    	                columnList.add(column);
    				}
    				
    				table.put("tableName", tableName);
    				table.put("columns", columnList);
    				
    				tableList.add(table);
    			}
    			
    			analysisTableList(tableList);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally{
    			closeDBConnection(CONN,STMT,RESULTSET);
    		}
    		
    	}
    	
    	/**
    	 * 解析TableList
    	 * @param tableList
    	 * @throws Exception 
    	 */
    	private void analysisTableList(List<Map<String, Object>> tableList) throws Exception{
    		
    		for (Map<String, Object> map : tableList) {
    			
    			String tableName = (String) map.get("tableName");
    			
    			@SuppressWarnings("unchecked")
    			List<Map<String, Object>> columnList = (List<Map<String, Object>>) map.get("columns");
    			
    			createSingleTableString(tableName,columnList);
    			
    		}
    		
    	}
    	
    	/**
    	 * 根据单个表,生成单个文件的字符序列
    	 * @param tableName
    	 * @param columnList
    	 * @throws Exception
    	 */
    	private void createSingleTableString(String tableName,List<Map<String, Object>> columnList) throws Exception{
    		
    		//文件名
    		String fileName = getFileName(tableName);
    		//文件内容
    		StringBuilder tableFileString = new StringBuilder();
    		//设置包名
    		tableFileString.append("package "+getPackageName()+" ; \n\r");
    		//导入包
    		tableFileString.append(createImportPackageString(columnList));
    		
    		tableFileString.append("\n\r");
    		// public class
    		tableFileString.append(getClassString(tableName)+" { \n\r\n\r");
    		
    		List<Map<String, String>> columnNameAndTypeList = buildcolumnNameAndType(columnList);
    		
    		for(Map<String, String> map : columnNameAndTypeList){
    			String propertyString = getPropertyString(map.get("columnName"),map.get("columnType"));
    			tableFileString.append("	");
    			tableFileString.append(propertyString);
    			tableFileString.append(" ;\n");
    		}
    		tableFileString.append("\n\r");
    		for(Map<String, String> map : columnNameAndTypeList){
    			String getSetString = buildGetAndSetMethod(map.get("columnName"),map.get("columnType"));
    			tableFileString.append(getSetString);
    		}
    		
    		tableFileString.append("}");
    		String filePath = getPojoFilePath();
    		if(null == filePath || "".equals(filePath)){
    			filePath = "d:/pojos";
    		}
    		createFile(filePath,fileName,tableFileString.toString());
    		
    	}
    	
    	
    	private String createImportPackageString(List<Map<String, Object>> columnList){
    		StringBuilder builder = new StringBuilder();
    		
    		//导入所需要的包
    		List<String> importStringList = new ArrayList<String>();
    		
    		for (Map<String, Object> map : columnList) {
    			String columnTypeClass = map.get("columnTypeClass").toString();
    			if(!columnTypeClass.startsWith("java.lang")){
    				String importString = "import "+columnTypeClass+" ; \n\r";
    				if(!importStringList.contains(importString)){
    					importStringList.add(importString);
    				}
    			}
    		}
    		
    		for(String str : importStringList){
    			builder.append(str);
    		}
    		
    		return builder.toString();
    	}
    	
    	/**
    	 * 生成get  set  方法
    	 * @param columnName
    	 * @param columnType
    	 * @return
    	 */
    	private String buildGetAndSetMethod(String columnName, String columnType) {
    		
    		StringBuilder builder = new StringBuilder();
    		String columnNameUpper = columnName.substring(0, 1).toUpperCase()+columnName.substring(1);
    		
    		builder.append("	public "+columnType+" get"+columnNameUpper+"() {\n");
    		builder.append("		return this."+columnName+";\n");
    		builder.append("	}\n\r");
    		
    		builder.append("	public void set"+columnNameUpper+"("+columnType+" "+columnName+") { \n");
    		builder.append("		this."+columnName+" = "+columnName+";\n");
    		builder.append("	}\n\r");
    		
    		return builder.toString();
    	}
    
    	/**
    	 * 生成column名字和类型的对应
    	 * @param columnList
    	 * @return
    	 */
    	private List<Map<String, String>> buildcolumnNameAndType(List<Map<String, Object>> columnList) {
    		
    		List<Map<String, String>> columnNameAndTypeList = new ArrayList<Map<String, String>>();
    		
    		for (Map<String, Object> column : columnList) {
    			
    			String propertyName = column.get("columnName").toString();
    			String propertyType = column.get("columnTypeClass").toString();
    			
    			if(propertyName.startsWith("c_")){
    				propertyName.substring(2);
    			}
    			
    			String[] nameArray = propertyName.split("_");
    			
    			StringBuilder propertyNameResult = new StringBuilder();
    			
    			for (int i = 0; i < nameArray.length; i++) {
    				String str = nameArray[i];
    				if(i == 0){
    					propertyNameResult.append(str.toLowerCase());
    				}else{
    					propertyNameResult.append(str.substring(0, 1).toUpperCase()+str.substring(1).toLowerCase());
    				}
    			}
    			
    			Map<String, String> map = new HashMap<String, String>();
    			
    			map.put("columnName", propertyNameResult.toString());
    			
    			String columnType = column.get("columnTypeClass").toString();
    			int startNum = columnType.lastIndexOf(".");
    			map.put("columnType", propertyType.substring(startNum+1));
    			
    			columnNameAndTypeList.add(map);
    		}
    		
    		return columnNameAndTypeList;
    	}
    
    	/**
    	 * 生成文件名
    	 * @param tableName
    	 * @return
    	 */
    	private String getFileName(String tableName){
    		if(tableName.startsWith("t_")){
    			tableName = tableName.substring(2);
    		}
    		
    		String[] nameArray = tableName.split("_");
    		
    		StringBuilder result = new StringBuilder();
    		
    		for(String str : nameArray){
    			result.append(str.substring(0, 1).toUpperCase()+str.substring(1));
    		}
    		result.append(".java");
    		return result.toString();
    	}
    	
    	/**
    	 * 生成类字符串
    	 * 表的名字有三种形式  例如:
    	 * 1.t_user
    	 * 2.user
    	 * 3.t_user_info
    	 * @param tableName
    	 * @return
    	 */
    	private String getClassString(String tableName){
    		
    		if(tableName.startsWith("t_")){
    			tableName = tableName.substring(2);
    		}
    		
    		String[] nameArray = tableName.split("_");
    		
    		StringBuilder result = new StringBuilder();
    		result.append("public class ");
    		
    		for(String str : nameArray){
    			result.append(str.substring(0, 1).toUpperCase()+str.substring(1));
    		}
    		
    		return result.toString();
    	}
    	
    	/**
    	 * 生成属性字符串
    	 * 属性的名字有三种形式  例如:
    	 * 1.c_username
    	 * 2.username
    	 * 3.c_user_name
    	 * @param tableName
    	 * @return
    	 */
    	private String getPropertyString(String propertyName,String propertyType){
    		
    		StringBuilder result = new StringBuilder();
    		result.append("private "+propertyType+" ");
    		result.append(propertyName);
    		
    		return result.toString();
    	}
    	
    	/**
    	 * 生成文件
    	 * @param filePath
    	 * @param fileName
    	 * @throws Exception
    	 */
    	private void createFile(String filePath,String fileName,String fileContent) throws Exception{
    		
    		File file = new File(filePath, fileName);
    		
    		if(!file.exists()){
    			file.createNewFile();
    		}
    		
    		OutputStream out = new FileOutputStream(file);
    		
    		byte[] b = fileContent.getBytes();
    		
    		out.write(b);
    		out.flush();
    		out.close();
    		
    		
    	}
    	
    	
    	/**
    	 * 判断数据类型
    	 * @param sqlType
    	 * @param classType
    	 * @return
    	 */
    	public Boolean checkIsCharArray(String sqlType,String classType){
    		
    		List<String> sqlExcludeTypeList = new ArrayList<>();
    		sqlExcludeTypeList.add("BIT");
    		sqlExcludeTypeList.add("BLOB");
    		sqlExcludeTypeList.add("LONGBLOB");
    		sqlExcludeTypeList.add("MEDIUMBLOB");
    		sqlExcludeTypeList.add("TINYBLOB");
    		sqlExcludeTypeList.add("BINARY");
    		sqlExcludeTypeList.add("VARBINARY");
    		
    		if(sqlExcludeTypeList.contains(sqlType) && classType.equals("[B")){
    			return true;
    		}else{
    			return false;
    		}
    		
    	}
    	
    	/**
    	 * 关闭数据库连接
    	 * @param conn
    	 * @param stmt
    	 * @param resultSet
    	 */
    	private void closeDBConnection(Connection conn,Statement stmt,ResultSet resultSet){
    		
    		if(resultSet != null){
    			try {
    				resultSet.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			} finally{
    				if(stmt != null){
    					try {
    						stmt.close();
    					} catch (SQLException e) {
    						e.printStackTrace();
    					} finally{
    						if(conn != null){
    							try {
    								conn.close();
    							} catch (SQLException e) {
    								e.printStackTrace();
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	
    	
    	//get  set  初始化数据
    	public String getDRIVER() {
    		return DRIVER;
    	}
    
    	public void setDRIVER(String DRIVER) {
    		this.DRIVER = DRIVER;
    	}
    
    	public String getURL() {
    		return URL;
    	}
    
    	public void setURL(String URL) {
    		this.URL = URL;
    	}
    
    	public String getUSERNAME() {
    		return USERNAME;
    	}
    
    	public void setUSERNAME(String USERNAME) {
    		this.USERNAME = USERNAME;
    	}
    
    	public String getPASSWORD() {
    		return PASSWORD;
    	}
    
    	public void setPASSWORD(String PASSWORD) {
    		this.PASSWORD = PASSWORD;
    	}
    
    	public String getPojoFilePath() {
    		return pojoFilePath;
    	}
    
    	public void setPojoFilePath(String pojoFilePath) {
    		this.pojoFilePath = pojoFilePath;
    	}
    
    	public String getPackageName() {
    		return packageName;
    	}
    
    	public void setPackageName(String packageName) {
    		this.packageName = packageName;
    	}

}

###2.测试

<!-- lang: java -->
public class Test3 {

public static void main(String[] args) {
	
	//第一种方法
	DataBaseUtil util1 = new DataBaseUtil();
	
	util1.setDRIVER("com.mysql.jdbc.Driver");
	util1.setURL("jdbc:mysql://10.122.74.231:3306/internet_ipcc");
	util1.setUSERNAME("root");
	util1.setPASSWORD("infobird123");
	
	util1.setPojoFilePath("d:/pojos");
	util1.setPackageName("com.doudoufamily.vo");
	
	util1.createPOJO();
	
	//第二种方法
	DataBaseUtil util2 = new         DataBaseUtil("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/testjava","root","root");
	
	util2.setPojoFilePath("d:/pojos");
	util2.setPackageName("com.doudoufamily.vo");
	
	util2.createPOJO();
}
}

转载于:https://my.oschina.net/duandoudou/blog/184875

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJOGenerator(POJO代码生成器 v1.3.3) 本POJO代码生成器采用Java的Swing技术编码实现,是绿色免费工具,可以自由传播。 由于本工具的内部实现较烂,所以还请反编译高手手下留情,让我留几分颜面。^_^ 由于本人只用过Oracle、DB2、MySQL、MS SQL Server这四款数据库产品,所以制作 成exe可执行文件时只添入了这四款数据库的驱动支持。如果您需要使用这款工具从 其它数据库中生成POJO,那么您可以联系我(Email:CodingMouse@gmail.com), 我会添加其它数据库的驱动支持后通过电子邮件发送给您。 简单的使用说明: 1、先将压缩档解压到任意文件夹,必须保留配置文件cmsdk4j.cfg.xml和generator .cfg.xml与可执行文件POJOGenerator.exe在同一目录,否则无法运行。 2、可以预先在配置档cmsdk4j.cfg.xml中设定您的数据库服务器配置,配置档中已经 提供了默认的配置信息,您仅需在此基础上修改部分参数(如:IP地址、端口号、 用户名、密码、数据库名等),这些参数将作为生成器的预设数据库连接配置参数。 3、可以预先在配置档generator.cfg.xml中设定您的数据类型映射方案,配置档中已经 提供了MS SQL Server/MySQL/DB2和Oracle两种映射方案,当然,可能有不太完整的地方 ,您可以根据实际情况稍作修改即可。需要注意的一点是ref属性表示引用同一映射方案 的另一映射,这样您便可以简化同一映射数据类型的配置;而import属性是指定需要在 最终生成的源代码中作为类最开始的package类型导入声明部分的导入类型名称,因此, 这个名称是完整带包名的类名称,否则不能正确生成最终代码。配置档中提供的默认配 置如果不能满足你的需要,也可以自行根据实际情况进行修改。最后,需要大家注意的 一点就是由于最终生成的代码要调用包装类型的equals和hashCode方法,因此,配置的 数据类型必须是包装类型,如果用基本类型生成POJO代码是无法通过编译的。 4、所有配置档仅在工具启动初始读取一次并缓存到内存中,因此,如果您是在工具运行 时修改的配置档,请重新启动本工具以使新的配置生效。并且,所有配置档的XML结构均 不能修改,只能修改其节点间的文本值或属性值,以及添加新的标签组,否则会导致本 工具无法工作。选择“界面皮肤方案”后,默认会在当前目录生成名为skin.dat的文件, 这是一个Properties属性文件,用于保存您最后选择的皮肤名称,以便下次打开此工具 时加载您所选择的皮肤来渲染工具UI界面。 5、所有最终代码生成效果都可以在左边的代码预览区域中查看,可点击滑动箭头显示出 被隐藏的POJO代码卡片。点击“写入磁盘文件”按钮即可将POJO代码的Java源码文件写入 到指定文件夹中。POJO代码的equals方法重写完全符合《Core Java》所述规范,同时, 其中的hashCode方法重写则参考了Netbeans中JavaBean转换器的写法。为保障原有代码安 全,通常更好的做法是将最终代码生成后拷贝到您的项目对应文件夹中。最好不要直接指 向您的项目文件夹,因为本工具会直接覆盖掉指定目录中同名的文件。最终生成的代码文 件以.java为扩展名。 6、从1.3版开始生成POJO代码目录中可自动添加一个名为pojo.ntf.xml的POJO映射通 知档,其中,ID列名默认使用主键名称(若为复合主键则采用次序排首位的主键列名) ,而Oracle环境下的sequence对象名称则为“seq_表名_id”格式的默认名称,请根据 实际情况修改。该配置档用于CmSdk4j-Core框架的ORM映射,不需要则请不要勾选此项或 在生成后直接删除即可。 7、目前1.3.3版与1.3版差异不大,仅修改了POJO类名与成员变量名的大小写处理策略。 即目标数据库服务器为Oracle时,才将表名除首字母外全部小写处理成POJO类名,同理, 成员变量名也只在Oracle数据库情况下才全小写处理。其余数据库如:DB2、MySQL、 MS SQL Server则直接处理为除首字母大写外,其余全部保留原始大小写。其中,对于 表名的处理还直接去掉了空格符和下划线,并且若为Oracle数据库时,下划线亦作为首 字母大写的分隔标志,如:HRM_HUMAN_RESOURCE,最终生成POJO类名将直接去掉串中 的下划线,并以下划线作为首字母大写的起始,即:HrmHumanResource + POJO类名后缀。 同理,成员变量名的处理也是采用了相同的处理策略。最终处理效果详见生成写入到磁盘 的pojo.ntf.xml配置档。 8、此小工具一直均只写来自用,以便与自己的O/R Mapping简易版工具配套使用,目前 1.3.3这个版本已经能满足自己的需要,同时为了方便预览POJO代码生成的效果,特意添 加了语法着色功能,其着色色调搭配和关键字字典数据来源于EmEditor这款带语法着色的 纯文本编辑器,并且该色调搭配方案也被多款JS版本的语法着色器采用,色调可读性较高。 此小工具虽然GUI、功能这些都相对较弱,但自用已经足够。因此,后期可能就不再考虑 功能更新了,请见谅! 如果您有好的建议,请发送留言到作者博客:http://blog.csdn.net/CodingMouse 或发送邮件到:CodingMouse@gmail.com 本工具已经打包成exe可执行文件,便于在Window环境下运行,但仍需要你的机器上 安装至少1.6版本的jre环境(受打包工具的jre版本不兼容限制影响)。 By CodingMouse 2010年5月22日
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值