在做web开发时遇到一个事情:

需要从mysql数据表中查询数据并遍历查询结果

这样最简单的方式是:查询到结果根据表中字段列表的顺序来一个个获取字段,但这样需要记住字段的顺序,操作起来不是那么方便。因此便想可不可以把查询结果

ResultSet转化成java的实例对象,然后利用类对象的get方法,这样会方便清晰很多。

查了下,有很多可以参考,于是参考着有了自己的代码,如下:

1.mapper函数:

package com.alibaba.search.offline.oddiff.service;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jcraft.jsch.Logger;

//import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement.Column;

public class OddiffResultSetMapper<T> {
protected static Log logger = LogFactory.getLog(OddiffResultSetMapper.class);
@SuppressWarnings("unchecked")
public List<T> mapRersultSetToObject(ResultSet rs, Class outputClass) {
List<T> outputList = null;
try {
// make sure resultset is not null
if (rs != null) {
logger.info("rs:"+rs);
// check if outputClass has 'Entity' annotation
if (outputClass.isAnnotationPresent(Entity.class)) {
// get the resultset metadata
ResultSetMetaData rsmd = rs.getMetaData();
// get all the attributes of outputClass
Field[] fields = outputClass.getDeclaredFields();
while (rs.next()) {
T bean = (T) outputClass.newInstance();
for (int _iterator = 0; _iterator < rsmd.getColumnCount(); _iterator++) {
// getting the SQL column name
String columnName = rsmd.getColumnName(_iterator + 1);

// reading the value of the SQL column
Object columnValue = rs.getObject(_iterator + 1);
logger.info("columnName:"+columnName+",value:"+columnValue);
for (Field field : fields) {
if (field.isAnnotationPresent(Column.class)) {
Column column = field.getAnnotation(Column.class);
if (column.name().equalsIgnoreCase(columnName) && columnValue != null) {
BeanUtils.setProperty(bean, field.getName(), columnValue);
break;
}
}
}
}
if (outputList == null) {
outputList = new ArrayList<T>();
}
outputList.add(bean);
}

} else {
// throw some error
}
} else {
logger.info("rs is null");
return null;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return outputList;
}
}

2.类对象的声明:

package com.alibaba.search.offline.oddiff.service;

import java.util.Date;

import javax.persistence.Column;

import javax.persistence.Entity;

@Entity

public class OddiffEntity {

@Column(name="id")

private Integer Id;

@Column(name="user_name")

private String userName;

@Column(name="app_name")

private String appName;

@Column(name="online_version")

private String onlineVersion;

@Column(name="oa_version")

private String oaVersion;

@Column(name="data_name")

private String dataName;

@Column(name="start_time")

private String startTime;

@Column(name="end_time")

private String endTime;

@Column(name="commit_time")

private String commitTime;

@Column(name="duration_time")

private String durationTime;

@Column(name="status")

private String status;

@Column(name="log_file")

private String logFile;

public void setId(Integer id) {

this.Id = id;

}

public Integer getId() {

return Id;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserName() {

return userName;

}

public void setAppName(String appName) {

this.appName = appName;

}

public String getAppName() {

return appName;

}

public void setOnlineVersion(String onlineVersion) {

this.onlineVersion = onlineVersion;

}

public String getOnlineVersion() {

return onlineVersion;

}

public void setOaVersion(String oaVersion) {

this.oaVersion = oaVersion;

}

public String getOaVersion() {

return this.oaVersion;

}

public void setDataName(String dataName) {

this.dataName = dataName;

}

public String getDataName() {

return dataName;

}

public void setStartTime(String startTime) {

this.startTime = startTime;

}

public String getStartTime() {

return startTime;

}

public void setEndTime(String endTime) {

this.endTime = endTime;

}

public String getEndTime() {

return endTime;

}

public void setCommitTime(String commitTime) {

this.commitTime = commitTime;

}

public String getCommitTime() {

return commitTime;

}

public void setDurationTime(String durationTime) {

this.durationTime = durationTime;

}

public String getDurationTime() {

return durationTime;

}

public void setStatus(String status) {

this.status = status;

}

public String getStatus() {

return status;

}

public void setLogFile(String logFile) {

this.logFile = logFile;

}

public String getLogFile() {

return logFile;

}

@Override

public String toString() {

return  "id: " + Id + "\n" +

"user_name: " + userName + "\n"+

"app_name: " + appName + "\n" ;

}

}

3.真的转化:

public static List<OddiffEntity> Execute_select(Connection conn, String sql) {

if (conn==null)

conn = getConn();//此处为通过自己写的方法getConn()获得连接

OddiffResultSetMapper<OddiffEntity> resultSetMapper = new OddiffResultSetMapper<OddiffEntity>();

try {

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

logger.info("---sql:"+sql);

logger.info("select result:"+rs.getFetchSize());

List<OddiffEntity> pojoList = resultSetMapper.mapRersultSetToObject(rs, OddiffEntity.class);

if (pojoList!=null){

for (OddiffEntity job:pojoList){

logger.info("job:"+job.toString());

}

}

return pojoList;

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

ResultSet转成java类对象的更多相关文章

  1. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  2. 规则引擎集成接口(九)Java类对象

    Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...

  3. Gson把json串转换成java实体对象

    Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...

  4. 转: JaxbContext生成xml文件或java类对象转化注解

    JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版 ...

  5. 存在继承关系的Java类对象之间的类型转换(一)

      类似于基本数据类型之间的强制类型转换. 存在继承关系的父类对象和子类对象之间也可以 在一定条件之下相互转换. 这种转换需要遵守以下原则: 1.子类对象可以被视为是其父类的一个对象2.父类对象不能被 ...

  6. 将封装了envi功能的IDL类导出成java类,方便java调用

    目的:     用IDL将ENVI的功能封装成为IDL的类,并使用IDL的对象导出功能把这些功能类导出为java类,方便java调用.(本来想直接通过GP工具调用的,但是没有授权文件)   操作步骤: ...

  7. java类 对象 和构造方法

    github地址:https://github.com/lily1010/java_learn/tree/master/dog java中对象和类 java中万物皆对象,比如说动物,里面有猫,狗,鱼等 ...

  8. Java类对象数组声明和初始化

    Java是纯面向对象语言.类是其重要构成单位. 然后,在实际编程中,我们会自己定义一些类,如Point <span style="font-size:14px;">pu ...

  9. [转]java类 对象 和构造方法

    github地址:https://github.com/lily1010/java_learn/tree/master/dog java中对象和类 java中万物皆对象,比如说动物,里面有猫,狗,鱼等 ...

随机推荐

  1. 【转】linux中waitpid及wait的用法

    原文网址:http://www.2cto.com/os/201203/124851.html wait(等待子进程中断或结束) 表头文件      #include<sys/types.h> ...

  2. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  3. hdu 2457(ac自动机+dp)

    题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...

  4. C# 总结

    转自原文 C# 总结 1.类型是隐式内部的.(类) 2.类型成员是隐式私有的.(方法) 3.常量定义:const 是隐式static的,必须在定义时设置初始值. 4.只读字段:readonly 可以在 ...

  5. VelocityTracker简单用法

    VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出 当前的速度,这样的用法在androi ...

  6. ASP.NET常用加密解密方法

    ASP.NET常用加密解密方法 一.MD5加密解密 1.加密 C# 代码           public static string ToMd5(string clearString)        ...

  7. 关于jQuery中,animate、slide、fade等动画的连续触发、滞后反复执行的bug的个人解决办法

    照例,现在开头讲个这个问题发生的背景吧: 因为最近要做个操作选项的呼出,然后就想到了用默认隐藏,鼠标划过的时候显示的方法. 刚开始打算添加一个class="active",直接触发 ...

  8. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  9. Spring学习笔记(二)Spring基础AOP、IOC

    Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...

  10. [转]python起步之卡尔曼滤波

    原文地址:http://www.niwozhi.net/demo_c65_i50946.html 关于卡尔曼滤波的理论这里不打算讲了,就是那个5个基本的公式,这里直接给出公式: 公式1:X(k|k-1 ...