好奇心驱使之下,研究了一下jfinal自动生成代码模块,因为本人如今的项目中用到了sqlserver2012,因此当我用官网下载下来的demo生成的时候发现对sqlserver2012,仍是有一些bug的,如今贴出来,有什么不对的,请大神们轻虐!!java
第一:我也是在查询资料以后( 原创地址:http://www.oschina.net/question/2276614_2147333),重写了一些代码,因为我只须要本身建立的表,因此添加用户名“dbo”,这样在循环遍历的时候,集合中就能够只放本身建立的表了
sql
gernerator.setMetaBuilder(new SqlserverMetaBuilder(getDataSource(),true,"dbo"));
第二:我把下面的代码贴出来SqlserverMetaBuilder类数据库
package com.cpa.generator; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.List; import javax.sql.DataSource; import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.generator.ColumnMeta; import com.jfinal.plugin.activerecord.generator.MetaBuilder; import com.jfinal.plugin.activerecord.generator.TableMeta; public class SqlserverMetaBuilder extends MetaBuilder { // 是否将不带前缀的表,加入的生成队列 默认true,就是全部表都会自动生成 private boolean flag = true; //数据库用户名 private String user = ""; public SqlserverMetaBuilder(DataSource dataSource) { super(dataSource); // TODO Auto-generated constructor stub } public SqlserverMetaBuilder(DataSource dataSource, boolean flag,String user) { super(dataSource); this.flag = flag; this.user = user; } protected void buildTableNames(List<TableMeta> ret) throws SQLException { ResultSet rs = dbMeta.getTables(conn.getCatalog(), null, null, new String[] { "TABLE"}); while (rs.next()) { String tableName = ""; String tableSchem = rs.getString("TABLE_SCHEM"); if (user.equalsIgnoreCase(tableSchem)) { tableName = rs.getString("TABLE_NAME"); } if (excludedTables.contains(tableName)) { System.out.println("Skip excluded table :" + tableName); } else { TableMeta tableMeta = new TableMeta(); tableMeta.name = tableName; tableMeta.remarks = rs.getString("REMARKS"); boolean tempFlag = false; // 移除表名前缀仅用于生成 modelName、baseModelName。tableMeta.name 表名自身不受影响 if (removedTableNamePrefixes != null) { for (String prefix : removedTableNamePrefixes) { if (tableName.startsWith(prefix)) { tableName = tableName.replaceFirst(prefix, ""); tempFlag = true; break; } } } if ((flag || tempFlag)&&!tableName.isEmpty()) { tableMeta.modelName = StrKit.firstCharToUpperCase(StrKit .toCamelCase(tableName)); tableMeta.baseModelName = "Base" + tableMeta.modelName; ret.add(tableMeta); } } } rs.close(); } protected void buildColumnMetas(TableMeta tableMeta) throws SQLException { String sql = dialect.forTableBuilderDoBuild(tableMeta.name); sql = sql.replaceAll("`", ""); Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); for (int i=1; i<=rsmd.getColumnCount(); i++) { ColumnMeta cm = new ColumnMeta(); cm.name = rsmd.getColumnName(i); String colClassName = rsmd.getColumnClassName(i); String typeStr = typeMapping.getType(colClassName); if (typeStr != null) { cm.javaType = typeStr; } else { int type = rsmd.getColumnType(i); if (type == Types.BINARY || type == Types.VARBINARY || type == Types.BLOB) { cm.javaType = "byte[]"; } else if (type == Types.CLOB || type == Types.NCLOB) { cm.javaType = "java.lang.String"; } else { cm.javaType = "java.lang.String"; } } // 构造字段对应的属性名 attrName cm.attrName = buildAttrName(cm.name); tableMeta.columnMetas.add(cm); } rs.close(); stm.close(); } }
这里我重写了两个方法buildTableNames和buildColumnMetasapp
重写第一个方法是由于要获取某个用户下的表,这样不会把系统表也建立出来;sqlserver
重写第二个方法是由于不知道为何String sql = dialect.forTableBuilderDoBuild(tableMeta.name);这个sql出来以后,是这个样子的:select * from `表名` where 1 = 2,带了两个中文符号,致使后面查询异常,因为找不到缘由,我就把中文符号替换了,sql = sql.replaceAll("`", "");以解燃眉之急,ui
最后,大神们看见以后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!
this