oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架
程序员文章站
2022-05-09 08:04:53
介绍 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用。 常用方法 int getColumnCount() 返回此 ResultSet 对象中的列数 String getColumnLabel(int co ......
介绍
可用于获取关于 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; } }