ResultSet数据自动绑定到JavaBean中
来源:互联网 发布:c语言入门经典txt 编辑:程序博客网 时间:2024/04/29 09:36
由于需要用jdbc写点程序,不使用Hibernate , mybatis等框架,在设置结果集到bean时相当麻烦,所以写了一个专门完成此功能的类
package com.ehl.dc.authorization.util;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;/** * @说明:利用反射机制从ResultSet自动绑定到JavaBean;根据记录集自动调用javaBean里边的对应方法。 * * @param <T> */public class SetBean<T> {/** * @param clazz * 所要封装的javaBean * @param rs * 记录集 * @return ArrayList 数组里边装有 多个javaBean * @throws Exception */public List<T> getList(Class<T> clazz, ResultSet rs) {Field field = null;List<T> lists = new ArrayList<T>();try {// 取得ResultSet列名ResultSetMetaData rsmd = rs.getMetaData();// 获取记录集中的列数int counts = rsmd.getColumnCount();// 定义counts个String 变量String[] columnNames = new String[counts];// 给每个变量赋值(字段名称全部转换成小写)for (int i = 0; i < counts; i++) {columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();}// 变量ResultSetwhile (rs.next()) {T t = clazz.newInstance();// 反射, 从ResultSet绑定到JavaBeanfor (int i = 0; i < counts; i++) {// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型field = clazz.getDeclaredField(columnNames[i]);// 这里是获取bean属性的类型Class<?> beanType = field.getType();// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了Object value = rs.getObject(columnNames[i]);if (value != null) {// 这里是获取数据库字段的类型Class<?> dbType = value.getClass();// 处理日期类型不匹配问题if (dbType == java.sql.Timestamp.class&& beanType == java.util.Date.class) {// value = new// java.util.Date(rs.getTimestamp(columnNames[i]).getTime());value = new java.util.Date(((java.sql.Timestamp) value).getTime());}// 处理double类型不匹配问题if (dbType == java.math.BigDecimal.class&& beanType == double.class) {// value = rs.getDouble(columnNames[i]);value = new Double(value.toString());}// 处理int类型不匹配问题if (dbType == java.math.BigDecimal.class&& beanType == int.class) {// value = rs.getInt(columnNames[i]);value = new Integer(value.toString());}}String setMethodName = "set"+ firstUpperCase(columnNames[i]);// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;Method m = t.getClass().getMethod(setMethodName, beanType);// 第二个参数是传给set方法数据;如果是get方法可以不写m.invoke(t, value);}lists.add(t);}} catch (Exception e) {e.printStackTrace();return null;}return lists;}/** * @param clazz * bean类 * @param rs * 结果集 (只有封装第一条结果) * @return 封装了查询结果的bean对象 */public T getObj(Class<T> clazz, ResultSet rs) {Field field = null;T obj = null;try {// 取得ResultSet列名ResultSetMetaData rsmd = rs.getMetaData();// 获取记录集中的列数int counts = rsmd.getColumnCount();// 定义counts个String 变量String[] columnNames = new String[counts];// 给每个变量赋值(字段名称全部转换成小写)for (int i = 0; i < counts; i++) {columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();}// 变量ResultSetif (rs.next()) {T t = clazz.newInstance();// 反射, 从ResultSet绑定到JavaBeanfor (int i = 0; i < counts; i++) {try{// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型field = clazz.getDeclaredField(columnNames[i]);}catch(Exception ex){ex.printStackTrace();continue;}// 这里是获取bean属性的类型Class<?> beanType = field.getType();// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了Object value = rs.getObject(columnNames[i]);if (value != null) {// 这里是获取数据库字段的类型Class<?> dbType = value.getClass();// 处理日期类型不匹配问题if (dbType == java.sql.Timestamp.class&& beanType == java.util.Date.class) {// value = new// java.util.Date(rs.getTimestamp(columnNames[i]).getTime());value = new java.util.Date(((java.sql.Timestamp) value).getTime());}// 处理double类型不匹配问题if (dbType == java.math.BigDecimal.class&& beanType == double.class) {// value = rs.getDouble(columnNames[i]);value = new Double(value.toString());}// 处理int类型不匹配问题if (dbType == java.math.BigDecimal.class&& beanType == int.class) {// value = rs.getInt(columnNames[i]);value = new Integer(value.toString());}}String setMethodName = "set"+ firstUpperCase(columnNames[i]);// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;Method m = t.getClass().getMethod(setMethodName, beanType);// 第二个参数是传给set方法数据;如果是get方法可以不写m.invoke(t, value);}obj = t;}} catch (Exception e) {e.printStackTrace();return null;}return obj;}// 首写字母变大写public static String firstUpperCase(String old) {return old.substring(0, 1).toUpperCase() + old.substring(1);}}
- ResultSet数据自动绑定到JavaBean中
- 基于JDBC 的数据库返回数据Resultset 数据绑定到Javabean
- 自动表单数据封装到javaBean中
- 表单数据自动封装到javaBean中
- ResultSet自动封装数据到实体对象
- 用BeanUtils类自动封装表单数据到javabean
- 用BeanUtils类自动封装表单数据到javabean
- js 将json数据自动绑定到 html table 表格中
- 浅谈JAVA的反射,从ResultSet到POJO(JavaBean)
- 利用Map中封装数据到javabean中
- java中ResultSet遍历数据
- 绑定数据到wpf中的datagrid中
- C# 中绑定数据到datagridviewcomboboxcolumn
- DAO层通用实现,结果集ResultSet转化为javaBean的反射实现,自动生成javaBean
- 把表单的数据封装到JavaBean中
- DataGridView中的当前行数据怎样自动绑定到TextBox
- ResultSet 封装成JavaBean
- C#中,datagridview与sql数据源绑定后,通过控件更改数据如何自动回写更新到数据源
- 进程,线程,线程同步
- Mac OS X 内核Rootkit开发指南
- Android开发--浅谈ExpandableListActivity
- IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)
- WPF:菜单
- ResultSet数据自动绑定到JavaBean中
- Android合并音频文件
- 分治法---话说递归与汉诺塔
- 正则表达式:ios 手机号车牌号 正则验证
- 万事开头难--开通博客记
- poj-3267-The Cow Lexicon-dp
- 看看我在维护什么代码吧,吐槽一下
- 关于javaScript
- Axure使用心得分享