ResultSet转成java类对象

在做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;

}

时间: 2024-07-30 12:33:48

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

如何把ResultSet转换成Java对象

有时候我们不想使用任何框架,但又需要用JDBC实现类似于iBATIS的orm映射功能,把一个ResultSet转换成我们的JavaBeans,我们可以模仿iBATIS的方式自己写一个ResultSetMapper实现类,利用反射原理把ResultSet转换成一个JavaBeans,下面是网上的一个开源实现,主要用到的是注解和反射机制,我们先看一下使用效果: package com.heaven.mapper; import java.sql.Connection; import java.sql

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

JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB. JAXB 可以实现Java对象与XML的相互转换,在JAXB中,将一个Java对象转换为XML的过程称之为Marshal,将XML转换为Java对象的过程称之为UnMarshal.我们可以通过在Java 类中标注注解的方式将一个Java对象绑定到一段X

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

Java是纯面向对象语言.类是其重要构成单位. 然后,在实际编程中,我们会自己定义一些类,如Point <span style="font-size:14px;">public class Point { public Point(){ Lat=0.0; Lng=0.0; } public double GetLat(){ return Lat; } public double GetLng(){ return Lng; } public void SetLat(doubl

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

github地址:https://github.com/lily1010/java_learn/tree/master/dog java中对象和类 java中万物皆对象,比如说动物,里面有猫,狗,鱼等等,他们都能跑,都能呼吸,总之他们有一些动物的共同特征,java中可以把他们归为一类.这就是java中的类:而猫,狗等,就是这个类中的一个具体的对象.猫,狗又有一些动作行为,就是方法.当你想调用那些动作行为的时候,不能直接在类中调用,因为不同的动物的行为不一样,你就必须new一个对象,来调用. ja

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

JDK Tools - xjc: 将 XML Schema 编译成 Java 类

xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命令参数 -d dir 在指定的目录生成 Java 类.指定的目录必须是已存在的,XJC 不会创建该目录.如果不指定该选项,则默认为当前目录. -p pkg 指定生成的 Java 类的包路径. -quiet 安静模式. -verbose 详情模式. -help 显示帮助信息. -version 显示版

java类对象

不错的文章 原文地址:(转载)java中的Class类与Class对象作者:albert1017 本文用作笔记之用,引用的网上资料: http://www.blogjava.net/formatmyself/articles/21291.html写得比较全面 http://www.open-open.com/lib/view/1328753336405例子比较好 http://zhidao.baidu.com/question/386608758.html解释得简洁清楚 Java程序在运行时,J

Java类对象和Json数据之间的转换

表字段过多,不想分别保存到数据中,使用频率低,所以考虑使用Jave类 -- Json之间的数据转换. 1.类转换Json,并保存到数据 Attribute.java 1 /** 2 * 属性数据结构 3 * 4 */ 5 public class Attribute { 6 7 private static final long serialVersionUID = -1L; 8 9 private Long attrId; 10 11 private List<AttributeValue>

java 类转换成byte[]与byte[]转换成java类的方法

首先对象要继承Serializable接口 private static java.lang.Object ByteToObject(byte[] bytes)...{ java.lang.Object obj; try { //bytearray to object ByteArrayInputStream bi = new ByteArrayInputStream(bytes); ObjectInputStream oi = new ObjectInputStream(bi); obj =