`
hfkiss44
  • 浏览: 48640 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

针对jdbc编程 如何将resultset的信息自动封装到pojo里面

阅读更多
不多说了  直接上代码
public static List resultSetToList(ResultSet rs) throws java.sql.SQLException{
       if(rs==null){
           return null;
       }

       ResultSetMetaData md = rs.getMetaData();
       int columnCount = md.getColumnCount();

       List list = new ArrayList();
       Map rowData;
       while (rs.next()){
           rowData = new HashMap(columnCount);
           for (int i=1; i<=columnCount; i++){
        	   
        		   rowData.put(md.getColumnName(i),rs.getObject(i));
        	   
        	  
           }
           list.add(rowData);
       }
       return list;
   }


首先将ResultSet封装成list  而每条记录对应一个实体Map
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
 * <p>Title:属性封装类</p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2008</p>
 *
 */
public class BeanUtils {	
	/**
	 * 
	 * @param bean 需要封装的vo
	 * @param map 需要转换的map
	 * @return 已经封装好数据的vo(object)
	 */
	public static  Object MapToBean(Object bean, Map map) {
		Map methods = new HashMap();
		Method m[] = bean.getClass().getMethods();
		for (int i = 0; i < m.length; i++) {
			Method method = m[i];
			String methodName = method.getName().toUpperCase();
			methods.put(methodName, method);
		}

		Iterator it = null;
		String key = "";
		it = map.keySet().iterator();
		while (it.hasNext()) {
			key = (String) it.next();
			String name = "GET" + key.toUpperCase();
			if (methods.containsKey(name)) {
				Method setMethod = (Method) methods.get("SET" + key.toUpperCase());
				try {
					if(setMethod!=null){
						Object[] obj=null;
						obj=new Object[1];
						obj[0]=map.get(key);
					setMethod.invoke(bean, obj);
					}
					else{
						continue;
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}

			}
		}
		return bean;
	}
}

此方法是将上面查到的list作为参数  然后再将其list里面的map转换成相对性的pojo

假设查询的是student表  与之对应的pojo是Student类  那么调用方法如下:

首先查询数据  获取到resultset 
然后
List  retultList=resultSetToList(resultset);
遍历retultList  将list里面的Map都转换成pojo
Student stu=(Student)BeanUtils.MapToBean(new Student(),(Map)retultList.get(0));

注意:查询出来的字段名要和pojo中的属性名相同  若查询出age字段 pojo中需有getAge和setAge方法  方法名大小写不限

每天记录一点 好记星不如烂笔头

3
0
分享到:
评论
7 楼 hfkiss44 2013-10-07  
yanmin1990 写道
Student stu=(Student)BeanUtils.MapToBean(new Student(),(Map)retultList.get(0)); 之后我用stu去取值为啥都是null?
你确认下sql语句查询的结果
6 楼 yanmin1990 2013-08-28  
Student stu=(Student)BeanUtils.MapToBean(new Student(),(Map)retultList.get(0)); 之后我用stu去取值为啥都是null?
5 楼 hfkiss44 2012-12-23  
yuetao31512 写道
有个问题, setMethod.invoke(bean, obj); 如果obj的参数类型与set方法不对应,如obj为Integer,实际set参数类型为int就会出现:
java.lang.IllegalArgumentException: argument type mismatch
类型不匹配错误,博文好像没有涉及到如何处理这个的问题
------------------------------------------------------------------------------


从数据库查出来的一般都是key,Object形式的Map  你所说的int型会存在于map之中这类问题应该是不存在的  int是不属于object的 且method的invoke方法的第二个参数明显是要的object但是int不属于object 你应该是有改代码了

而且要遵循规范  请将do对象类型设置成object对象  你将对象的类型设置成int这基本类型按道理也是不会出错的

但是对象序列化分布式的时候会出问题

所以还是请尽量 object->object

而不要  基本类型->复合类型  抑或符合类型->基本类型  最好将do中的所有类型都设置成Object  而不要有基本类型


4 楼 yuetao31512 2012-12-06  
有个问题, setMethod.invoke(bean, obj); 如果obj的参数类型与set方法不对应,如obj为Integer,实际set参数类型为int就会出现:
java.lang.IllegalArgumentException: argument type mismatch
类型不匹配错误,博文好像没有涉及到如何处理这个的问题
3 楼 hfkiss44 2010-07-16  
不是hsql  应该是hibernate的那种sql查询写法  缩写忘了  不好意思
2 楼 hfkiss44 2010-07-16  
如果是对应多个pojo那就需要在查新的sql里面加上约束  可以和hsql差不多

select A.column1,B.column1,A.column2  from A,B where ...
表名为A pojo名也为A
然后拆分select 到form之间的所查询的字段  根据字段前的类名约束创建pojo实体  然后赋值   如上面的代码  可以再查询出resultset后将所查出的字段根据约束封装为多个map,然后将map和所以应的类进行对应赋值就可以
1 楼 hli1314 2010-07-15  
如果是多表关联查询,需要封装到多个对应的pojo怎么处理呢?

相关推荐

    java反射封装结果集内容到pojo

    当我们从数据库读出数据得到ResultSet或RowSet的时候,我们的做法是遍历结果集,然后封装到pojo里面,再封装到List,那么,每次封装是不是很麻烦呢,前段时间小弟看了下反射的东西,试着写了个类,目的在于方便封装...

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData、查询结果集映射Map与ListMap 1.数据类型 2.封装通用增删改 2.1.封装JDBCUtil 2.2.封装Dao通用增删改 2.3.测试 3.ResultSet...

    JDBC编程resultset游标控制

    JDBC通信原理 JDBC驱动类型 JDBC构成 JDBC程序5步走 滚动的结果集 可更新的结果集 SQL数据类型对应的Java类型 事务及批量处理 行集、连接池、LDAP

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    本文档演示如何从 Java 存储过程将 JDBC ResultSet 作为 REF CURSOR 返回。JDBC ResultSet 是一个表示数据库的数据表,通常通过执行查询数据库的语句产生该表。REF CURSOR 是 PL/SQL 中相应的类型。Java 存储过程的...

    javaBean自动生成工具,jdbc连接池封装

    根据mysql数据库自动生成对应的javabean,附带jdbc连接池工具类封装,支持Resultset转List javabean对象

    实用的jdbc的工具类,提供多种ResultSet的转化方法

    次类对ResultSet进行封装,可以将其转化为List,Map,BO等

    4. 尚硅谷_佟刚_JDBC_通过 ResultSet 执行查询操作.wmv

    JavaJDBC的视频,通过ResultSet执行查询操作,视频详细描述了如何使用ResultSet执行查询的案例。

    JDBC基础教程之ResultSet对象.doc )

    JDBC基础教程之ResultSet对象.doc )

    jdbc的详细介绍

    6. JDBC 编程人员使用到的接口? 7. JDBC 编程中主要的接口和类 8. 使用唯一的URL确定数据库 9. JDBC2.0 增强特性 第二章 1. JDBC 编程的步骤 第四章 1. 异常 1. JDBC编程中的异常 2. JDBC当中的元数据 3. 事务(ACID)...

    JDBC数据库常用操作封装(升级版)

    看前面的那一版注释,加了同步,线程安全,封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字,查询ResultSet中记录的行数...... 含源代码,测试代码!!!! 另附API说明,powerdesign图,...

    JavaSE_9_JDBC编程

    连接数据库,试用Statement借口进行数据库的更新操作,试用ResultSet接口接受查询结果,PreparedStatement,事务处理,封装JDBC操作数据库的工具类,DAO设计模式

    封装ResultSet结果集

    封装ResultSet结果集

    JDBC工具类(针对mySQL)

    此类是针对执行查询语句返回的ResultSet结果集进行设计的,旨在方便用户将数据库的内容转化为Vector、ArrayList容器的操作过程,此类中提供了多种方法从而简化了对ResultSet结果集的转化成本,结合系统提供的...

    删掉,复制别人东西,怕侵权,原本只想收藏的

    客服看到给我删掉,我只是想收藏这篇文章,这是复制别人的,怕侵权。...相对而言,Hibernate对JDBC的封装程度还是比较高的,我们已经不需要写SQL,只要使用HQL语言就可以了。 使用Hibernate进行编程有以下好处:

    自己封装的JDBC工具类源码

    最近刚学习了JDBC,最后封装了一段简单的工具类,主要功能有: 1、执行sql语句返回单条查询结果; 2、执行查询语句sql返回结果集; 3、执行数据的插入,修改,删除; 4、执行批处理; 5、调用存储过程; 6、...

    JDBC数据库常用操作封装

    封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字,查询ResultSet中记录的行数...... 含源代码,测试代码!!!! 另附API说明,powerdesign图,mysql/mssql数据库代码. 用户只需使用...

    java组件开发(15) JDBC操作工具类与ResultSet数据

    java组件开发(15) JDBC操作工具类与ResultSet数据

    Spring Data JDBC与JDBC的区别

    JDBC规范   java.sql和javax.sql两个包中的类与接口(天龙八部):  DataSource:数据源 ... ResultSet:结果集,封装了多条记录  JDBC数据库连接池/Connection Pool  DBCP:apache tomcat内置  

    ResultSet

    ResultSet的用法

Global site tag (gtag.js) - Google Analytics