介紹 可用於獲取關於 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;
}
}