介绍
可用于获取关于 resultset 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用。
常用方法
- int getcolumncount()
返回此 resultset 对象中的列数 - string getcolumnlabel(int column)
获取用于打印输出和显示的指定列的建议标题。建议标题通常由 sql as 子句来指定。 -
string getcolumnname(int column)
获取指定列的名称statement stmt = conn.createstatement(); resultset rs = stmt.executequery("select ename,job,hiredate from employee"); resultsetmetadata resultsetmetadata = rs.getmetadata(); int colcount = resultsetmetadata.getcolumncount(); system.out.println("共有多少列:" + colcount); for (int i = 1; i <= colcount; i++) { //得到列名 string collabel = resultsetmetadata.getcolumnlabel(i); //通过列名得到该列的值 object value = rs.getobject(collabel); system.out.println("第" + i + "列的值:" + value); }
一个简单的框架例子代码
以下是一个类,主要是讲数据库返回的resultset转为对应的实体类,要注意,实体类的属性名要与数据库中的列名保持一致
可以直接拿来用
import java.lang.reflect.field;
import java.sql.resultset;
import java.sql.resultsetmetadata;
import java.sql.sqlexception;
import java.util.arraylist;
import java.util.hashmap;
import java.util.list;
import java.util.map;
/**
* 将查询结果集的数据组装成相应的pojo(简单的java对象)实体
*
* @author starsone
* @date create in 2019-4-27 0027 09:43:40
* @description
*/
public class resultsethandler<t> {
private list<t> beanlist;
private class<t> type;
private resultsetmetadata metadata;
private resultset resultset;
public resultsethandler(resultset resultset, class<t> type) {
//初始化beanlist
beanlist = new arraylist<>();
this.resultset = resultset;
try {
//获得数据集元数据
this.metadata = resultset.getmetadata();
} catch (sqlexception e) {
e.printstacktrace();
}
this.type = type;
handlerdata();
}
private void handlerdata() {
/*
思路分析:
1. 首先获得实体类中的所有属性:class.getdeclarefields(),存放在map<属性名,field> 中
2. 通过resultsetmetadata结果集元数据中的列名,将查询结果相应的列的值取出来resultset.getobject()
3. 将实体类的属性的名与结果集中相应的列进行反射赋值*/
field[] declaredfields = type.getdeclaredfields();
map<string, field> fieldmap = new hashmap<>();
for (field declaredfield : declaredfields) {
//map<"num",num属性对象>
fieldmap.put(declaredfield.getname().touppercase(), declaredfield);
}
try {
// while循环,遍历结果集resultset中的全部数据
while (resultset.next()) {
//将一条数据对应的实体类对象添加到list中
beanlist.add(gett(fieldmap));
}
} catch (sqlexception | illegalaccessexception | instantiationexception e) {
e.printstacktrace();
}
}
/**
* 获得每一条数据所对应的一个实体类对象
* @param fieldmap 存放属性field的map集合
* @return 一个实体类对象
* @throws instantiationexception
* @throws illegalaccessexception
* @throws sqlexception
*/
private t gett(map<string, field> fieldmap) throws instantiationexception, illegalaccessexception, sqlexception {
// 获得查询结果中的列数
int columncount = metadata.getcolumncount();
t target = type.newinstance();
// 一次循环代表一列
for (int i = 1; i <= columncount; i++) {
// 获得列的标题(列名)
string columnlabel = metadata.getcolumnlabel(i);
// 检查此列是否有对应的属性存在
if (fieldmap.containskey(columnlabel)) {
// 通过列名从map中获得对应的field对象
field field = fieldmap.get(columnlabel);
field.setaccessible(true);
//根据此属性的类型来调用相应的结果集方法,
// 如:string ename --> resultset.getstring()
object value = null;
class<?> fieldtype = field.gettype();
if (fieldtype == string.class) { //character
value = resultset.getstring(columnlabel);
} else if (fieldtype == byte.class || fieldtype == byte.type) { // int
value = resultset.getbyte(columnlabel);
} else if (fieldtype == short.class || fieldtype == short.type) { //
value = resultset.getshort(columnlabel);
} else if (fieldtype == integer.class || fieldtype == integer.type) { //
value = resultset.getint(columnlabel);
} else if (fieldtype == long.class || fieldtype == long.type) { //
value = resultset.getlong(columnlabel);
} else if (fieldtype == double.class || fieldtype == double.type) { //
value = resultset.getdouble(columnlabel);
} else if (fieldtype == float.class || fieldtype == float.type) { //
value = resultset.getfloat(columnlabel);
} else if (fieldtype == java.util.date.class || fieldtype == java.sql.date.class) { //
value = resultset.getdate(columnlabel);
} else if (fieldtype == java.sql.time.class) { //
value = resultset.gettime(columnlabel);
} else if (fieldtype == boolean.class || fieldtype == boolean.type) { //
value = resultset.getboolean(columnlabel);
}
field.set(target, value);
} // end if
} // end for
return target;
}
/**
* 获得list
*
* @return
*/
public list<t> getbeanlist() {
return beanlist;
}
public t getbean(){
beanlist!=null && beanlist.size()>0?beanlist.remove(0):null;
}
}