JDBC查询Map转对象实现过程详解
作者:cuisuqiang 发布时间:2021-08-30 07:17:40
标签: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<String, Object> para){
Object obj = this;
ObjectUtil.setValToObj(obj, para);
return obj;
}
公用方法:
public synchronized static void setValToObj(Object entityName, Map<String, Object> 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<String,String> getProAndValMap(Object entityName) {
LinkedHashMap<String,String> map = new LinkedHashMap<String, String>();
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);
}
来源:https://www.iteye.com/blog/cuisuqiang-1926915


猜你喜欢
- 本文为大家分享了Android自定义Toast之WindowManager,供大家参考,具体内容如下Toast:WindowManager三
- 最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了
- 看代码吧~package com.mtpc.admin.controller.exportSql;import ch.qos.logback
- 什么是数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每
- 一、VSCode安装EmmyLua 二、添加配置文件三、设置配置文件执行完第二步会弹出添加好的launch.json配置文件,这个
- 快捷键是很多软件的常用功能,本文实例讲解了三种方法来实现C# button快捷键,如Alt + *(按钮快捷键),Ctrl+*及其他组合键等
- 苹果的Touch Icon相对我们都比较熟悉,是苹果为了支持网络应用(或者说网页)添加到桌面需要的图标,有了这些Touch Icon的网页链
- 部分情况下无法通过maven仓库直接下载需要的jar包,只能讲jar包下载至本地来使用,spring boot框架内通过maven加载第三方
- 一、 JPA概述JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,
- 在之前讨论 ListView 滚动相关需求的文章中(UWP: ListView 中与滚动有关的两个需求的实现)曾经提到了获取元素相对位置的方
- 学习内容Java I/O 项目案例内容管理java文件I/O实例----生成报表我们之前学习了两个重要的模块,一个就是Java I/O 另外
- 最近公司有一个公交项目,要生成报站语音,采用的是 报站前缀 + 站点名 + 报站后缀,3个MP3文件拼接的方式,拼接成一个完整的语音,且需要
- 前言对于字符串的操作,我们常用的就是trim()去除前后空格、subString()截取子字符串,其他的用的不多。下表中是字符串常用的方法。
- 这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 1 * * 是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言, * 要的控制更加的细节, *
- springcloud微服务包含的技术种类众多,eureka作为其注册中心,一直处于主流,但在今年已经处于永久停更状态,但其优秀的能力还是值
- 一、问题描述Android studio导入一个项目报一堆错误:Process: xhs.com.xhswelcomeanim, PID:
- 首先,将json串转为一个JObject对象:JObject jo = (JObject)JsonConvert.DeserializeOb
- 对HDFS上的文件进行上传和下载是对集群的基本操作,在《HADOOP权威指南》一书中,对文件的上传和下载都有代码的实例,但是对如何配置HAD
- 本文主要介绍了C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例),分享给大家,具体如下:实现效果:通过Sta