`

根据表信息生成JavaVO

    博客分类:
  • java
阅读更多

例子采用MySQL数据库

 

代码:

package com.ustcsoft.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

/**
 * 类:DBToVO
 * 功能:根据数据库表生成VO--Value Object
 * @author sam
 * @e-mail:sanlai_lee@lisanlai.cn
 */
public class DBToJavaVO {
	private static final String TARGET_DIR="C:/tempVO/";							//类文件存放的路径
	private static final String DIVER_NAME="org.gjt.mm.mysql.Driver";
	private static final String URL="jdbc:mysql://localhost:3306/bms"; 
	private static final String USERNAME="root";
	private static final String PASSWORD="root";
	private static final String DATABASE_NAME="BMS";								//数据库名称
	private static final String AUTHOR="sam";										//作者
	private static final String E_MAIL="sanlai_lee@lisanlai.cn";					//作者邮箱
	private static final String PACKAGE_NAME="com.ustcsoft.vo";						//包名
	private Connection conn;
	private Statement stmt;
	private String sql;
	private ResultSet rs;
	private String[] fields;	//属性
	private String[] dataTypes;	//数据类型
	private String[] comments;	//属性的注释
	/**
	 * 方法:根据数据库表生成VO--Value Object
	 * @param tableName
	 */
	private void tableToVo(){
		
		String tableName;
		String className;
		try {
			InputStreamReader reader = new InputStreamReader(System.in);
			BufferedReader bf = new BufferedReader(reader);
			System.out.println("输入要转换成VO的表名称:");
			tableName = bf.readLine().trim();
			System.out.println("输入生成的类名,不输入的时候默认跟表名相同:");
			className = bf.readLine().trim();
			Class.forName(DIVER_NAME);
			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
			stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);	//创建可滚动的,只读的结果集
			sql = "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT"+
				  " FROM INFORMATION_SCHEMA.COLUMNS"+
				  " WHERE table_name = '"+tableName.toUpperCase()+"'"+		//表名
				  " AND table_schema = '"+DATABASE_NAME+"'";				//数据库名
			System.out.println(sql);
			rs = stmt.executeQuery(sql);
			rs.last();										//把指针指向结果集的最后
			int fieldNum = rs.getRow();						//取得最后一条结果的行号,作为类的属性个数
			int n = fieldNum;
			if(n>0){									//判断数据表中是否存在字段
				fields = new String[n];
				dataTypes = new String[n];
				comments = new String[n];
				fields[--n] = rs.getString(1);
				dataTypes[n] = rs.getString(2);
				comments[n] = rs.getString(3);
				while(rs.previous()){
					fields[--n]=rs.getString(1);			//取得结果集的第一列数据,对应的列名:Field
					dataTypes[n] = rs.getString(2);
					comments[n] = rs.getString(3);
				}
				//打印相关信息
				System.out.println("你要转换的表是:"+tableName);
				System.out.println("该表中共有"+fieldNum+"个字段,信息如下:");
				for(int i=0,j=fields.length;i<j;i++){
					System.out.println("----------------------------------------");
					String field = fields[i];
					System.out.println("字段名称:"+field);
					//把字段名称格式化成java命名规则形式
					field=formatField(field);
					fields[i]=field;						//把格式化后的字段放入属性数组中
					System.out.println("数据类型:"+dataTypes[i]);
					//把数据库字段类型转换成java数据类型
					String dataType = dataTypes[i].toLowerCase();
					dataType = formatDataType(dataType);
					dataTypes[i] = dataType;
					
					System.out.println("字段注释:"+comments[i]);
					if("".equals(comments[i])||comments[i]==null){
						comments[i]=fields[i];
					}
					System.out.println("----------------------------------------");
				}
				//格式化类名称
				foramtClassName(className,tableName);
				//生成类文件,写入到磁盘中
				writeObjectToFile(className);
			}else{
				System.out.println("该表不存在或者表中没有字段");
			}	
		} catch (ClassNotFoundException e) {
			System.out.println("未找到数据库驱动");
			System.out.println(e.getMessage());
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			//e.printStackTrace();
		} catch (IOException e) {
			System.out.println(e.getMessage());
			//e.printStackTrace();
		}finally{
			try {
				if(stmt!=null){
					if(!stmt.isClosed()){
						stmt.close();
						stmt=null;
						System.gc();
					}
				}
				if(conn!=null){
					if(!conn.isClosed()){
						conn.close();
						conn=null;
						System.gc();
					}
				}
			} catch (SQLException e) {
				System.out.println(e.getMessage());
			}
		}
	}
	
	/**
	 * 把数据库字段格式成java变量名
	 * @param field
	 * @return
	 */
	private String formatField(String field){
		String[] strs = field.split("_");
		field="";
		for(int m = 0,length=strs.length;m<length;m++){
			if(m>0){
				String tempStr = strs[m].toLowerCase();
				tempStr = tempStr.substring(0, 1).toUpperCase()+tempStr.substring(1, tempStr.length());
				field += tempStr;
			}else{
				field += strs[m].toLowerCase();
			}
		}
		return field;
	}
	
	private String formatDataType(String dataType){
		if(dataType.contains("char")){
			dataType="java.lang.String";
		}else if(dataType.contains("int")){
			dataType="java.lang.Integer";
		}else if(dataType.contains("float")){
			dataType="java.lang.Float";
		}else if(dataType.contains("double")){
			dataType="java.lang.Double";
		}else if(dataType.contains("number")||dataType.contains("decimal")){
			dataType="java.math.BigDecimal";
		}else if(dataType.contains("date")){
			dataType="java.sql.Date";
		}else if(dataType.contains("time")){
			dataType="java.sql.Timestamp";
		}else if(dataType.contains("clob")){
			dataType="java.sql.Clob";
		}else{
			dataType="java.lang.Object";
		}
		return dataType;
	}
	/**
	 * 格式化类名
	 * @param className
	 * @param tableName
	 * @return
	 */
	private String foramtClassName(String className,String tableName){
		//如果类名不是自己定义的,那么根据表名格式化类名
		if("".equals(className)||className==null){
			className="";
			String[] tempArr = tableName.split("_");
			for(int m=0,length=tempArr.length;m<length;m++){		
				className += tempArr[m].substring(0,1).toUpperCase()+tempArr[m].substring(1,tempArr[m].length()).toLowerCase();
			}
		}else{
			//如果类名已经输入,那么不管三七二十一就把类名的第一个字母大写
			className = className.substring(0,1).toUpperCase()+className.substring(1,className.length());
		}
		return className;
	}
	
	/**
	 * 生成类并写到文件
	 * @param className
	 */
	@SuppressWarnings("deprecation")
	private void writeObjectToFile(String className){
		PrintWriter writer = null;
		try {
			 File dir = new File(TARGET_DIR);
			 if(!dir.exists()){
				 dir.mkdirs();
			 }
			 File file = new File(TARGET_DIR+className+".java");
			 if(!file.exists()){
				 file.createNewFile();
			 }
			 writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));
			 
			 //拼文件内容
			 StringBuffer content = new StringBuffer();
			 content.append("package "+PACKAGE_NAME+";\n\n");
			 content.append("/**\n");
			 content.append(" *@类:"+className+"\n");
			 content.append(" *@作者:"+AUTHOR+"\n");
			 content.append(" *@E-mail:"+E_MAIL+"\n");
			 content.append(" *@日期:"+new Date().toLocaleString().substring(0,10)+"\n");
			 content.append(" */\n\n");
			 content.append("public class "+className+"{\n\n");
			 for(int i=0,j=fields.length;i<j;i++){
				 content.append("	/**"+comments[i]+"*/\n");
				 content.append("	private "+dataTypes[i]+" "+fields[i]+";\n\n");
			 }
			 //get set 方法
			 for(int i=0,j=fields.length;i<j;i++){
				 content.append("	/**\n");
				 content.append("	 *方法: 取得"+fields[i]+"\n");
				 content.append("	 *@return: "+dataTypes[i]+"  "+fields[i]+"\n");
				 content.append("	 */\n");
				 content.append("	public "+dataTypes[i]+" get"+fields[i].substring(0,1).toUpperCase()+fields[i].substring(1,fields[i].length())+"(){\n");
				 content.append("		return this."+fields[i]+";\n");
				 content.append("	}\n\n");
				 content.append("	/**\n");
				 content.append("	 *方法: 设置"+fields[i]+"\n");
				 content.append("	 *@param: "+dataTypes[i]+"  "+fields[i]+"\n");
				 content.append("	 */\n");
				 content.append("	public void set"+fields[i].substring(0,1).toUpperCase()+fields[i].substring(1,fields[i].length())+"("+dataTypes[i]+" "+fields[i]+"){\n");
				 content.append("		this."+fields[i]+" = "+fields[i]+";\n");
				 content.append("	}\n\n");
			 }
			 content.append("}");
			 writer.write(content.toString());
			 writer.flush();
			 System.out.println("类生成成功,存放路径:"+TARGET_DIR);
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(writer!=null){
				writer.close();
			}
		}
	}
	
	public static void main(String[] args) {
		try {
			new DBToJavaVO().tableToVo();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}
}

 

0
0
分享到:
评论

相关推荐

    java根据数据库自动生成vo 类

    这些工具通常需要用户指定数据库连接信息、表名,然后它们会根据表结构生成VO类。 在生成VO类的过程中,需要注意以下几点: - 数据类型转换:数据库中的数据类型需要转换为Java类型,例如,数据库中的`INT`对应...

    自动生成vo类(mysql数据库为例)

    根据数据库中表的字段自动生成java中的vo类,方便调用

    eclipse插件,根据数据库表自动生成DTO(pojo)插件

    因此,"eclipse插件,根据数据库表自动生成DTO(pojo)插件"应运而生,它极大地提高了开发效率。 该插件的核心功能是根据数据库中的表结构自动生成对应的DTO和POJO类。这样,开发者无需手动编写这些类,只需专注于...

    由表名生成vo

    根据题目描述,我们需要通过SQL查询从`user_tab_cols`和`user_col_comments`两个表中获取指定表(`APPLICANT`或`FA_USER`)的列信息及注释,并据此生成对应的Java类型。以下为具体的SQL实现: ```sql SELECT '...

    mybatis的Generator自动生成dao和vo

    MBG会根据表结构自动生成基本的CRUD操作。 4. **DAO实现类**:实现了Mapper接口,提供了调用数据库的方法。在MyBatis中,这部分通常是自动生成的,无需手动编写。 通过MBG,开发者可以避免手动编写大量的重复代码...

    Oracle 自动生成POVO工具

    Oracle 自动化生成POJO(Plain Old Java Object)与VO(Value Object)工具,简称POVO工具,是一种提高开发效率的实用程序。在Java开发中,POJO和VO类经常被用于数据传输和持久化层,它们是业务逻辑和数据模型之间的...

    java 自动生成代码 entity,dao,service

    这个工具的使用流程可能是这样的:首先,开发者配置好数据库连接信息,然后选择需要生成代码的数据库表。工具会解析表结构,生成对应的Entity类、DAO接口及其实现,以及Service接口和实现类。生成的代码会遵循一定的...

    根据vo生成yapi文档:YapiFileGenerattor.zip

    它通常会包含一个Java类,该类负责解析VO(Value Object)类,从中提取方法、参数、返回类型等信息,并将这些信息转换为Yapi支持的JSON格式,以便导入到Yapi平台上生成文档。 首先,我们需要理解VO类。在软件开发中...

    Java一键生成代码到controller层【源码】

    3、可大大提高开发效率,数据表创建完以后,自动生成entity,mapper.xml,dao,service,controller,vo,dto相关代码。 4、本项目集成了spring,aop,mybatis plus,swagger2,异常处理,分页,freemarker等多种技术。 5、操作...

    六步骤轻松完成Hibernate中生成VO.xml

    Middlegen-Hibernate是一款强大的代码生成工具,主要用于基于数据库表结构自动生成Java实体类(Value Object, VO)以及对应的Hibernate配置文件。首先,我们需要访问其官方网站或其他可信源下载最新版本的Middegen-...

    mybatis自动生成mapping文件、vo和dao接口

    使用说明 1.打开命令窗口 ...java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite 回车 5.MyBatis Generator finished successfully. 表示成功生成mapping、model等文件

    根据数据表自动生成基础CRUD代码

    "CRUD代码生成器(Java)" 是一个强大的工具,旨在帮助开发者根据数据库中的数据表自动生成基础CRUD代码。这包括实体类(Entity)、数据访问对象(DAO)、数据传输对象(DTO)、值对象(VO)、查询对象(QO)、转换器...

    java web代码生成器

    java web开发后台代码自动生成,支持SSH和SSM2大框架,数据库支持MySQL和sqlserver,根据数据库自动生成entity,vo,service,impl,action或者controller,dao,mapper等类,包含常用的增删改查方法,集成了pageheper分页...

    java代码生成器

    Java代码生成器就是为了解决这个问题而设计的,它可以自动生成PO(Plain Old Java Object)、VO(Value Object)、DAO(Data Access Object)和Service层的Java类。 1. PO(Plain Old Java Object):PO对象通常...

    快速生成DTO

    "buildDTO"可能是生成DTO的命令或者工具名称,它可能包含了解析Excel模板并自动生成Java代码的功能。这样的工具通常会有一个用户友好的界面,允许开发者上传Excel文件,然后生成对应的源代码。 5. **Excel模板设计...

    快速代码生成器

    综上所述,快速代码生成器是JavaWeb开发中的实用工具,它能够基于Oracle数据库中的表信息,自动生成对应的VO和DAO类,大大简化了开发流程,提高了开发效率。对于大型项目或团队而言,这样的工具是不可或缺的,它可以...

    AutoCode代码生成器(JAVA版)

    您是不是因为java的开发和维护繁琐而烦恼,目前政府机关、企业大都要求用java来开发项目,本软件将彻底解决您的后顾之忧,通过本软件的自动生成功能,生成的java代码规范、全部开源,不存在用隐含的内容,全部代码...

    Java实现的一个idea插件,用于实体转Mysql、oracle建表语句和json请求体的工具

    Java实现的一个idea插件,用于实体转Mysql、oracle建表语句和json请求体的工具 使用 1、安装 下载发行版,打开idea:settings-&gt;plugins-&gt;intall plugin from disk 2、使用 打开实体类,右键选择ToMysql/ToOracle/To...

    java生成word,包括word表格,表格插入图片,jar包都在了

    - 运行Java程序,程序会根据代码逻辑生成Word文档,同时将图片插入到表格中。 这个项目提供了一个完整的解决方案,使得开发者无需深入了解Word文档的内部结构,就能方便地在Java中生成包含表格和图片的Word文档。...

Global site tag (gtag.js) - Google Analytics