欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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);
}

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