`
hfkiss44
  • 浏览: 49049 次
  • 性别: 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怎么处理呢?

相关推荐

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

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

    mybatis框架课程.docx

    1. 简化了JDBC编程:MyBatis通过封装JDBC的操作,使开发者不需要关心复杂的JDBC编程细节,例如加载数据库驱动、创建数据库连接、创建Statement对象、设置参数、执行SQL语句等。 2. 提高了开发效率:MyBatis提供了一...

    Java_JDBC由浅入深

    第十五节 jdbc轻量级封装 88 15.1 将结果集封装为Map 88 15.1.1 ResultSetMetaData演示 88 15.1.2解决多行记录的问题 89 15.1.3 Map结果集的封装 90 15.2 将结果集封装为对象 91 15.2.1 user表POJO的编写 91 15.2.2 ...

    Mybatis复习文档

    如果能够将数据库记录自动封装到 POJO 对象中,将大大简化这一过程,提高代码的灵活性和可维护性。 #### 三、MyBatis 解决方案 针对上述 JDBC 编程存在的问题,MyBatis 提供了以下解决方案: 1. **数据库连接管理...

    jdbc基础和参考

    ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...

    数据库之间进行数据迁移代码实例

    本文将详细探讨如何使用JDBC(Java Database Connectivity)技术来实现这一目标,涉及的关键知识点包括数据库连接、表字段对应、对象封装以及批量导出数据等。 首先,JDBC是Java语言访问数据库的标准接口,它提供了...

    iBatis框架搭建用到的所有jar包

    纵观目前主流的 ORM(对象关系映射),无论 Hibernate还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过 ...

    MyBatis.pdf

    - **自动结果集映射**:MyBatis 能够自动将查询结果映射到 Java 对象,极大地减少了手动处理 ResultSet 的工作量。 #### 五、MyBatis 与其他框架的集成 - **与 Spring 和 SpringMVC 的集成** - 在实际项目中,...

    Java Web图书管理系统(附上MySQL数据库)

    这些功能通常通过JavaBeans或POJO(Plain Old Java Object)类来封装,便于在各层之间传递数据。 数据层则主要负责与数据库的交互。这里采用的是MySQL数据库,MySQL是一款广泛使用的开源关系型数据库管理系统,以其...

    Mybatis框架基本介绍

    Mybatis框架会根据映射文件的配置,自动将数据库查询结果集中的数据填充到这些POJO对象中,也可以根据POJO对象中的值来构建SQL语句并执行。 Mybatis的使用过程中,开发者可以通过定义SQL映射文件来实现对数据库的...

    Mybatis框架学习

    - **结果集映射**:自动将 SQL 查询的结果集映射到 Java 对象,大大减少了手工处理 ResultSet 的工作量。 - **动态 SQL**:支持基于条件的 SQL 生成,可以方便地根据不同的条件动态生成 SQL 语句。 #### 与 ...

    com-demo-database.zip

    - **结果集处理**:转换数据库查询结果为Java对象,如使用ResultSet映射到POJO(Plain Old Java Object)。 2. **原理解析**: - **JDBC基础**:该框架的基础是Java Database Connectivity (JDBC),它提供了与...

    JAVA WEB项目 开发案例精粹 源代码 包含20个案例(2),此包有7个案例

    开发者通常会使用Connection、Statement、PreparedStatement和ResultSet等JDBC接口。 5. **DAO(Data Access Object)设计模式**:为了更好地封装数据库操作,通常会创建DAO层。比如ch11或ch14可能展示了如何通过...

    java_students_db

    标题“java_students_db”暗示了这是一个与Java编程语言相关的数据库,可能包含了关于学生信息的数据存储和管理。描述中的“java_students_db”进一步确认了这一点,它可能是用来教学或实践Java数据库连接、SQL查询...

    Java 学习笔记极其详细版(包括一些个人色彩不仅仅是纯笔记)

    - Connection、Statement、ResultSet等接口的使用。 2. **数据库交互**: - SQL语句的执行。 - 结果集的处理。 #### Java Web技术 1. **Servlet**: - Servlet生命周期的理解。 - HttpServletRequest与...

    Crud

    1. **Create(创建)**:在Java中,创建新记录通常涉及构建一个Java对象(POJO或Entity),然后使用JDBC的`PreparedStatement`或者ORM框架的方法将这个对象持久化到数据库中。比如,使用Hibernate,我们可以调用`...

    项目建立基础

    下面我们将详细探讨这个过程中的关键知识点。 首先,**导包**是项目启动的第一步。在构建Java Web应用时,我们需要引入必要的库,比如MySQL的JDBC驱动,以便进行数据库交互。这些库通常可以从Maven仓库(Maven ...

    springmybatis

    前面已经讲到用接口的方式编程。如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情: 1. 用 mybatis 查询数据,包括列表 2. 用 mybatis 增加数据 3. 用 mybatis 更新数据. 4. 用 mybatis 删除...

Global site tag (gtag.js) - Google Analytics