热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

JDBC查询Map转对象实现过程详解

这篇文章主要介绍了JDBC查询Map转对象实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

虽然项目中都夹杂了Hibernate的支持,但是团队开发中,很多人为了编写特殊查询的代码时都使用了JDBC进行查询。JDBC查询后返回的是一个List集合,List中组装的是Map,一个Map就是一个对应的对象。但是接口不能直接返回Map,都是返回的对象,以方便自己和其他人使用,为了转换这个Map,往往写这样的代码:

@SuppressWarnings("unchecked") 
public static MS_Mont analyzeMapToMS_Mont(Map map){ 
  MS_Mont obj = new MS_Mont(); 
  if(null != map.get("montNo")) obj.setMontNo(Integer.parseInt(map.get("montNo").toString())); 
  if(null != map.get("montName")) obj.setMontName(map.get("montName").toString()); 
  if(null != map.get("montType")) obj.setMontType(Integer.parseInt(map.get("montType").toString())); 
  if(null != map.get("montLength")) obj.setMontLength(Integer.parseInt(map.get("montLength").toString())); 
  if(null != map.get("montDesc")) obj.setMontDesc(map.get("montDesc").toString()); 
  if(null != map.get("bigType")) obj.setBigType(Integer.parseInt(map.get("bigType").toString())); 
  if(null != map.get("bigTypeName")) obj.setBigTypeName(map.get("bigTypeName").toString()); 
  if(null != map.get("littleType")) obj.setLittleType(Integer.parseInt(map.get("littleType").toString())); 
  if(null != map.get("littleTypeName")) obj.setLittleTypeName(map.get("littleTypeName").toString()); 
  if(null != map.get("insertTime")) obj.setInsertTime(map.get("insertTime").toString()); 
  if(null != map.get("updateTime")) obj.setUpdateTime(map.get("updateTime").toString()); 
  if(null != map.get("userNoRe")) obj.setUserNoRe(Integer.parseInt(map.get("userNoRe").toString())); 
  if(null != map.get("userNoLast")) obj.setUserNoLast(Integer.parseInt(map.get("userNoLast").toString())); 
  return obj; 
} 

很麻烦,很多,很枯燥。

为了解决这个问题,我列出一个解决方法,写一个方法,传入要赋值的对象和Map,然后根据列的属性名称从Map中获得响应的值,然后赋值给这个对象的属性。

例如,这里写了一个简单的查询:

public CM_Line getObjectBean(int lineNo) { 
  try { 
    String sql = "select * from cm_line where lineNo=?"; 
    Object[] obj = new Object[]{ lineNo }; 
    List rows = jdbcTemplate.queryForList( sql, obj ); 
    if(null != rows && rows.size() > 0) { 
      CM_Line line = new CM_Line(); 
      return (CM_Line) line.analyzeMap((Map)rows.get(0)); 
    } else { 
      return null; 
    } 
  } catch (Exception e) { 
    logger.error(e); 
  } 
  return null; 
} 

然后我们调用了他的analyzeMap方法,这个方法把当前对象当作要赋值的对象,然后调用公用方法进行组装:

public Object analyzeMap(Map para){ 
  Object obj = this; 
  ObjectUtil.setValToObj(obj, para); 
  return obj; 
} 

公用方法:

public synchronized static void setValToObj(Object entityName, Map para){ 
  try { 
    Class c = entityName.getClass(); 
    // 获得对象属性   
    Field field[] = c.getDeclaredFields(); 
    for (Field f : field) {  
      try { 
        PropertyDescriptor pd = new PropertyDescriptor(f.getName(), c);  
        Method writeMethod = pd.getWriteMethod(); 
        if(!CommonCheck.isNullOrEmpty(para.get(f.getName()))) 
          writeMethod.invoke(entityName, para.get(f.getName())); 
      } catch (Exception e) { 
      } 
    } 
  } catch (Exception e) { 
  } 
} 

下面就有人说了,那根据对象获得这个对象的Map怎么搞,这个之前已经写过了,不这里仍然把代码放一下:

/**  
 * 返回一个对象的属性和属性值
 */   
public synchronized static LinkedHashMap getProAndValMap(Object entityName) {  
	LinkedHashMap map = new LinkedHashMap();  
  try {  
    Class c = entityName.getClass();  
    // 获得对象属性  
    Field field[] = c.getDeclaredFields();   
    for (Field f : field) {
      Object v = invokeMethod(entityName, f.getName(), null);  
      if(null != v) map.put(f.getName(), v.toString());
      else map.put(f.getName(), "");
    }  
  } catch (Exception e) {  
    map = null;  
  }  
  return map;  
}
/**
 * 获得对象属性的值
 */
private synchronized static Object invokeMethod(Object owner, String methodName,
		Object[] args) throws Exception {
	Class ownerClass = owner.getClass();
	methodName = methodName.substring(0, 1).toUpperCase() + methodName.substring(1);
	Method method = null;
	try {
		method = ownerClass.getMethod("get" + methodName);
	} catch (Exception e) {
	}
	return method.invoke(owner);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 抽象工厂模式 c++
    抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
  • 代码生成器实战教程:提升编程效率的利器
    本系列文章旨在通过一系列实践案例,详细介绍如何利用代码生成器提高开发效率。本文将引导您完成从下载安装到实际应用的全过程。 ... [详细]
  • Navicat Premium中MySQL用户管理:创建新用户及高级设置
    本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文介绍如何在SQL Server中利用WITH子句和窗口函数ROW_NUMBER()来查询每个类型下的最新数据行。示例包括表结构、数据插入以及最终的查询语句。 ... [详细]
  • 深入浅出:Hadoop架构详解
    Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
  • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
  • 本文介绍了一种在Oracle 19c数据库中恢复被误删除表数据的方法,包括启用行移动功能和使用闪回技术,适用于表结构未被删除但数据丢失的情况。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 数据库环境:SQLSERVER2005  有一个test表,其表结构及数据如下图1。其中,id是主键,mid是当前节点,pid是父节点。要求:查出每个节点的根节点,如图2所示。 ... [详细]
  • 本文介绍了如何在Laravel框架中使用Select方法进行数据库查询,特别是当需要根据传入的分类ID查询相关产品时的正确做法和注意事项。 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • MySQL 8.0 新特性详解:免费视频教程上线
    本文介绍了一套在慕课网上发布的免费视频教程,深入解析 MySQL 8.0 的核心新功能,包括增强的安全性、用户管理、新的索引类型、CTE 和窗口函数等。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
author-avatar
谁能吿诉我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有