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. angular 生命周期钩子 ngOnInit() 和 ngAfterViewInit() 的区别

    angular 生命周期钩子的详细介绍在 https://angular.cn/guide/lifecycle-hooks  文档中做了介绍. ngOnInit() 在 Angular 第一次显示数据 ...

  2. P2245 星际导航

    题目描述 sideman 做好了回到 Gliese星球的硬件准备,但是 sideman 的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有 N 个顶点和 M 条边的带权无向图,顶点表示 ...

  3. Day5 JDBC

    JDBC的简介 Java  Database Connectivity:连接数据库技术. SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),使用同一套程序操作不同的数 ...

  4. 20165302 敏捷开发与XP实践作业

    20165302 敏捷开发与XP实践实验报告 一.提交点一 1.实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD ...

  5. R执行报错:Error in `[<-.ts`(`*tmp*`,...only replacement of elements is allowed

    原因: pred$mean是Time-Series类型,rbind函数不支持.通过as.double将其转换成double类型即可. 修改前代码: all_predata_time <- dat ...

  6. 使用Navicat for Oracle工具连接oracle

    使用Navicat for Oracle工具连接oracle的 这是一款oracle的客户端的图形化管理和开发工具,对于许多的数据库都有支持.之前用过 Navicat for sqlserver,感觉 ...

  7. 【html】点击链接让页面在 iframe 中变换

    Demo: <html><body> <a href= "1.html " target= "iFrameName "> p ...

  8. Hadoop应用开发,常见错误

    错误1:在windows执行mr Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.had ...

  9. koa2学习笔记02 - 给koa2添加系统日志 —— node日志管理模块log4js

    前言 没有日志系统的后台应用是没有灵魂的, 平时工作中每次我们遇到接口报错的时候, 都会叫后台的童鞋看下怎么回事, 这时后台的童鞋都会不慌不忙的打开一个骚骚的黑窗口. 一串噼里啪啦的命令输进去, 哐哐 ...

  10. 记一次Apache Carbondata PR的经历

     前言 前段时间有幸接触到Apache Carbondata,试用过程中发现了一个小小的问题,并且又很快的定位到了问题.然后在社区群里反映了下,负责人问愿不愿意提个JIRA,PR,然后我在没有任何开源 ...