JFinal2.2自动生成SQLServer2012其中的一些bug
2016-01-21 16:42
323 查看
好奇心驱使之下,研究了一下jfinal自动生成代码模块,由于本人现在的项目中用到了sqlserver2012,所以当我用官网下载下来的demo生成的时候发现对sqlserver2012,还是有一些bug的,现在贴出来,有什么不对的,请大神们轻虐!!
第一:我也是在查询资料之后( 原创地址:http://www.oschina.net/question/2276614_2147333),重写了一些代码,由于我只需要自己创建的表,所以添加用户名“dbo”,这样在循环遍历的时候,集合中就可以只放自己创建的表了
第二:我把下面的代码贴出来SqlserverMetaBuilder类
这里我重写了两个方法buildTableNames和buildColumnMetas
重写第一个方法是因为要获取某个用户下的表,这样不会把系统表也创建出来;
重写第二个方法是因为不知道为什么String sql = dialect.forTableBuilderDoBuild(tableMeta.name);这个sql出来之后,是这个样子的:select * from `表名` where 1 = 2,带了两个中文符号,导致后面查询异常,由于找不到原因,我就把中文符号替换了,sql = sql.replaceAll("`", "");以解燃眉之急,
最后,大神们看见之后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!
第一:我也是在查询资料之后( 原创地址:http://www.oschina.net/question/2276614_2147333),重写了一些代码,由于我只需要自己创建的表,所以添加用户名“dbo”,这样在循环遍历的时候,集合中就可以只放自己创建的表了
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和buildColumnMetas
重写第一个方法是因为要获取某个用户下的表,这样不会把系统表也创建出来;
重写第二个方法是因为不知道为什么String sql = dialect.forTableBuilderDoBuild(tableMeta.name);这个sql出来之后,是这个样子的:select * from `表名` where 1 = 2,带了两个中文符号,导致后面查询异常,由于找不到原因,我就把中文符号替换了,sql = sql.replaceAll("`", "");以解燃眉之急,
最后,大神们看见之后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!
相关文章推荐
- Oracle-本地连接没问题,远程连接有问题解决方案
- SQLite学习整理
- 再谈mysql repeatable事务级别适用场景与SQL Server的snapshot隔离级别
- MongoDB去除_class属性
- centos6 Linux安装redis 2.6.14
- 写MySQL存储过程实现动态执行SQL
- You execute the following command to change the status of the SALES tablespace: SQL> ALTER TABLESPAC
- mysql 数据库优化 一
- oracle11g利用logminer查看归档信息
- c# 备份数据库恢复数据库
- Windows下安装MongoDB心得与攻略
- iOS,数据库的使用(FMDB库的使用和配置)
- plsql导入导出数据库
- mongodb中投票节点作用
- windows环境下安装及使用redis
- mongodb
- common-dbcp2数据库连接池参数说明
- Oracle安装
- SQL Server中的事务与锁
- Redis 有序集合(sorted set)