freemarker生成静态页面 Spring3 Mybatis3 freemarker 自动生成对应表
Spring3 Mybatis3 freemarker 自动生成对应表
自己利用spring mybatis 进行开发时 前期花费了大量的时间去写对应的model mapper service文件 并想到用freemarker来动态生成对应的JAVA文件 开发思路 其实就是将数据库中的表取出来 表名作为类名 并把对应的列名取出来 作为字段名称 然后通过 freemarker定制的模版去生成相关的文件即可 我这里只举例说明如何生成对应的model文件 其它的可以直接COPY改改就成 示例代码如下 首先定义一个对象SqlColumnData包含两个属性columnName(列名称) columnType(列类型) 具体定义如下 : package study job domain; /** * SqlColumnData java Create on 上午 : : * * * Copyright (c) by MTA * * @author lmeteor * @Email * @description * @version */ public class SqlColumnData { private String columnName; private String columnType; public String getColumnName() { return columnName; } public void setColumnName(String columnName) { lumnName = columnName; } public String getColumnType() { return columnType; } public void setColumnType(String columnType) { lumnType = columnType; } }
下面三个方法作用如下 //用来获取指定表的所有列名及类型 public List getColumnDatas(String tableName)//将列名生成对应的field 和 methodpublic String getBeanField(String tableName) throws SQLException//将数据库类型转换成对应的JAVA类型publicString getType(String type) /** * 获取指定表的所有列名 * * @param tableName * @return * @throws SQLException */ public List getColumnDatas(String tableName) throws SQLException { String sqlColumns = SELECT COLUMN_NAME DATA_TYPE FROM inlumns WHERE table_name = + tableName + order by ordinal_position ; Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; List columnList = new ArrayList() try { conn = sqlDialect getConn() pst = conn prepareStatement(sqlColumns) rs = pst executeQuery() while (rs next()) { String name = rs getString( ) String type = rs getString( ) type = this getType(type) SqlColumnData cd = new SqlColumnData() cd setColumnName(name toLowerCase()) cd setColumnType(type) columnList add(cd) } } catch ( Exception e ) { e printStackTrace() } finally { try { if (conn != null) conn close() if (pst != null) pst close() if (rs != null) rs close() } catch ( SQLException e ) { e printStackTrace() } } return columnList; } /** * 将列名生成对应的field 和 method * * @param tableName * @return * @throws SQLException */ public String getBeanField(String tableName) throws SQLException { List dataList = getColumnDatas(tableName) StringBuffer str = new StringBuffer() StringBuffer getset = new StringBuffer() for (SqlColumnData d : dataList) { String name = d getColumnName() toLowerCase() String type = d getColumnType() String maxChar = name substring( ) toUpperCase() str append( rt ) append( private ) append(type + ) append( name) append( ;n ) String method = maxChar + name substring( name length()) getset append( rt ) append( public ) append(type + ) append( get + method + ()nt{n ) getset append( tt ) append( return this ) append(name) append( ;nt}n ) getset append( rt ) append( public void ) append( set + method + ( + type + + name + )nt{n ) getset append( tt ) append( this + name + = ) append(name) append( ;nt}n ) } argv = str toString() method = getset toString() return argv + method; } private String argv; private String method; /**
* 将数据库类型转换成对应的JAVA类型 * * @param type * @return */ public String getType(String type) { type = type toLowerCase() if ( char equals(type) || varchar equals(type) || nvarchar equals(type)) { return String ; } else if ( int equals(type)) { return Integer ; } else if ( bigint equals(type)) { return Long ; } else if ( timestamp equals(type) || date equals(type) || datetime equals(type)) { return java sql Timestamp ; } else if ( decimal equals(type)) { return Double ; } else if ( image equals(type)) { return byte[] ; } else if ( smallint equals(type)) { return int ; } return null; } /** * 将表名转成class名称 * * @param tableName * @return */ public String getTableNameToClassName(String tableName) { String[] splits = tableName toLowerCase() split( _ ) if (splits length > ) { StringBuffer className = new StringBuffer() for (String split : splits) { String tempTableName = split substring( ) toUpperCase() + split substring( ) className append(tempTableName) } return className toString() } else { String className = splits[ ] substring( ) toUpperCase() + splits[ ] substring( ) return className; } } SQL方面就准备的差不多了 现在开始准备对应的模版文件 如下 我这里使用的freemarker package study job domain; import java io Serializable; /** * ${className?default( )} java Create on ${datetime?default( )} * * * Copyright (c) by MTA * * @author lmeteor * @Email * @description * @version */ @SuppressWarnings( serial ) public class ${className?default( )} implements Serializable { ${feilds?default( )} } 用freemarker通过模版创建文件 /** * 创建静态文件 * * @param templateFileName * 模板文件名 例如 /WEB INF/view/temp ftl * @param propMap * 用于处理模板的属性object映射 * @param FilePath * 要生成的静态文件的路径 例如 /WEB INF/view/ / / / * @param FileName * 要生成的文件名 例如 l * @param templateFilePath * 模版路径 */ @SuppressWarnings( { unchecked }) public static void createHtmlFile(String templateFileName Map propMap String FilePath String FileName String templateFilePath) { try { Template t = getFreemarkerCFG(templateFilePath) getTemplate( templateFileName) //createDirs(FilePath) File file = null; if(StringTools isEmpty(FileName))file = new File(FilePath) else file = new File(FilePath + / + FileName) if(!file exists())file createNewFile() else file delete() Writer out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file) UTF )) t process(propMap out) out flush() out close() ( 文件 +FilePath+ 生成成功 ) } catch ( IOException e ) { e printStackTrace() } catch ( TemplateException e ) { e printStackTrace() } } 现在该准备的都准备好了 准备开始实际调用如下 /** * 生成JAVAMODULE文件 * @param tableName */ public static void createJavaModuleFile(String tableName) { String className = sqlutil getTableNameToClassName(tableName) // 生成到指定的目录下 String modelPath = domain\ + className + java ; Map context = new HashMap() context put( className className) // context put( tableName tableName) context put( datetime DateTools getDateTools() format(new Date())) /****************************** 生成bean字段 *********************************/ try { context put( feilds sqlutil getBeanField(tableName)) // 生成bean ( 请稍侯 正在生成Bean属性及GET SET方法 ) } catch ( Exception e ) { e printStackTrace() } // 生成文件代码 / CreateHtml createHtmlFile( TempBean ftl context PCKPATH+modelPath null TEMPLATE_FILEPATH) } 大致代码就是这么多 我在自己的项目中将这个功能界面化了 如下
lishixinzhi/Article/program/Java/hx/201311/26400