將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例
首先說一下這個(gè)使用場景,我們?cè)谑褂胘dbc連接數(shù)據(jù)庫的時(shí)候,執(zhí)行查詢語句時(shí)候會(huì)得到一個(gè)結(jié)果集,如果想要再獲取這個(gè)結(jié)果集中的值,就需要我們將他轉(zhuǎn)換成一個(gè)對(duì)象,然后通過對(duì)象的get和set方法來獲取到數(shù)據(jù)庫中的值。
public class BaseDao <E> {
private Class<?> cls;
public BaseDao() {
//得到父類的泛型
Type sType=getClass().getGenericSuperclass();
//得到實(shí)際的類型參數(shù)數(shù)組
Type[] generics=((ParameterizedType) sType).getActualTypeArguments();
//得到第一個(gè)泛型的Class
cls=(Class<?>) (generics[0]);
}
/**
* 單表多條查詢,將查詢到的多條記錄傳入一個(gè)對(duì)象,然后再將這些存入一個(gè)集合中,返回這個(gè)集合
* @param sql 傳入對(duì)應(yīng)的sql查詢語句
* @param parameters 傳入對(duì)應(yīng)的占位符的值
* @return 返回查詢到的記錄轉(zhuǎn)化成的對(duì)象的集合
*/
//Object...parameters是sql語句中對(duì)應(yīng)的占位符的值,是一個(gè)不定長可變參數(shù),我們需要寫一個(gè)函數(shù)來獲取他
public List<E> list(String sql,Object...parameters) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
List<E> list = new ArrayList<>();
try {
conn = JdbcUtil.getConnection();
st = conn.prepareStatement(sql);
setParameters(st, parameters);
rs = st.executeQuery();
while(rs.next()) {
//將獲取到的結(jié)果集存入一個(gè)對(duì)象中,這個(gè)我們也單獨(dú)寫一個(gè)函數(shù)來實(shí)現(xiàn)
E obj = oneRowToObject(rs);
//然后將對(duì)象存入一個(gè)集合中返回
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeAll(rs, st, conn);
}
return list;
}
首先來寫一下獲取不定長可變參數(shù)的方法
/**
* 設(shè)置占位符
* @param st 預(yù)處理
* @param parameters 占位符數(shù)組
* @return 返回存儲(chǔ)占位符對(duì)應(yīng)的對(duì)象的數(shù)組
*/
private void setParameters(PreparedStatement st, Object[] parameters) {
//判斷是否有結(jié)果集,結(jié)果集中是否有記錄
if(parameters!=null&¶meters.length>0) {
for(int i=0;i<parameters.length;i++) {
try {
st.setObject(i+1,parameters[i] );
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后再把一個(gè)結(jié)果集轉(zhuǎn)化成一個(gè)對(duì)象的方法寫一下
* 把得到的一列數(shù)據(jù)存入到一個(gè)對(duì)象中
* @param rs
* @return
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SQLException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
@SuppressWarnings("unchecked")
private E oneRowToObject(ResultSet rs) throws InstantiationException, IllegalAccessException, SQLException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
E obj;
obj=(E) cls.newInstance();
//獲取結(jié)果集元數(shù)據(jù)(獲取此 ResultSet 對(duì)象的列的編號(hào)、類型和屬性。)
ResultSetMetaData rd=rs.getMetaData();
for (int i = 0; i < rd.getColumnCount(); i++) {
//獲取列名
String columnName=rd.getColumnLabel(i+1);
//組合方法名
String methodName="set"+columnName.substring(0, 1).toUpperCase()+columnName.substring(1);
//獲取列類型
int columnType=rd.getColumnType(i+1);
Method method=null;
switch(columnType) {
case java.sql.Types.VARCHAR:
case java.sql.Types.CHAR:
method=cls.getMethod(methodName, String.class);
if(method!=null) {
method.invoke(obj, rs.getString(columnName));
}
break;
case java.sql.Types.INTEGER:
case java.sql.Types.SMALLINT:
method=cls.getMethod(methodName, int.class);
if(method!=null) {
method.invoke(obj, rs.getInt(columnName));
}
break;
case java.sql.Types.BIGINT:
method=cls.getMethod(methodName, long.class);
if(method!=null) {
method.invoke(obj, rs.getLong(columnName));
}
break;
case java.sql.Types.DATE:
case java.sql.Types.TIMESTAMP:
try {
method=cls.getMethod(methodName, Date.class);
if(method!=null) {
method.invoke(obj, rs.getTimestamp(columnName));
}
} catch(Exception e) {
method=cls.getMethod(methodName, String.class);
if(method!=null) {
method.invoke(obj, rs.getString(columnName));
}
}
break;
case java.sql.Types.DECIMAL:
method=cls.getMethod(methodName, BigDecimal.class);
if(method!=null) {
method.invoke(obj, rs.getBigDecimal(columnName));
}
break;
case java.sql.Types.DOUBLE:
case java.sql.Types.NUMERIC:
method=cls.getMethod(methodName, double.class);
if(method!=null) {
method.invoke(obj, rs.getDouble(columnName));
}
break;
case java.sql.Types.BIT:
method=cls.getMethod(methodName, boolean.class);
if(method!=null) {
method.invoke(obj, rs.getBoolean(columnName));
}
break;
default:
break;
}
}
return obj;
}
使用的話就是寫一個(gè)實(shí)體類Dao繼承BaseDao
public class UserDao extends BaseDao <User>{
}
測試一下:
public class test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, SQLException, IntrospectionException {
UserDao userdao = new UserDao();
List<User> list=userdao.list("select * from user");
System.out.println("uid\t"+"uname\t"+"state\t"+"flag");
for (User user : list) {
System.out.println(user.getUid()+"\t"+user.getUname()+"\t"+user.getState()+"\t"+user.getFlag());
}
}
}

以上這篇將ResultSet中得到的一行或多行結(jié)果集封裝成對(duì)象的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何通過SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼簡潔易懂,具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-06-06
spring無法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
在Mac OS上安裝Java以及配置環(huán)境變量的基本方法
這篇文章主要介紹了在Mac OS上安裝Java以及配置環(huán)境變量的基本方法,包括查看所安裝Java版本的方法,需要的朋友可以參考下2015-10-10
springboot多數(shù)據(jù)源配置及切換的示例代碼詳解
這篇文章主要介紹了springboot多數(shù)據(jù)源配置及切換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
最優(yōu)雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企業(yè)級(jí)應(yīng)用(附源碼)
這篇文章主要介紹了最優(yōu)雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企業(yè)級(jí)應(yīng)用(附源碼),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
elasticsearch?java客戶端action的實(shí)現(xiàn)簡單分析
這篇文章主要為大家介紹了elasticsearch?java客戶端action的實(shí)現(xiàn)簡單分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

