package test.utils;

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

/**
* 数据库表转换成javaBean对象小工具(已用了很长时间),
* 1 bean属性按原始数据库字段经过去掉下划线,并大写处理首字母等等.
* 2 生成的bean带了数据库的字段说明.
* 3 各位自己可以修改此工具用到项目中去.
*/
public class GenerateJavaFileUtils {
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 = getConnection();
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 {
releaseConnection(conn);
}
}

/**
* 解析处理(生成实体类主体代码)
*/
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 = "";
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"))
return "float";
else if (sqlType.equals("double") || sqlType.equals("double precision")) {
return "Double";
} 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;
}

/**
* 自动获取jcbc链接
*/
protected static Connection getConnection() {
Connection localConnection = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
localConnection = DriverManager.getConnection(
"jdbc:oracle:thin:@//localhost:1521/base", "test", "test");
localConnection.setAutoCommit(false);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return localConnection;
}

/**
* 释放jdbc链接
*
* @param conn
*/
protected static void releaseConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}

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

}

数据库表转换成javaBean对象小工具的更多相关文章

  1. 数据库表转换成JavaBean

    本人花了几个小时用C#开发了一款,数据表生成javabean的软件.目前只支持Mysql,内置类型映射器.开源,没有测试. 支持数据库注释,忘了获取表注释,见谅.使用之前配置一下config.xml文 ...

  2. (转)json格式转换成javaBean对象的方法

    把json格式转换成javaBean才可以.于是查了一下资料,网上最多的资料就是下面的这种方式: Java code? 1 2 3 4 5 6 7 8 9 String str = "[{\ ...

  3. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  4. python3.6 + selenium2.53.1 查询数据库并将返回的内容中每一行的内容转换成class对象

    环境: win10 python3.6 selenium2.53.1 准备工作:先安装pymysql python2.x链接数据库使用MySQLdb,而python3.x链接数据库使用pymysql ...

  5. gson和fastjson将json对象转换成javaBean 简单对照

    今天在网上看代码时,发现项目使用了Gson,用于将json字符串转换成javaBean. 以前没使用过Gson,随即,简单入了个们, 想起fastjson也有将json字符串转换成javaBean的A ...

  6. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  7. SQL Server单表已700w+将普通表转换成分区表1

    最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤.   一.创建文件组 ...

  8. 数据库记录转换成json格式 (2011-03-13 19:48:37) (转)

    http://blog.sina.com.cn/s/blog_621768f30100r6v7.html 数据库记录转换成json格式 (2011-03-13 19:48:37) 转载▼ 标签: 杂谈 ...

  9. SQL Server 2005中的分区表(三):将普通表转换成分区表(转)

    在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...

随机推荐

  1. iOS-XMPP客户端

    首先我们自己做一个的IOS客户端程序 先看一下我们完成的效果图 首先下载xmppframework这个框架 点ZIP下载 接下来,用Xcode新建一个工程 将以下这些文件拖入新建工程中 加入frame ...

  2. python 处理异常

    try: ...(主要动作,试着执行的程序代码,如果引发异常,执行第一个复合引发异常的except下面的语句.如果没有符合的,就会终止程序,打印出错!) except name:(except 分句的 ...

  3. 对UIWebView的学习

    建工程,建一个类WebViewController 继承于UIViewController WebViewController设置为根视图控制器 WebViewController遵守UIWebVie ...

  4. UI学习笔记---第十天UITableView表视图编辑

    UITableView表视图编辑 表视图编辑的使用场景 当我们需要手动添加或者删除某条数据到tableView中的时候,就可以使用tableView编辑.比如微信 扣扣中删除和某人的通话 当我们需要手 ...

  5. ZOJ 3878--解题报告

    题目相关: 3878相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5526 Edward 打字员习惯于QWERTY键 ...

  6. 2015GitWebRTC编译实录4

    2015.07.17 libg711 编译通过[422/1600 ] CC obj /webrtc/modules/audio_coding/codecs/g711/g711.g711.o[423/1 ...

  7. 增加mvc:resources后访问不了注解配置的controller的问题

    刚开始没有配置mvc:resourcescontroller能够正确访问,但是由于web.xml使用/拦截了所有的请求,所以静态资源访问不上增加mvc:resources之后,静态资源是能访问上了,但 ...

  8. Spring中使用Jcaptcha实现校验码验证

    本文将使用Jcaptcha实现校验码验证,并演示在Spring/SpringMVC环境下的使用方法. 1. maven依赖 <dependency> <groupId>com. ...

  9. 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2

    Season 1, Episode 7: Riots, Drills and the Devil: Part 2 -Pope: Belick, get those guys in line guy: ...

  10. 【P1813】8的倍数

    容斥原理,居然没想到……要补一下数论了 原题: 小x最近对数字8很感兴趣,有8进制,2008奥运会之类的.现在小x想知道,在[x,y]区间里,有多少个数能被8整除.小y觉得题目太简单,于是给出n个其他 ...