文档章节

让JFinal更好的支持oracle日期时间字段

hyanqing
 hyanqing
发布于 2013/08/12 22:59
字数 738
阅读 1617
收藏 7

在尝试用JFinal做一个小项目,测试的时候发现对oracle时间字段有些没做转换,现在修改源代码如下所述。

1、修改core下的TypeConverter类,这个类是对前台Model的类型自动转换,而对于oracle的Date和Timestamp来说,是符合clazz == java.sql.Timestamp.class,而当界面输入日期不带时间,会转换格式错误,采用类似clazz == java.sql.Date.class的判断来做统一修改(clazz == java.sql.Time.class也顺带修改)。


else if (clazz == java.sql.Time.class) {
//    result = java.sql.Time.valueOf(s);
      result = new java.sql.Time(new SimpleDateFormat(timePattern).parse(s).getTime());
 }
// mysql type: timestamp, datetime
else if (clazz == java.sql.Timestamp.class) {
//    result = java.sql.Timestamp.valueOf(s);
      if (s.length() >= timeStampLen) {
        	result = new java.sql.Timestamp(new SimpleDateFormat(timeStampPattern).parse(s).getTime());
      } else {
        	result = new java.sql.Timestamp(new SimpleDateFormat(datePattern).parse(s).getTime());
      }
}


2、修改com.jfinal.plugin.activerecord下的TableInfoBuilder类,扫描表结构类型,这里会把oracle的timestamp类型当作string处理,在124行附件新增一条else if语句。


else if (type == Types.TIMESTAMP) {
	result.addInfo(colName, java.sql.Timestamp.class);
}
3、DbKit类新增3个方法,用来替换rs.getObject()获取结果集的值,是从spring jdbc中摘取过来的,还是蛮好用的,后面用来替换Db类等用到获取结果集值。



@SuppressWarnings("rawtypes")
	public static Object getResultSetValue(ResultSet rs, int index, Class requiredType) throws SQLException {
		if (requiredType == null) {
			return getResultSetValue(rs, index);
		}

		Object value = null;
		boolean wasNullCheck = false;

		// Explicitly extract typed value, as far as possible.
		if (String.class.equals(requiredType)) {
			value = rs.getString(index);
		}
		else if (boolean.class.equals(requiredType) || Boolean.class.equals(requiredType)) {
			value = rs.getBoolean(index);
			wasNullCheck = true;
		}
		else if (byte.class.equals(requiredType) || Byte.class.equals(requiredType)) {
			value = rs.getByte(index);
			wasNullCheck = true;
		}
		else if (short.class.equals(requiredType) || Short.class.equals(requiredType)) {
			value = rs.getShort(index);
			wasNullCheck = true;
		}
		else if (int.class.equals(requiredType) || Integer.class.equals(requiredType)) {
			value = rs.getInt(index);
			wasNullCheck = true;
		}
		else if (long.class.equals(requiredType) || Long.class.equals(requiredType)) {
			value = rs.getLong(index);
			wasNullCheck = true;
		}
		else if (float.class.equals(requiredType) || Float.class.equals(requiredType)) {
			value = rs.getFloat(index);
			wasNullCheck = true;
		}
		else if (double.class.equals(requiredType) || Double.class.equals(requiredType) ||
				Number.class.equals(requiredType)) {
			value = rs.getDouble(index);
			wasNullCheck = true;
		}
		else if (byte[].class.equals(requiredType)) {
			value = rs.getBytes(index);
		}
		else if (java.sql.Date.class.equals(requiredType)) {
			value = rs.getDate(index);
		}
		else if (java.sql.Time.class.equals(requiredType)) {
			value = rs.getTime(index);
		}
		else if (java.sql.Timestamp.class.equals(requiredType) || java.util.Date.class.equals(requiredType)) {
			value = rs.getTimestamp(index);
		}
		else if (BigDecimal.class.equals(requiredType)) {
			value = rs.getBigDecimal(index);
		}
		else if (Blob.class.equals(requiredType)) {
			value = rs.getBlob(index);
		}
		else if (Clob.class.equals(requiredType)) {
			value = rs.getClob(index);
		}
		else {
			// Some unknown type desired -> rely on getObject.
			value = getResultSetValue(rs, index);
		}

		// Perform was-null check if demanded (for results that the
		// JDBC driver returns as primitives).
		if (wasNullCheck && value != null && rs.wasNull()) {
			value = null;
		}
		return value;
	}
public static Object getResultSetValue(ResultSet rs, int index) throws SQLException {
		Object obj = rs.getObject(index);
		String className = null;
		if (obj != null) {
			className = obj.getClass().getName();
		}
		if (obj instanceof Blob) {
			obj = rs.getBytes(index);
		}
		else if (obj instanceof Clob) {
			obj = rs.getString(index);
		}
		else if (className != null &&
				("oracle.sql.TIMESTAMP".equals(className) ||
				"oracle.sql.TIMESTAMPTZ".equals(className))) {
			obj = rs.getTimestamp(index);
		}
		else if (className != null && className.startsWith("oracle.sql.DATE")) {
			String metaDataClassName = rs.getMetaData().getColumnClassName(index);
			if ("java.sql.Timestamp".equals(metaDataClassName) ||
					"oracle.sql.TIMESTAMP".equals(metaDataClassName)) {
				obj = rs.getTimestamp(index);
			}
			else {
				obj = rs.getDate(index);
			}
		}
		else if (obj != null && obj instanceof java.sql.Date) {
			if ("java.sql.Timestamp".equals(rs.getMetaData().getColumnClassName(index))) {
				obj = rs.getTimestamp(index);
			}
		}
		return obj;
	}
public static String lookupColumnName(ResultSetMetaData resultSetMetaData, int columnIndex) throws SQLException {
		String name = resultSetMetaData.getColumnLabel(columnIndex);
		if (name == null || name.length() < 1) {
			name = resultSetMetaData.getColumnName(columnIndex);
		}
		return name;
	}
4、修改com.jfinal.plugin.activerecord下的ModelBuilder类,用上面3个方法来修改build方法,并注释掉buildLabelNamesAndTypes方法。



List<T> result = new ArrayList<T>();
		ResultSetMetaData rsmd = rs.getMetaData();
		int columnCount = rsmd.getColumnCount();
		while (rs.next()) {
			Model<?> ar = modelClass.newInstance();
			Map<String, Object> attrs = ar.getAttrs();
			for (int i=1; i<=columnCount; i++) {
				Object value = DbKit.getResultSetValue(rs, i);
				attrs.put(DbKit.lookupColumnName(rsmd, i), value);
			}
			result.add((T)ar);
		}
同样修改com.jfinal.plugin.activerecord下的RecordBuilder类



for (int i=1; i<=columnCount; i++) {
			Object value = DbKit.getResultSetValue(rs, i);
			columns.put(DbKit.lookupColumnName(rsmd, i), value);
		}
5、修改Db类中为rs.getObject,并不需要每个都替换



53行:temp[i] = DbKit.getResultSetValue(rs, i + 1);
60行:result.add(DbKit.getResultSetValue(rs, 1));


© 著作权归作者所有

共有 人打赏支持
hyanqing
粉丝 5
博文 4
码字总数 1344
作品 0
杭州
程序员
私信 提问
JFinal针对ORACLE的timestamp字段解决办法

JFinal是个比较不错的的框架,但JFinal起源时使用mysql数据库,因此在对数据库支持方面还没有达到完美。 本人使用JFinal有一段时间的,由于项目的数据库普遍采用oracle,在使用oracle过程中遇...

真的农夫三拳
2013/06/23
0
6
JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal
2018/04/28
15.6K
135
JFinal 2.1 最终版发布,用JFinal开发,就这么定了!

由于 jfinal 2.1 在不完全统计的情况下有超过60项的升级与改进,所以自发布这几天以来,立即收到了大量的使用反馈,为了使开发者尽可能快地用上反馈后的新版本,本次jfinal 2.1延迟了推送到m...

JFinal
2016/01/11
6.4K
62
oracle timestamp如何处理

@JFinal 你好,想跟你请教个问题: 我们项目中现在使用jfinal,数据库使用oracle!在oracle时间字段的时候返回数据怎么处理啊?

three333
2014/05/20
253
1
数据保存/更新前做的通用处理

@JFinal 以前做中大型项目,在设计表的时候会为每张表设计一些固定的字段,比如createtime、updatetime、creater、updater之类的,用来记录时间和操作人的字段,有的时候是拿来做数据权限,而...

TerryZ
2014/05/07
345
6

没有更多内容

加载失败,请刷新页面

加载更多

lua中.和:的区别

lua中.和:都可以用于方法的声明和调用。和table配合使用。 :和.最大的不同点,就是:会把调用者自身,传入到函数中。 如下代码: c = {a=1,b=2}function c:foo1()print(self.a,self.b)...

乐_然
14分钟前
0
0
CentOS7 NTP客户端和服务器安装和使用

本文测试环境如下: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@localhost ~]# [root@localhost ~]# yum install ntp#等待安装完成......

白豆腐徐长卿
24分钟前
6
0
Tensorflow源码解析3 -- TensorFlow核心对象 - Graph

1 Graph概述 计算图Graph是TensorFlow的核心对象,TensorFlow的运行流程基本都是围绕它进行的。包括图的构建、传递、剪枝、按worker分裂、按设备二次分裂、执行、注销等。因此理解计算图Gra...

阿里云官方博客
29分钟前
2
0
网站加载不了 图片

公司测试环境,某网站图片加载不了 nginx 配置 server { listen 80;listen 443 ssl;charset utf-8;root /var/www/html/ad-server; index index.html index.htm...

Linux_Anna
31分钟前
1
0
亿级曝光品牌视频的幕后设定

本文由云+社区发表 作者:腾讯ISUX 项目背景 2019年春节期间,QQ红包运营活动进行了全新改版,将卡券福利、现金奖励打包成福袋形式,并通过年俗小游戏及共享福袋的玩法吸引更多用户参与。在点...

腾讯云加社区
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部