小程序---根据数据库反向生成java文件
工作中写entry太繁琐,写了一个小程序反向生成。从而大大减少了工作量
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
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.util.ArrayList;
import java.util.List;
/**
* @author weiwei.Wang
* @date 2016年7月14日
* @todo TODO 根据DB name获取数据库中的table,从而生成java文件
*
*/
public class CreateBean {
private String[] colnames; // 列名数组
private String[] colTypes; // 列名类型数组
private int[] colSizes; // 列名大小数组
private boolean f_util = false; // 是否需要导入包java.util.*
private boolean f_sql = false; // 是否需要导入包java.sql.*
private String url = "jdbc:mysql://127.0.0.1:3306/enrichmind";
private String user = "root";
private String pwd = "";
/**
* 获取数据库连接
*
* @return
*/
public Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pwd);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 根据数据库名生成bean java文件
*
* @param path
* @throws Exception
*/
public void createBeanMethod(String DBName, String javaFileSavePath)
throws Exception {
// myDB为数据库名
List<String> tableList = getTableNameByDBname(DBName);
for (int j = 0; j < tableList.size(); j++) {
Connection conn = getConnection(); // 得到数据库连接
String tableName = tableList.get(j);
String strsql = "select * from " + tableName;
PreparedStatement pstmt = null;
ResultSetMetaData rsmd = null;
try {
pstmt = conn.prepareStatement(strsql);
rsmd = pstmt.getMetaData();
int size = rsmd.getColumnCount(); // 共有多少列
colnames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
for (int i = 0; i < rsmd.getColumnCount(); i++) {
colnames[i] = rsmd.getColumnName(i + 1);
colTypes[i] = rsmd.getColumnTypeName(i + 1);
if (colTypes[i].equalsIgnoreCase("datetime")) {
f_util = true;
}
if (colTypes[i].equalsIgnoreCase("image")
|| colTypes[i].equalsIgnoreCase("text")) {
f_sql = true;
}
colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
}
String content = parse(colnames, colTypes, colSizes,
javaFileSavePath, tableName);
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 {
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 根据数据库名获取所有table
*
* @param DBname
* @return
*/
public List<String> getTableNameByDBname(String DBname) {
List<String> list = new ArrayList<String>();
try {
Connection conn = getConnection();
DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
ResultSet rs = dmd.getTables(null, null, "%", null);
while (rs.next()) {
// System.err.println("======"+ rs.getString("TABLE_NAME"));
list.add(rs.getString("TABLE_NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 解析处理(生成实体类主体代码)
*
* @throws Exception
*/
private String parse(String[] colNames, String[] colTypes, int[] colSizes,
String path, String tableName) throws Exception {
StringBuffer sb = new StringBuffer();
sb.append("import lombok.Data;\r\n");
if (f_util) {
sb.append("\r\n");
sb.append("import java.util.Date;\r\n");
}
if (f_sql) {
sb.append("\r\n");
sb.append("import java.sql.*;\r\n\r\n\r\n");
}
sb.append("@Data\r\n");
sb.append("public class " + initcap(tableName)
+ " extends AbstractEntity" + " {\r\n");
processAllAttrs(sb);
// processAllMethod(sb);
sb.append("}\r\n");
// 将string流写入文件
FileOperation.writeTxtFile(sb.toString(), new File(path
+ initcap(tableName) + ".java"));
System.out.println(sb.toString());
return sb.toString();
}
/**
* 生成所有的方法
*
* @param sb
*/
@SuppressWarnings("unused")
private void processAllMethod(StringBuffer sb) {
for (int i = 0; i < colnames.length; i++) {
sb.append("\tpublic void set" + initcap(colnames[i]) + "("
+ sqlType2JavaType(colTypes[i]) + " " + colnames[i]
+ "){\r\n");
sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
sb.append("\t}\r\n");
sb.append("\tpublic " + sqlType2JavaType(colTypes[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) {
for (int i = 0; i < colnames.length; i++) {
sb.append("\r\n");
sb.append("\t@Column(name = \"" + colnames[i] + "\")\r\n");
sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " "
+ colnames[i] + ";\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);
}
/**
* 将所有数据库中的字段类型转换为java中类型
*
* @param sqlType
* @return
*/
private String sqlType2JavaType(String sqlType) {
if (sqlType.equalsIgnoreCase("bit")) {
return "bool";
} else if (sqlType.equalsIgnoreCase("tinyint")) {
return "byte";
} else if (sqlType.equalsIgnoreCase("smallint")) {
return "short";
} else if (sqlType.equalsIgnoreCase("int")) {
return "int";
} 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")) {
return "double";
} else if (sqlType.equalsIgnoreCase("money")
|| sqlType.equalsIgnoreCase("smallmoney")) {
return "double";
} else if (sqlType.equalsIgnoreCase("varchar")
|| sqlType.equalsIgnoreCase("char")
|| sqlType.equalsIgnoreCase("nvarchar")
|| sqlType.equalsIgnoreCase("nchar")) {
return "String";
} else if (sqlType.equalsIgnoreCase("datetime")) {
return "Date";
}
else if (sqlType.equalsIgnoreCase("image")) {
return "Blob";
} else if (sqlType.equalsIgnoreCase("text")) {
return "Clob";
}
return null;
}
public static void main(String[] args) throws Exception {
CreateBean createBean = new CreateBean();
String javaFileSavePath = "D:\\wer\\"; //
String DBname = "enrichmind";
createBean.createBeanMethod(DBname, javaFileSavePath);
}
}
小程序---根据数据库反向生成java文件的更多相关文章
- MyEclipse 从数据库反向生成Hibernate实体类
第一个大步骤 window-->open Perspective-->MyEclipse Java Persistence 进行了上面的 操作后会出现一个视图DB Brower:MyEcl ...
- MyEclipse数据库反向生成实体类
MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...
- J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式
J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式 反向工程又称逆向工程. 开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...
- Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)
原文地址:Spring JdbcTemplate 查询结果集Map反向生成Java实体 以前写过一篇文章吐槽过Spring JdbcTemplate的queryForList方法(参见:http:// ...
- 使用pd从数据库逆向生成pdm文件
使用pd从数据库逆向生成pdm文件 好久没更新博客了,最近忙着各种事,捞了点老本行java的一些东西,浑浑噩噩,花了几天时间用java搭建了一个小项目的restful接口,深深觉得这东西论效率被nod ...
- Java逆向工程(数据库表生成java类)
说起来倒是挺简单的,就是听着名字感觉挺高大上.逆向工程方式有很多,比如mybatis就提供了一个这样的工具mybatis-genderator,这个我反正是没用过只是听说过,以前在公司都是用公司写好的 ...
- Android AIDL自动生成Java文件测试
/******************************************************************************** * Android AIDL自动生成 ...
- 微信小程序新闻列表功能(读取文件、template模板使用)
微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...
- 从数据库反向生成django的models
有办法实现django 数据库反向生成models的方法吗?答案是肯定的. 1. 配置 settings.py 中的数据库配置部分 DATABASES = { 'default': { 'ENGINE ...
随机推荐
- mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?
原文地址: http://www.cnblogs.com/stringzero/p/5707467.html 原先对mysql不太理解,但也没有报错.但理解的不够深入.这次补上. 原来以为int ...
- Ubuntu升级没有声音的解决方法
自从安装U14.04LTS版本后,每次开机都会弹出update窗,以前因为网络速度慢没更新成功过,这回环境允许就尝试了下这个过程,很顺利,可更新后没声音了,找了N中方法来解决,像更改配置文件/etc/ ...
- 转一篇讲camera的 mb好多年不搞3d 都忘光了
Camera定义 游戏中,Camera用来向用户展示场景,Camera就像一个摄像机,摄像机里面的景象就是Camera的展示范围,如下图所示: 在3D空间中Camera被定义为一个位置,有一个单位“方 ...
- EF中使用SQL语句或存储过程(小笔记)
1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToLis ...
- poj3334Connected Gheeves(二分)
链接 二分高度,算面积的地方有点麻烦,没有用求交点的模板,直接自己按三角形相似手算了一下,写的有点麻烦. 上下界直接取水可放的最高点以及最低点. 自己的长得很挫的代码 #include <ios ...
- Asp.net上传文件Request.files获取不到文件
使用ftp上传文件,并且Request.files获取文件,今天发现获取到的文件个数始终是0个,查了下原来form标签中需加入enctype=”multipart/form-data”,呵呵了 < ...
- php生成mysql的数据字典
<?php header('content-type:text/html;charset=utf-8'); define('DB_HOST','localhost'); define('DB_U ...
- Android Contacts (android通讯录读取)-content provider
Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据 ...
- hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...
- redis web 客户端工具 redis-admin
redis-admin是基于java的redis web客户端(redis client),以方便广大程序员使用redis为宗旨,集五种数据结构增删改查于一身. https://github.com/ ...