简单说一下 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类