最近和数据库的表打交道挺多的,因为暂时做的是接口活。

在这过程中发现要把表转换成对应的javabean类型,字段少的表还行,如果不小心碰到几十个字段的他妈的写起来就有点麻烦了,万一碰到几百个的呢,那不是要崩溃。

于是想写个工具类,自动生成javabean。

先说下思路:

1.读取数据库表,获取里面的字段名。

准备连接数据库的驱动包,这里只是针对了oracle数据库和mysql数据库

2.构建一个stringBuffer字符串,用来生成我们需要的类。

3.写入文件

要求具备相应的文件流知识。

好了,准备工作就这些,下面附上代码,

package com.tool;
/*
 * 给出数据库JAR包,数据库链接路径,数据库表空间名,数据库名,数据库密码,表名
 *可以提取出来创建表属性的javaBean文件,并且提供标准的get,set方法。
 * 此程序将所有字段和数据提取出来定义为String类型,如有别的需要可以提取表中字段的类型和别的表信息,自动生成
 * java文件
 * \t 表示 空格
 * \r 表示换行 等价于 \n
 * ResultSetMetaData 关键
 * */
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
 
public class SqlToBean {
 private Connection conn = null;    //保存链接路径
 private Statement stmt = null;     //建立连接
 private ResultSetMetaData meta = null;  //保存表属性信息
 private ResultSet rs = null;  //查询结果集
 private OutputStreamWriter osw = null;
 private BufferedWriter bw = null;
 private FileOutputStream fos = null;
 private static StringBuffer coding = new StringBuffer();  //字符串缓冲区
 private String driver = null;    //数据库包名
 private String url = null;          //路径名
 private String table = null;        //表空间名
 private String password = null;     //密码
 private String tableName = null;    //表名
 
 public SqlToBean(String driver, String url, String table, String password, String tableName) {
  this.driver = driver;
  this.url = url;
  this.table = table;
  this.password = password;
  this.tableName = tableName;
 }
 
 private String getCoding(StringBuffer code) {
  return code.toString();
 }
 
 private StringBuffer createGenerate(String property) {
  String prop = property.toLowerCase();
  coding.append("\r \t private String " + prop + ";");
  return coding;
 }
 
 private StringBuffer createMethod(String[] str){
  for(int i=0;i<str.length;i++){
   //str[i].charAt(0) - 32)转成大写   思路
   str[i] = str[i].toLowerCase();
   coding.append("\r \t public void set" + (char)(str[i].charAt(0) - 32)+ str[i].substring(1)+"(String " + str[i] +"){");
   coding.append("\r \t\t this."+str[i] + "=" + str[i] + ";");
   coding.append("\r \t }");
   coding.append("\r \t public String get" + (char)(str[i].charAt(0) - 32)+ str[i].substring(1)+"(){");
   coding.append("\r \t\t return this."+str[i] +  ";");
   coding.append("\r \t }\n");
  }
  return coding;
 }
 /*
  * 关闭与数据库的所有链接
  * */
 private void destroy() {
  try {
   if(conn != null){
    conn.close();
    conn = null;
   }
   if(stmt != null){
    stmt.close();
    stmt = null;
   }
   if(rs != null){
    rs.close();
    rs = null;
   }
 
   if(bw != null){
    bw.close();
    bw = null;
   }
   if(fos != null) {
    fos.close();
    fos = null;
   }
   if(osw != null) {
    osw.close();
    osw = null;
   }
 
  } catch (SQLException e) {
   e.printStackTrace();
  }  catch (IOException e) {
   e.printStackTrace();
  }
 }
 /*
  * 数据库连接发生异常就关闭链接
  * */
 private  void connect () {
  try {
   Class.forName(driver);
   conn = DriverManager.getConnection(url,table,password);
   stmt = conn.createStatement();
 
   rs = stmt.executeQuery("select  * from " + tableName ); //查询下确定结果集是那个表的
   meta = rs.getMetaData();                         //调用结果集的记录表信息的方法
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
   try {
    if(conn != null){
     conn.close();
     conn = null;
    }
    if(stmt != null){
     stmt.close();
     stmt = null;
    }
    if(rs != null){
     rs.close();
     rs = null;
    }
   } catch (SQLException e1) {
    e.printStackTrace();
   }
  }  catch (SQLException e) {
   e.printStackTrace();
   try {
    if(conn != null){
     conn.close();
     conn = null;
    }
    if(stmt != null){
     stmt.close();
     stmt = null;
    }
    if(rs != null){
     rs.close();
     rs = null;
    }
   } catch (SQLException e1) {
    e.printStackTrace();
   }
  }
 
 }
 
 private String[] getColumenName() {
  /*得到表的所有列名以字符串数组的形式返回
   * */
  int count;
  String[] str = null;
  try {
   count = meta.getColumnCount();
   String[] strColumenName = new String[count];
   for(int i = 1;i <= count; i++) {
    strColumenName[i-1] = meta.getColumnName(i);
   }
   str = strColumenName;
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return str;
 }
 /**
  * 写入指定的文件中
  * @param message
  */
 private void writeData(String message,String className) {
  String file = "C:\\"+className+".java";
  try {
   fos = new FileOutputStream(file);
   osw = new OutputStreamWriter(fos);
   bw = new BufferedWriter(osw);
   bw.write(message);
   bw.flush();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
 }
 
 public StringBuffer createClassName(String className){
  coding.append("public class " + className + "{\n");
  return coding;
 }
 
 public static void main(String[] args) {
  String className = "Hellow";
  //SqlToBean sqlToBean = new SqlToBean("oracle.jdbc.driver.OracleDriver","jdbc:oracle:thin:@192.168.3.11:1521:orcl","mamibon","mamibon","my_standard_data2");
  SqlToBean sqlToBean = new SqlToBean("org.gjt.mm.mysql.Driver","jdbc:mysql://117.79.84.144:3306/wordpress","wangjun","wangjun123","wp_users");
  //连接数据库
  sqlToBean.connect();
  sqlToBean.createClassName(className);
  //获取表的字段
  String[] str ;
  str = sqlToBean.getColumenName();
  for(int i = 0;i<str.length ;i++) {
   sqlToBean.createGenerate(str[i]);
  }
  coding.append("\n");
  sqlToBean.createMethod(str);
  coding.append("\n}");
  //写入文件
  sqlToBean.writeData(sqlToBean.getCoding(coding),className);
  sqlToBean.destroy();
 
  System.out.println("如果觉得这工具类不错,请关注我们的网站:http://www.itbuluoge.com,期待你的入住,程序员俱乐部,为您提供更多的帮助!");
  System.out.println("如果觉得这工具类不错,请关注我们的网站:http://www.itbuluoge.com,期待你的入住,程序员俱乐部,为您提供更多的帮助!");
 }
 
}

java工具类–自动将数据库表生成javabean的更多相关文章

  1. Hibernate由model类自动同步数据库表结构

    在开发中遇到了个问题,每次测试数据库增加表结构的时候,本地pull下最新代码导致启动报错,上网搜了快速解决办法---->hibernate 配置属性中,hibernate.hbm2ddl.aut ...

  2. C# 通过自定义特性 实现根据实体类自动创建数据库表

    .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段:而特性是对类.字段.方法和属性等元素标注的声明性信息 如下代码(Id ...

  3. 由数据库表生成jpa实体工具

    package cn.net.yto.aaa.dao.generator; /** * 由数据库表生成jpa实体工具 * * @author huike * Created by gf.liu on ...

  4. django根据已有数据库表生成model类

    django根据已有数据库表生成model类 创建一个Django项目 django-admin startproject 'xxxx' 修改setting文件,在setting里面设置你要连接的数据 ...

  5. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  6. SpringBoot使用Hibernate,实现自动创建数据库表【博客数据库设计】

    我们准备设计博客,那就要设计数据库. 我们可以使用Hibernate来自动生成数据库. 博客数据库的结构: 实体类: 博客 Blog 博客分类 Type 博客标签 Tag 博客评论 Comment 用 ...

  7. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  8. 排名前 16 的 Java 工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  9. 快速创建SpringBoot2.x应用之工具类自动创建web应用、SpringBoot2.x的依赖默认Maven版本

    快速创建SpringBoot2.x应用之工具类自动创建web应用简介:使用构建工具自动生成项目基本架构 1.工具自动创建:http://start.spring.io/ 2.访问地址:http://l ...

随机推荐

  1. 关于python的环境变量问题

    我的ubuntu安装python后,查看所有的环境变量,发现没有PYTHONPATH?对我使用python没太大影响,自己写的模块的路径问题有很多方法解决.但是现在我想将我写的模块放在一个包里,要用到 ...

  2. C# Winfrom小黄鸡功能调用

    最近研究微信公众平台,搭建了一个微信聊天机器人,调用小黄鸡的公众接口,实现在线和小黄鸡聊天的功能. 接口调用不是很麻烦,不过是php版本,所以研究了一下C#的功能模块, Winfrom版 后台界面代码 ...

  3. cadence 机械孔的制作

    在平时画PCB的时候,会用到安装孔,好多人就是找个过孔,在原理图中连接GND,这样使用也可以,下面介绍一种正经机械孔的制作方法(自己摸索的),制作一个孔径为3mm的安装孔. 1 打开pad desig ...

  4. Objective-C的内省(Introspection)小结

    内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富.内省是对象揭示自己作为一个运行时对象的详细信息的一种能力.这些详细信息包括 ...

  5. ASP.NET MVC NonActionAttribute使用说明

    默认情况下,MVC 框架将 controller 类的所有公共方法都视为操作方法. 如果您的 controller 类包含公共方法,并且您不希望它成为操作方法,则必须用 NonActionAttrib ...

  6. JVM内幕:Java虚拟机详解

    这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守 Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨 ...

  7. layoutSubviews -- setNeedsLayout -- layoutIfNeeded -- 区别

    -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但 ...

  8. 【学习总结】声明变量在@interface括号中与使用@property的区别

    方式一:直接在.h文件@interface中的大括号中声明. @interface Test : NSObject { NSString *str; // 私有变量 , 其他类无法访问,只能够该类内部 ...

  9. SecureCRT配色方案

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.作为一款经常使用的终端软件,一个好的配色方案可以大大的提高学 ...

  10. ASP.Net MVC4 登录

    一月之前,工作室师兄给我们介绍博客,然后试着去申请了一个,一直不晓得更新什么,直到今天,才有了一点小想法.最近在做一个小网站,然后就在登录那一块犯愁了,止步不前. 以前对登录一直没有什么概念,以为登录 ...