Oracle 数据库脚本解析生成相应的bean
2010-10-28 13:13
501 查看
最近工作遇到一个问题
用power design 生成的oracle sql脚本中,有几张表字段特别多,其中有一张表字段高达一百多个,平时开发需求中,我们一般都创建一个与数据库字段相对应的java bean对象,对于字段特别多的表,如果手工去建这样一个对象的话,工作量很大,很枯燥,浪费时间.
为了解决一个问题,我写了一段代码去解析oracle sql生成java bean.代码如下:
解析过程中用到的模板文件ClassTpl.xdt如下
最后,我们把代码拷贝到eclipse下,生成getter,setter就可以了,当然代码很多地方还有待改进
用power design 生成的oracle sql脚本中,有几张表字段特别多,其中有一张表字段高达一百多个,平时开发需求中,我们一般都创建一个与数据库字段相对应的java bean对象,对于字段特别多的表,如果手工去建这样一个对象的话,工作量很大,很枯燥,浪费时间.
为了解决一个问题,我写了一段代码去解析oracle sql生成java bean.代码如下:
package util; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang.WordUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SqlScriptParser { private static Log log = LogFactory.getLog(SqlScriptParser.class); private static final String CREATE_TABLE_EXPRESSSION= ".*create//s+table//s+.*"; private static final String END_TABLE_EXPRESSSION= ".*//);//s*"; private static final String CLASS_NAME= "@class_name@"; private static final String FILED_LIST= "@filed_list@"; private static final String FIELD_TYPE = "@field_type@"; private static final String FIELD_NAME = "@file_name@"; private static final String FIELD_TEMPLATE = "private @field_type@ @file_name@;"; @SuppressWarnings("unchecked") public static void parse(String filename,String output){ File file = new File(filename); try { List<String> list = FileUtils.readLines(file, "utf-8"); boolean active = false; String template = getClassTpl(); StringBuilder filedbuilder = null; String tablename = null; for(String line : list){ if(line.contains("constraint")) continue; line = StringUtils.strip(line); String[] fieldProperty = line.split("//s+"); if(Pattern.matches(CREATE_TABLE_EXPRESSSION, line)){ active = true; filedbuilder = new StringBuilder(); tablename = line.replaceAll(".*create//s+table//s+", ""); tablename = StringUtils.strip(tablename); log.info(tablename); tablename = tablename.replace("T_LOT_", "");//去掉前缀 tablename = tablename.toLowerCase(); tablename = WordUtils.capitalize(tablename ,new char[]{'_'});//首字线大写 template = getClassTpl().replaceAll(CLASS_NAME, tablename); } else if(active && fieldProperty.length >= 2){ String fieldName= fieldProperty[0].toLowerCase(); String fieldType = fieldProperty[1].toLowerCase(); if(fieldType.matches(".*number//(//d+,//d+//).*")){ fieldType = "double"; }else if(fieldType.matches(".*number//(//d//).*")){ fieldType = "int"; }else if(fieldType.matches(".*number//(//d{2,}//).*")){ fieldType = "long"; }else if(fieldType.matches(".*varchar.*") || fieldType.matches(".*char.*")){ fieldType = "String"; }else if(fieldType.matches(".*date.*")){ fieldType = "Date"; } filedbuilder.append(FIELD_TEMPLATE.replaceAll(FIELD_TYPE, fieldType).replaceAll(FIELD_NAME, fieldName)); filedbuilder.append(SystemUtils.LINE_SEPARATOR); } else if(active && Pattern.matches(END_TABLE_EXPRESSSION, line)){ log.info(line); active = false; File outdir = new File(output); if(!outdir.exists()){ outdir.mkdirs(); } template = template.replaceAll(FILED_LIST, filedbuilder.toString()); File outfile = new File(output+File.separator+tablename+".java"); FileUtils.writeStringToFile(outfile, template,"utf-8"); } } } catch (IOException e) { log.error(e.getMessage()); } } public static void main(String[] args){ parse("d://report//report.sql","d://report//bean"); } private static String getClassTpl(){ InputStream in = SqlScriptParser.class.getClassLoader().getResourceAsStream("util/ClassTpl.xdt"); String template = null; try { template = IOUtils.toString(in); } catch (IOException e) { log.error(e.getMessage()); }finally{ IOUtils.closeQuietly(in); } return template; } }
解析过程中用到的模板文件ClassTpl.xdt如下
package com.joyveb.lottery.domain; import java.util.*; public class @class_name@ { @filed_list@ }
最后,我们把代码拷贝到eclipse下,生成getter,setter就可以了,当然代码很多地方还有待改进
相关文章推荐
- Oracle工具类-生成数据库现有Job的创建脚本
- 按Sybase的PowerDesigner工具设计的数据库模型 ---&gt; 解析生成能兼容多种数据库的相应的C#底层代码
- powerdesigner中去掉Oracle生成的SQL创建语句中的双引号后再次生成sql的脚本导入数据库中产生的异常问题
- ORACLE同步数据库 之外键生成脚本
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- FineUI之使用SQL脚本从数据库表中生成相应的输入控件
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- 利用Excel的vba脚本根据数据库表结构自动生成java的action,bean,dao,mode,service,xml,sql,jsp等
- Oracle提取现有数据库表空间、角色、用户信息,并生成脚本
- 生成基于Oracle的JBPM数据库脚本
- 按Sybase的PowerDesigner工具设计的数据库模型 ---> 解析生成能兼容多种数据库的相应的C#底层代码
- 由pdm生成建表脚本时,字段超过15字符就发生错误(oracle)
- oracle命令行创建数据库的示例脚本
- powerdesigner12生成的oracle脚本的带引号问题的解决
- 数据库分页大全(oracle利用解析函数row_number高效分页)
- sql2008生成数据库脚本到sql2005
- Oracle 10G简单制作自启动关闭数据库脚本的方法
- 数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库