小程序---根据数据库反向生成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 ...
随机推荐
- uTenux\AT91SAM3S4C开发套件———硬件电路介绍
无论写什么嵌入式软件,我们都应该首先对硬件有所了解,这样更有助于我们写出高效精简的程序代码.本次活动我们使用的硬件平台是有悠龙公司提供的uTenux\AT91SAM3S4C开发套件,在悠龙公司的主页可 ...
- GZFramwork快速开发框架演练之会员系统(一)框架源码下载
GZFramwork框架开发环境为.NET 4.0 (必须) VS2013+SQL2005+DevExpress v13.2.8+FastReport (推荐) 数据库建模工具PowerDesi ...
- linux mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...
- 单向和双向tvs管
tvs管器件按极性可分为单极性和双极性两种,即单向tvs管和双向tvs管. 单向tvs管保护器件仅能对正脉冲或者负脉冲进行防护,而双向tvs管保护器件一端接要保护的线路,一端接地,无论来自反向还 ...
- VI编辑器
- iOS - UITableViewController
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableView : UIScrollView <NSCoding> @available(iOS ...
- THE SENSE OF BEAUTY
#include<stdio.h> int main() { ][] = { " ,.:;j", " ,: i. .,:;ff", " : ...
- Vim优化
写python代码时,希望缩进是4个空格,而不是制表符tab, 在vim中,我们只需要简单配置一下就ok了,打开~/.vimrc加上下面的几行(如果已经有了,修改一下数值就行了). set tabst ...
- Python学习笔记12—类
典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...
- 共享内存 最快IPC 的原因
参考 http://www.360doc.com/content/13/0817/11/7377734_307777806.shtml 我的理解,这里指的是用户进程的用户态空间和内核空间,也就是那个3 ...