java resultset封装_自己做的一个简易的resultSet动态封装到javabean

最近翻了翻以前做的项目,发现了以前用jdbc做查询,感觉里面有好多将查询语句封装到javaBean里的代码,如

c5016b1d074944b50ee608104ef41e13.png

又或者

a59c3e6509cd6fc4054f939dcde0b475.png

这种代码很多,当时应该也用了很多时间在书写这些相同的代码,使代码看起来很冗余,于是自己无事就做了一个工具类,用来自动从resultSet获取数据并封装成javabean。

package javaUtil;

import java.awt.List;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import javax.naming.spi.DirStateFactory.Result;

import com.bean.Employee;

import com.bean.MeetingOrder;

import com.bean.MeetingRoom;

import com.dbConn.DbConn;

import com.mysql.jdbc.Connection;

import com.mysql.jdbc.ResultSetMetaData;

import com.mysql.jdbc.Statement;

/**

*

* @author zqy

* @version 1.0

*/

public class BeanUtil {

/**

*

* @param clazz 传入一个需要封装的类

* @param rs    需要进行封装的rs

* @return 一个封装好的VO(object)

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @throws InvocationTargetException

* @throws InstantiationException

*/

public Object autoBean(Class> clazz,ResultSet rs) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{

ArrayList setMethods = new ArrayList(); //用来存取set方法的集合

Object obj = clazz.newInstance(); // 实例化对象

try {

Method[] method = clazz.getMethods();//对象中的所有方法

for(Method m : method){

if(m.getName().substring(0, 3).contains("set"))//截取前面3个英文字符,看是否为set,如果是暂定为set方法

setMethods.add(m);//将set方法加入集合

}

ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();

int columCount = rsmd.getColumnCount();    //获取结果中列的个数

//循环,目的为将每一列的值用正确的set方法

for(int i = 1;i<=columCount;i++){

String columName = rsmd.getColumnName(i);//获取列名

String field = columName.replaceFirst(columName.substring(0, 1),

columName.substring(0, 1).toUpperCase());//因为set方法都是这种形式,setXxxx,因此将列名第一个字母大写

for(Method m1:setMethods){//遍历set方法集合

if(m1.getName().equals("set"+field)){//判断,如果通过判断既可知道该用对象的什么set方法

Class> para[] = m1.getParameterTypes();//获取方法参数类型,判断是否为为setBoolean

if(para[0].getName().equals("boolean")){

if(rs.getObject(columName).equals(0)){//因为mysql的boolean是以0,1存在,所以做以下判断

m1.invoke(obj,false);

}else{

m1.invoke(obj, true);

}

}else{//如果不是setBoolean这种,则执行一下

System.out.println(columName+":"+rs.getObject(columName));

m1.invoke(obj,rs.getObject(columName));//通过反射调用方法

}

}

}

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return obj;//返回对象

}

/*

*测试

*

*/

public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {

BeanUtil b = new BeanUtil();

Class a = MeetingRoom.class;

Connection conn = DbConn.getConnection();

String sql = "SELECT * FROM meetingRoom";

Statement stmt;

try {

stmt = (Statement) conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

rs.next();

MeetingRoom m = (MeetingRoom) b.autoBean(a, rs);

System.out.println(m.getMeetingRoomId());

System.out.println(m.getMeetingRoomId());

System.out.println(m.isStatus());

rs.next();

m = (MeetingRoom) b.autoBean(a, rs);

System.out.println(m.getMeetingRoomId());

System.out.println(m.getMeetingRoomId());

System.out.println(m.isStatus());

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

输出结果:

dfbe89f7b40d87229fb2c4d430dcc831.png

要求数据库的列名跟bean的变量名相同一一对应。

大概就是以上代码,可以实现基础功能,但是感觉写得还不大好,以后在改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值