如何使用Java代码自动生成一个JavaBean文件

简单说一下 Java Bean,Java Bean 必须准守 Java Bean API 规范,它有比较特别的特征:
(1)提供一个默认无参的构造函数
(2)需要被序列化并且实现了 Serializable 接口
(3)可能有一系列可读写属性
(4)可能有一系列的 getter 或 setter 方法
(5)Javabean 属性格式 getPropertyName()、setPropertyName()
下面是一个通用的模板,大家可以参考下
package 包路径;
import java.io.Serializable;
public class 类名 implements java.io.Serializable {
private 数据类型 字段名;
public 类名 () {
}
public void set首字符大写的字段名(数据类型 字段名) {
this.字段名 = 字段名;
}
public 数据类型 get首字符大写的字段名() {
return 字段名;
}
}

我们思路是根据上面的模板的,我们通过文件流读出来,使用字符串的关键字替换的方法 String.replace() 方法替换模板的关键字,然后再通过指定文件名写到对应的文件路径下,这样自动生成 Java Bean 就出来的,简单的来说,就是通过 IO 读对应的 Java Bean 的文件和字符串替换方法。
那如何实现呢,首先我们提供一个重要的sql查询语句

SELECT TABLE_SCHEMA AS tableSchema, TABLE_NAME AS tableName,
COLUMN_NAME AS columnName, ORDINAL_POSITION AS ordinalPosition, IS_NULLABLE AS notNullFlag, DATA_TYPE AS dataType, CHARACTER_MAXIMUM_LENGTH AS columnLength, COLUMN_KEY AS cloumnKey, COLUMN_COMMENT AS cloumnComent FROM information_schema.columns WHERE table_schema = ''对应的数据库名" AND table_name = ''对应数据表名"
该方法的查询结果是
在这里插入图片描述

好了,简单的准备工作做好了,接下来我们直接撸代码
在这里插入图片描述
这里的包结构图给大家截图看下

核心代码在这里给大家展示下
//该方法用于生成javaBean的类头

	public static StringBuilder classStructure2(StringBuilder propertyBuilder,StringBuilder methodBuilder,String className,String serializable) {
	 StringBuilder builder=new StringBuilder();
	 builder.append(Const.PACKAGE+Const.one_blank+Const.PACKAGENAME+Const.line_feed_r)
    .append(Const.IMPORT+Const.one_blank+Const.IMPORTNAME+Const.line_feed_r+Const.line_feed_r)
	 .append(Const.PUBLIC+Const.one_blank+Const.CLASS+Const.one_blank+className)
     .append(Const.one_blank+Const.IMPLEMENTS+Const.one_blank+serializable)
     .append(Const.left_big_bracket+Const.line_feed_r+Const.one_blank)
     .append(propertyBuilder).append(Const.line_feed_r).append(methodBuilder)
     .append(Const.right_big_bracket+Const.line_feed_r);
	 return builder;
}
//该段代码生成的效果图如下![在这里插入图片描述](https://img-blog.csdnimg.cn/d6211b021fad46fa92ed478e564afa1f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NOQ0RYWF84OA==,size_16,color_FFFFFF,t_70)

//生成javaBean的的属性与对应得set与get方法
   public static Map<String,StringBuilder>  classBody2(Map<String,StringBuilder> builder,String className,String type,
	 String  propertyName,String methodName) {
	StringBuilder propertyBuilder=builder.get("propertyBuilder");
	StringBuilder methodBuilder=builder.get("methodBuilder");
	//用于生成对应得属性
	propertyBuilder.append(Const.three_blank+Const.PRIVATE+Const.one_blank).append(type).
	 append(Const.one_blank+propertyName+Const.semicolon+Const.line_feed_r);
	 //用于生成每个属性对应得set/get方法		   methodBuilder.append(Const.three_blank+Const.PUBLIC+Const.one_blank+Const.VOID+Const.one_blank+Const.SET)
	 .append(methodName)
	 .append(Const.left_small_bracket).append(type).append(Const.one_blank+propertyName+Const.right_small_bracket)
	 .append(Const.left_big_bracket+Const.line_feed_r).append(Const.blank(7)+Const.THIS+Const.dot)
	 .append(propertyName+Const.Equal).append(propertyName)
	 .append(Const.semicolon+Const.line_feed_r).append(Const.blank(4)+Const.right_big_bracket+Const.line_feed_r)
	 .append(Const.line_feed_n)
	 .append(Const.three_blank+Const.PUBLIC+Const.one_blank+type+Const.one_blank+Const.GET).append(methodName)
	 .append(Const.left_small_bracket).append(Const.right_small_bracket)
	 .append(Const.left_big_bracket+Const.line_feed_r).append(Const.blank(7))
	 .append(Const.RETURN+Const.one_blank+propertyName)
	 .append(Const.semicolon+Const.line_feed_r).append(Const.blank(4)+Const.right_big_bracket+Const.line_feed_r)
	 .append(Const.line_feed_n);
	 return builder;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/81f7879499a64ab1bfc1dc641ae77db9.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NOQ0RYWF84OA==,size_16,color_FFFFFF,t_70)

	//生成javaBean的无参数构造器方法
public static StringBuilder generateConstructor(StringBuilder builder,String className) {
	return builder.append(Const.line_feed_r+Const.three_blank+Const.PUBLIC+Const.one_blank+className)
	.append(Const.left_small_bracket+Const.right_small_bracket+Const.one_blank)
	.append(Const.left_big_bracket+Const.line_feed_r)
	.append(Const.blank(7)+Const.SUPER+Const.left_small_bracket+Const.right_small_bracket+Const.semicolon+Const.line_feed_r)
	.append(Const.blank(4)+Const.right_big_bracket+Const.line_feed_r);
}

在这里插入图片描述
//生成JavaBean代码的主要操作代码

		public static void generateBean() throws SQLException, IOException {
		 ResultSet query=getResultSet();
		 
	     String tableName=null,className=null,dataType=null;
	     StringBuilder builder=null;
	     
	     Map<String,StringBuilder> builderMap=new HashMap<String, StringBuilder>(10);
	     StringBuilder propertyBuilder=new StringBuilder();
	     
	     StringBuilder methodBuilder=new StringBuilder();
	     //		     存储待生成的Javabean中的各个属性
	     
	     builderMap.put("propertyBuilder", propertyBuilder);
	     //		     存储待生成的Javabean中的各个方法
	     builderMap.put("methodBuilder", methodBuilder);
	          
	     while (query.next()) {    	 
	    	 dataType =query.getString("dataType");
	    	 String type  = sqlTypeToJavaType(dataType); 	
	    	 String propertyNme=null,methodName=null;
	    	 propertyNme= query.getString("columnName");
	    	 //		    	 构造setProvince/getProvince类型的方法名
	    	 methodName=propertyNme.substring(0,1).toUpperCase()+propertyNme.substring(1);
	    	 className = query.getString("tableName");
	    	 //		    	 构造User这样类型的类名
	    	 className=className.substring(0,1).toUpperCase()+className.substring(1);
	    	 switch (type) {
			case "Boolean":	
				builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Byte":			
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Short":		
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Integer":			
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Long":
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Float":
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Double":
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "String":	    	
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "Date":
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
	       case "byte[]":	
	    	   builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
			default:
				builderMap=classBody2(builderMap,className,type,propertyNme,methodName);
				break;
			}	 
	    	//		     获取待生成的Javabean中的各个属性
			 	 propertyBuilder=builderMap.get("propertyBuilder");
			 	 //		      获取待生成的Javabean中的各个方法
				 methodBuilder=builderMap.get("methodBuilder");		   
		   System.out.println(className); 
		   System.out.println(propertyNme);
		}
		  propertyBuilder=generateConstructor(propertyBuilder,className);
	     builder = classStructure2(propertyBuilder,methodBuilder,className,Const.interfaceName);
	     className=className.substring(0,1)+className.substring(1);
	     File file=new File(Const.path+className+".java");
	     if(!file.exists()) {
	    	 file.createNewFile();
	     }else {
	    	 file.delete();
	    	 file.createNewFile();
	     }
	     FileWriter fw = new FileWriter(file); 
	     BufferedWriter bw=new BufferedWriter(fw);
	     bw.write(builder.toString());
	     bw.flush();	    
	 }

//将数据库每一列的类型与JavaBean的属性类型进行适配与转换

 private static String sqlTypeToJavaType(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")) {
            return "Integer";
        } 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")) {
            return "Double";
        } else if (sqlType.equalsIgnoreCase("varchar")
                || sqlType.equalsIgnoreCase("char")
                || sqlType.equalsIgnoreCase("nvarchar")
                || sqlType.equalsIgnoreCase("nchar")
                || sqlType.equalsIgnoreCase("text")) {
            return "String";
        } else if (sqlType.equalsIgnoreCase("datetime")) {
            return "Date";
        } else if (sqlType.equalsIgnoreCase("image")||
        		sqlType.equalsIgnoreCase("blob")||sqlType.equalsIgnoreCase("binary")) {
            return "byte[]";
        }
 
        return null;
    }	 

public static void main(String[] args) {
try {
generateBean2();
} catch (Exception e) {
e.printStackTrace();
}
}

思维探索:就这些码?不是吧。代码都是一堆看不懂得常量。没关系,我给你贴张图看下
在这里插入图片描述
**
为了锻炼大家的动手能力和思维能力,这里我就将Const类中的常量只贴出来一部分仅仅供大家参考。实在有兴趣的朋友可以自行到下面网址下载

想要查看详细源码得同学请点击链接自行下载。该文件中有两种不同得生成方案,感兴趣得可以自行下载看下。

JavaBean文件生成器源码

**

最后我将生成得效果图贴出来,大家看下。是不是简简单单得就生成一个完美得JavaBean类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库的表转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的表名和字段名的支持,例如表名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成的Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选表功能,在文本框中已选中的表在打开选表对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值