JDBC查询Map转对象实现过程详解
程序员文章站
2022-07-02 14:55:24
虽然项目中都夹杂了hibernate的支持,但是团队开发中,很多人为了编写特殊查询的代码时都使用了jdbc进行查询。jdbc查询后返回的是一个list集合,list中组装的是map,一个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); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。