import org.apache.commons.lang.StringUtils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*; public class DBTableToJavaBeanUtil {
public static Connection connection; //mysql DB连接字符串
private static String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&noDatetimeStringSync=true&serverTimezone=UTC"; private static String DB_USER = "root"; //账号 private static String DB_PASSWD = "root"; //密码 //mysql 驱动全限定名称
public static String DB_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; static {
try {
Class.forName(DB_DRIVER_CLASS_NAME);
if (connection == null || connection.isClosed())
//获得链接
connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWD);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
System.out.println(ex.getMessage());
} catch (SQLException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
} public DBTableToJavaBeanUtil(){ } /**
* 表元数据
* @param table
* @return
*/
public static Map<String, String> getDBTableMeta(String table){
Map<String, String> colAndTypes = new HashMap();
String sql = "select * from " + table;
try {
PreparedStatement statement = connection.prepareStatement(sql);
//表 元数据
ResultSetMetaData metadata = statement.getMetaData();
//表 列
int len = metadata.getColumnCount();
for(int i= 1;i<= len; i++){
colAndTypes.put(metadata.getColumnName(i), sqlType2JavaType(metadata.getColumnTypeName(i)));
}
} catch (SQLException e) {
e.printStackTrace();
}
return colAndTypes;
} /**
* sql type <=> java type
* @param sqlType
* @return
*/
public static String sqlType2JavaType(String sqlType) {
switch (sqlType.toLowerCase()){
case "bit": return "boolean";
case "tinyint": return "byte";
case "smallint": return "short";
case "int": return "int";
case "bigint": return "long";
case "float": return "float";
case "decimal":
case "numeric":
case "real":
case "money":
case "smallmoney": return "double";
case "varchar":
case "char":
case "nvarchar":
case "nchar":
case "text": return "String";
case "datetime":
case "date": return "Date";
case "image": return "Blob";
case "timestamp": return "Timestamp";
default: return "String";
}
} /**
* table 2 class
* @param table 表名称
* @param path 保存类文件路径
*/
public static String tableToClass(String table, String path, String pack){
Map<String, String> colAndTypes = getDBTableMeta(table);
//类字符串
StringBuilder classStr = new StringBuilder(); if(colAndTypes.size() == 0) return ""; if(!isEmpty(pack)){
classStr.append("package " + pack + ";");
} classStr.append(genImport(colAndTypes.values())); //驼峰bean名称
classStr.append("public class " + dealName(table, 1) + " {\r\n"); //类字段
for (Map.Entry<String, String> entry : colAndTypes.entrySet()) {
classStr.append(genFieldStr(entry.getKey(), entry.getValue()));
} //get,Set
for (Map.Entry<String, String> entry : colAndTypes.entrySet()) {
classStr.append(genGetMethodStr(entry.getKey(), entry.getValue()));
classStr.append(genSetMethodStr(entry.getKey(), entry.getValue()));
} classStr.append("}\r\n"); //保存
path = isEmpty(path)?"":path;
File file = new File(path + dealName(table, 1) + ".java");
try(BufferedWriter write = new BufferedWriter(new FileWriter(file))) {
write.write(classStr.toString());
write.close();
} catch (IOException e) {
e.printStackTrace();
} return classStr.toString();
} public static String genImport(Collection<String> types){
StringBuilder sb = new StringBuilder();
if(types.contains("Date")){
sb.append("import java.util.Date;\r\n");
}
if(types.contains("Blob")){
sb.append("import java.sql.Blob;\r\n");
}
if(types.contains("Timestamp")){
sb.append("import java.sql.Timestamp;\r\n");
}
return sb.toString();
} /**
* 属性构造
* @param name
* @param type
* @return
*/
public static String genFieldStr(String name, String type) {
if(isEmpty(name) || isEmpty(type)) {
return "";
}
return String.format(" private %s %s;\n\r", new String[]{type, dealName(name, 0)});
} public static boolean isEmpty(String str){
if(str == null || str == "") return true; return false;
} /**
* get method construct
* @param name
* @param type
* @return
*/
private static String genGetMethodStr(String name, String type) {
if(isEmpty(name) || isEmpty(type)) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(String.format(" public %s get%s(){\n\r", type, dealName(name, 1)));
sb.append(String.format(" return this.%s;\r\n", dealName(name, 0)));
sb.append(" }\r\n");
return sb.toString();
} /**
* 驼峰名称处理
* @param name
* @param type
* @return
*/
public static String dealName(String name, int type) {
String[] names = StringUtils.split(StringUtils.trim(name), "_");
if(names.length > 0){
StringBuilder sb= new StringBuilder();
for (String s : names) {
sb.append(StringUtils.upperCase(StringUtils.substring(s, 0, 1)));
sb.append(StringUtils.lowerCase(StringUtils.substring(s, 1)));
}
if(type == 0){
sb.replace(0, 1, StringUtils.lowerCase(sb.substring(0, 1)));
}
return sb.toString();
}
return "";
} /**
* set method contruct
* @param name
* @param type
* @return
*/
public static String genSetMethodStr(String name, String type) {
if(isEmpty(name) || isEmpty(type)) {
return "";
}
String fieldName = dealName(name, 0);
StringBuilder sb = new StringBuilder();
sb.append(String.format(" public void set%s(%s %s){\n\r", dealName(name, 1), type, fieldName));
sb.append(String.format(" this.%s = %s;\r\n", fieldName, fieldName));
sb.append(" }\r\n");
return sb.toString();
} public static void close(){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
System.out.println(DBTableToJavaBeanUtil.tableToClass("book", "d:\\", null));
close();
} }

MYSQL 表转 JavaBean 工具类的更多相关文章

  1. java后台表单验证工具类

    /** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...

  2. mysql表生成JavaBean

    MySQLToBean.java package org.just.util; import java.io.File; import java.io.FileInputStream; import ...

  3. MySQL表结构同步工具 mysql-schema-sync

    mysql-schema-sync 是一款使用go开发的.跨平台的.绿色无依赖的 MySQL 表结构自动同步工具.用于将线上(其他环境)数据库结构变化同步到测试(本地)环境! 可以解决多人开发,每人都 ...

  4. JDBC基础篇(MYSQL)——自定义JDBCUtil工具类

    package util; import java.io.File; import java.io.InputStream; import java.sql.Connection; import ja ...

  5. 基于Java反射的map自动装配JavaBean工具类设计

    我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...

  6. java工具类(二)之java正则表达式表单验证

    java正则表达式表单验证类工具类(验证邮箱.手机号码.qq号码等) 这篇文章主要介绍了java使用正则表达式进行表单验证工具类,可以验证邮箱.手机号码.qq号码等方法,需要的朋友可以参考下. jav ...

  7. briup_JDBC_自建工具类

    1.操作的环境 STS,mysql,oracle orcle 所操作的数据库名为 ORCL 表为 m_stu 表结构如下 mysql  的表为:my_stu 表结构如下 工具类完整代码 package ...

  8. android经常使用正则工具类

    此类提供日常开发中经常使用的正则验证函数.比方:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于: ...

  9. DAO工具类的封装源码

    详细源码见下表,绝对原创,转载请注明出处! package com.ydj.util; import java.sql.Connection; import java.sql.PreparedStat ...

随机推荐

  1. MySQL知识总结(三)存储过程

    1. 创建存储过程 1.1 无参数存储过程 CREATE PROCEDURE bruce_procedure () BEGIN --1.声明变量 --2.执行业务逻辑 END 1.2 有参数的存储过程 ...

  2. 【译文】MySQL InnoDB 事物模型

    InnoDB事物模型 事物的隔离级别 自动提交,提交和回滚 一致的非锁定读 锁定读 在InnoDB事物模型中,目标是为了多版本数据库和传统的俩段锁协议的最佳实践(多版本并发控制).InnoDB在行级别 ...

  3. Java基础加强之集合

    集合整体框架图 各集合框架的概述 1. Collection(常用List和Set,不常用Queue和Vector),单元素集合. 2. Map(常用HashMap和TreeMap,不常用HashTa ...

  4. linux 的常用命令---------第一阶段

    ls -a    列出所有的文件,包括以 . 开头的隐藏文件 ls -d    列出目录本身,并不包含目录中的文件 ls -h    人类易读 ls -h    长输出 man      帮助使用手册 ...

  5. 使用vue.js实现checkbox的全选和多个的删除功能

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. 初识Qt图片显示、平移及旋转

    1.新建一个Qt Gui应用,项目名称为myPicture,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent ...

  7. 美团热修复Robust的踩坑之旅-使用篇

    最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...

  8. UITableViewCell的父视图

    最近版本测试阶段,发现一个奇怪的问题,以前在A测试机上出现的崩溃bug,解决后今天在B测试机上又出现了,在B上解决完之后,返回到设备A上发现又不行了.最后调试发现是测试设备系统版本不同导致的,A设备是 ...

  9. 名字&值

    1)名字VS值 名字和内存(存储)位置相关联. 名字—(环境)———>位置——(状态)——>值 这两个映射都在随着程序的运行而改变. 2)环境VS状态 环境是指一个名字到存储位置映射,也可 ...

  10. Linux中两台主机配置互信关系

    服务名:sshd 客户端配置文件:/etc/ssh/ssh_config 服务端配置文件:/etc/ssh/sshd_config sshd服务需要重启才会生效 service sshd restar ...