给大家发一个java 自动生成Bean的工具代码

guishuanglin 2013-12-30 04:26:27
java 自动生成Bean的工具:


import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

/**
* 数据库表转换成javaBean对象小工具(已用了很长时间),
* 1 bean属性按原始数据库字段经过去掉下划线,并大写处理首字母等等.
* 2 生成的bean带了数据库的字段说明.
* 3 各位自己可以修改此工具用到项目中去.
*/
public class MyEntityUtils {
private String tablename = "";
private String[] colnames;
private String[] colTypes;
private int[] colSizes; // 列名大小
private int[] colScale; // 列名小数精度
private boolean importUtil = false;
private boolean importSql = false;
private boolean importMath = false;

/**
* @param args
* 各位按自己的
*/
public void tableToEntity(String tName) {
tablename = tName;
//数据连Connection获取,自己想办法就行.
Connection conn = null;
String strsql = "SELECT * FROM " + tablename;//+" WHERE ROWNUM=1" 读一行记录;
try {
System.out.println(strsql);
PreparedStatement pstmt = conn.prepareStatement(strsql);
pstmt.executeQuery();
ResultSetMetaData rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 共有多少列
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
colScale = new int[size];
for (int i = 0; i < rsmd.getColumnCount(); i++) {
rsmd.getCatalogName(i + 1);
colnames[i] = rsmd.getColumnName(i + 1).toLowerCase();
colTypes[i] = rsmd.getColumnTypeName(i + 1).toLowerCase();
colScale[i] = rsmd.getScale(i + 1);
System.out.println(rsmd.getCatalogName(i+1));
if ("datetime".equals(colTypes[i])) {
importUtil = true;
}
if ("image".equals(colTypes[i]) || "text".equals(colTypes[i])) {
importSql = true;
}
if(colScale[i]>0){
importMath = true;
}
colSizes[i] = rsmd.getPrecision(i + 1);
}
String content = parse(colnames, colTypes, colSizes);
try {
FileWriter fw = new FileWriter(initcap(tablename) + ".java");
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn!=null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

/**
* 解析处理(生成实体类主体代码)
*/
private String parse(String[] colNames, String[] colTypes, int[] colSizes) {
StringBuffer sb = new StringBuffer();
sb.append("\r\nimport java.io.Serializable;\r\n");
if (importUtil) {
sb.append("import java.util.Date;\r\n");
}
if (importSql) {
sb.append("import java.sql.*;\r\n\r\n");
}
if(importMath){
sb.append("import java.math.*;\r\n\r\n");
}
//表注释
processColnames(sb);
sb.append("public class " + initcap(tablename) + " implements Serializable {\r\n");
processAllAttrs(sb);
processAllMethod(sb);
sb.append("}\r\n");
System.out.println(sb.toString());
return sb.toString();

}
/**
* 处理列名,把空格下划线'_'去掉,同时把下划线后的首字母大写
* 要是整个列在3个字符及以内,则去掉'_'后,不把"_"后首字母大写.
* 同时把数据库列名,列类型写到注释中以便查看,
* @param sb
*/
private void processColnames(StringBuffer sb) {
sb.append("\r\n/** " + tablename + "\r\n");
String colsiz="";
String colsca="";
for (int i = 0; i < colnames.length; i++) {
colsiz = colSizes[i]<=0? "" : (colScale[i]<=0? "("+colSizes[i]+")" : "("+colSizes[i]+","+colScale[i]+")");
sb.append("\t" + colnames[i].toUpperCase() +" "+colTypes[i].toUpperCase()+ colsiz+"\r\n");
char[] ch = colnames[i].toCharArray();
char c ='a';
if(ch.length>3){
for(int j=0;j <ch.length; j++){
c = ch[j];
if(c == '_'){
if (ch[j+1]>= 'a' && ch[j+1] <= 'z') {
ch[j+1]=(char) (ch[j+1]-32);
}
}
}
}
String str = new String(ch);
colnames[i] = str.replaceAll("_", "");
}
sb.append("*/\r\n");
}
/**
* 生成所有的方法
*
* @param sb
*/
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.length; i++) {
sb.append("\tpublic void set" + initcap(colnames[i]) + "("
+ oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " " + colnames[i]
+ "){\r\n");
sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
sb.append("\t}\r\n");

sb.append("\tpublic " + oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " get"
+ initcap(colnames[i]) + "(){\r\n");
sb.append("\t\treturn " + colnames[i] + ";\r\n");
sb.append("\t}\r\n");
}
}

/**
* 解析输出属性
*
* @return
*/
private void processAllAttrs(StringBuffer sb) {
sb.append("\tprivate static final long serialVersionUID = 1L;\r\n");
for (int i = 0; i < colnames.length; i++) {
sb.append("\tprivate " + oracleSqlType2JavaType(colTypes[i],colScale[i],colSizes[i]) + " "
+ colnames[i] + ";\r\n");
}
sb.append("\r\n");
}

/**
* 把输入字符串的首字母改成大写
* @param str
* @return
*/
private String initcap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}

/**
* Oracle
* @param sqlType
* @param scale
* @return
*/
private String oracleSqlType2JavaType(String sqlType, int scale,int size) {
if (sqlType.equals("integer")) {
return "Integer";
} else if (sqlType.equals("long")) {
return "Long";
} else if (sqlType.equals("float")
|| sqlType.equals("float precision")
|| sqlType.equals("double")
|| sqlType.equals("double precision")
) {
return "BigDecimal";
}else if (sqlType.equals("number")
||sqlType.equals("decimal")
|| sqlType.equals("numeric")
|| sqlType.equals("real")) {
return scale==0? (size<10? "Integer" : "Long") : "BigDecimal";
}else if (sqlType.equals("varchar")
|| sqlType.equals("varchar2")
|| sqlType.equals("char")
|| sqlType.equals("nvarchar")
|| sqlType.equals("nchar")) {
return "String";
} else if (sqlType.equals("datetime")
|| sqlType.equals("date")
|| sqlType.equals("timestamp")) {
return "Date";
}
return null;
}

/**
* @param args
*/
public static void main(String[] args) {
MyEntityUtils t = new MyEntityUtils();
t.tableToEntity("TABLE");
}

}
...全文
2154 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
引用 5 楼 qiyuexuel 的回复:
这个 表关联 咋整
把查询表,改成一条自己写的sql就行.
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
引用 4 楼 a_liujian 的回复:
先MARK下!
表关联也容易啊,写一条自己的 sql就能生成相应的Bean.
异常异长 2013-12-31
  • 打赏
  • 举报
回复
先收藏下
tony4geek 2013-12-31
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
先收藏下,还没学习到哪
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
1 影响java性能的 基本是连接池与数据库本身的瓶颈 这种jdbc原始代码已标准化了, 只要及时在 finally 块释连接到池中,这些操作代码不用担心任何性能问题. 2 另外 批处理代码中 批量不应过大,大批量只应用在导入导出数据, 不适用在业务代码中, 原因: 事务过大影响数据库回滚, 导致数据库性能低, 所以事务要适当. 3 jdbc 有个不足千万要注意, ResultSet rs 读取记录时 getLong 这种读取基本数据类型 返回的不是对象,而是数值, 所以如果数据库为空 返回的是 0 而不是null. 这一块要自己全部做工具处理, rs有一个 isNull判断的方法(这种是我在你的贴子中生成的代码 是用自己工具来读取的原因)
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
john_sheep: 你发的 http://bbs.csdn.net/topics/390678591 贴子中,我已把自动生成dao代码例子发送, 由于生成dao代码太长,你以后可以自己慢慢按例子生成就行, 同时 例子的jdbc方法为java行业标准代码无需担心项目应用的问题, 当然如果楼主要求更高 可以自己再修改.
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
关于要不要bean实现 many-to-one,one-to-many 我个人一点点看法: 1 开发语言面向对象的概念 与关系数据表之间的关系有类似的地方, 但是两者出发点不相同不能强求融合. 2 外键的概念可以用对象组合,或者对象集合的属性来描述, 但是就算这样搞出来,也与数据库的本意相差很远, 用起来就经常说不出的感觉, 我曾经有几个月在想这个事情,最后觉得完全没有必要. 3 其实 单个对象之间的属性 本身就与数据库是一样的, 外键也是同样能体现,已经隐式实现了 many-to-one,one-to-many 这些关系, 如果再在对象里做这些东西是多余的. 4 为什么说是多余的原因我想了好久, 觉得数据库里就是这种结构bean就应当一样就够了, 之于主键,外键关系 数据库是重定义了逻辑处理的, 我们相想: 如果不定义外键我们程序一样能处理,是不是? 再一个很多在项目并不是都做外键,很多都不做了,为什么? 因为程序逻辑能处理,数据库搞这个有时还不好. 所以 bean里为什么要搞成与数据库一样呢? 只要bean有值,开发团队定义他是外键,程序照样可以处理很好: 因为有个ID,我们就能找到它的对象. 5 hibernate 是一个好的东西, 但是它并不合适生存在现实的商业项目中, 太过于理想化反而会影响灵活性. 但是并不是他的出现没有用, hibernate 告诉我们一个道理: 可以实现自己更适合的框架. 6 经过多年的orm工具的使用 最后觉得 "最原始的工具就是最强大,最能解决问题的东西" 7 orm框架时代已过去, 现在应当回到最初的软件工程基础部分: 系统框架,系统生态,系统在应到数百个项目后的修改适应性(当然项目过多维护会死人的,这要求软件有强大的适应性) java众多的技术层出不穷, 但是多年来唯有spring解决的问题一直帮助着我们,其它的东西很多去不见了. 8 说个故事 当公司说要做云系统,分布式服务系统, 我从java技术堆里想找个性能比较好的网络交互技术, webService, j2ee, rmi 性能都差强人意, 真想直接定义tcp规范 用Socket,udp,http通信,传通数据 这段话只想说一个道理: 选择实用的技术, 最原始的就是强的工具(但不是最方便的).
岁寒松柏 2013-12-31
  • 打赏
  • 举报
回复
支持下
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
通过jdbc代码 能取得表与表之前的关系, 从而可以实现他的要求. 学术研究还是可以试试.
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
引用 15 楼 forgetsam 的回复:
[quote=引用 14 楼 guishuanglin 的回复:] [quote=引用 5 楼 qiyuexuel 的回复:] 这个 表关联 咋整
把查询表,改成一条自己写的sql就行.[/quote] 他要的是类似hibernate的many-to-one,one-to-many之类的。[/quote] hibernate 从2007年开始我们就不用了, 学习可以这东西不合适用在大项目中. many-to-one,one-to-many 要实现也不难, 问题是有这个必要么, java也用过 10多年了 还是jdbc实用.
forgetsam 2013-12-31
  • 打赏
  • 举报
回复
引用 14 楼 guishuanglin 的回复:
[quote=引用 5 楼 qiyuexuel 的回复:] 这个 表关联 咋整
把查询表,改成一条自己写的sql就行.[/quote] 他要的是类似hibernate的many-to-one,one-to-many之类的。
约翰羊 2013-12-30
  • 打赏
  • 举报
回复
学习了两天,基本上搞明白了,多谢楼主!
齐岳 2013-12-30
  • 打赏
  • 举报
回复
这个 表关联 咋整
a_jian 2013-12-30
  • 打赏
  • 举报
回复
先MARK下!
繁华终归落尽 2013-12-30
  • 打赏
  • 举报
回复
tom6495 2013-12-30
  • 打赏
  • 举报
回复
给力!!!!!!!!!!!!!!!!
思想的光芒 2013-12-30
  • 打赏
  • 举报
回复
多谢楼主了 受教了

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧