`
cuisuqiang
  • 浏览: 3936645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3651137
社区版块
存档分类
最新评论

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

 

请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ ! 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

2
11
分享到:
评论
21 楼 cuisuqiang 2013-08-23  
zhuchao_ko 写道
QueryRunner runner = new QueryRunner();//1
Connection connection = 得到连接;
List<Object> list = new ArrayList<Object>();
List<Map<String, Object>> result = runner.query(connection,
"select 字段 from 表", new MapListHandler(),
list.toArray());//2
connection.close();//关闭


就1,2两行。如果不喜欢ORM框架用这个是非常好的。封装成对象也影响效率。


谢谢
20 楼 zhuchao_ko 2013-08-23  
QueryRunner runner = new QueryRunner();//1
Connection connection = 得到连接;
List<Object> list = new ArrayList<Object>();
List<Map<String, Object>> result = runner.query(connection,
"select 字段 from 表", new MapListHandler(),
list.toArray());//2
connection.close();//关闭


就1,2两行。如果不喜欢ORM框架用这个是非常好的。封装成对象也影响效率。

19 楼 cuisuqiang 2013-08-23  
zhuchao_ko 写道
APACHE.ORG上有个 common-dbutil 轮子,
你的轮子圆还是这个轮子圆?

谢谢
18 楼 zhuchao_ko 2013-08-23  
APACHE.ORG上有个 common-dbutil 轮子,
你的轮子圆还是这个轮子圆?
17 楼 cuisuqiang 2013-08-21  
shanlingyunjavafuns 写道
楼主的这个解决方式,是用了java的反射机制,注入值的。

是的
16 楼 cuisuqiang 2013-08-21  
55757353 写道
Object 转换Map:org.apache.commons.beanutils.BeanMap
Map转换Object: org.apache.commons.beanutils.BeanUtils

非常感谢
15 楼 55757353 2013-08-21  
Object 转换Map:org.apache.commons.beanutils.BeanMap
Map转换Object: org.apache.commons.beanutils.BeanUtils
14 楼 shanlingyunjavafuns 2013-08-20  
楼主的这个解决方式,是用了java的反射机制,注入值的。
13 楼 cuisuqiang 2013-08-19  
eric023 写道
既然你都说Map就是一个对应的对象,为嘛还要转换为对象呢?

Map里有各个key对应表的各个列
12 楼 eric023 2013-08-19  
既然你都说Map就是一个对应的对象,为嘛还要转换为对象呢?
11 楼 cuisuqiang 2013-08-19  
forcer521 写道
spring 3.2

BeanPropertyRowMapper<YourBeanClass> mapper = new BeanPropertyRowMapper<YourBeanClass>(YourBeanClass.class);

SqlParameterSource sqlParam = new BeanPropertySqlParameterSource(keyword);

//NamedParameterJdbcTemplate template = 设置好的自动注入的;

List<YourBeanClass> taskList = template.query(sqlString,sqlParam,mapper);


返回对象和map的list都是可以的,干嘛自己写那么多呢。。

会用,也要会写
10 楼 forcer521 2013-08-19  
spring 3.2

BeanPropertyRowMapper<YourBeanClass> mapper = new BeanPropertyRowMapper<YourBeanClass>(YourBeanClass.class);

SqlParameterSource sqlParam = new BeanPropertySqlParameterSource(keyword);

//NamedParameterJdbcTemplate template = 设置好的自动注入的;

List<YourBeanClass> taskList = template.query(sqlString,sqlParam,mapper);


返回对象和map的list都是可以的,干嘛自己写那么多呢。。
9 楼 cuisuqiang 2013-08-19  
leonayx123 写道
cuisuqiang 写道
leonayx123 写道
试试spring jdbcTemplate的 queryForList()

我用的就是带参数的queryForList,他是不返回对象的


你说他返回的都是map<String,Object>?你想拿到具体的对象而不是Object么?
可以写一个RowMapper。然后用query(sql,RowMapper)

多谢指导
8 楼 cuisuqiang 2013-08-19  
pharaohsprince 写道
另外:
Common Dbutils 组件也有更简单的方法:
QueryRunner(dataSource).queryForOList(sql, null, Object.class);     

非常感谢分享
7 楼 pharaohsprince 2013-08-19  
另外:
Common Dbutils 组件也有更简单的方法:
QueryRunner(dataSource).queryForOList(sql, null, Object.class);     
6 楼 pharaohsprince 2013-08-19  
http://blog.csdn.net/rainier001/article/details/6947968

近日系统有一个打印采购单的功能,发现连续打印多张后,主机宕机,看了下service和dao层的实现,很繁杂,估计原因主要出在组页面资料的时候,循环套循环导致效能下降,然后想想有什么办法可以减少组资料时的一些对象转换,dao层取回来的是map,然后还要转换成vo,然后又循环组资料,google下资料,发现jdbctemplate查询还有个query方法,可以直接在查好后返回你需要的vo,改好上线,不知道对效能有没有帮助,不过这个做法感觉不错,特把文章贴在blog里面,以备后用,呵呵


   
在内部建立内联类实现RowMapper接口
package hysteria.contact.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import hysteria.contact.dao.ItemDAO;
import hysteria.contact.domain.Item;
public class ItemDAOImpl implements ItemDAO {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
}
public Item insert(Item item) {
  String sql = "INSERT INTO items(user_id,name,phone,email) VALUES(?,?,?,?)";
  Object[] params = new Object[]{item.getUserId(),item.getName(),item.getPhone(),item.getEmail()};
  int[] types = new int[]{Types.INTEGER,Types.VARCHAR,Types.CHAR,Types.VARCHAR};
  jdbcTemplate.update(sql,params,types);
  return item;
}
public Item update(Item item) {
  String sql = "UPDATE items SET name = ?, phone = ?, email = ? WHERE id = ?";
  Object[] params = new Object[] {item.getName(),item.getPhone(),item.getEmail(),item.getId()};
  int[] types = new int[] {Types.VARCHAR,Types.CHAR,Types.VARCHAR,Types.VARCHAR,Types.INTEGER};
  jdbcTemplate.update(sql,params,types);
  return item;
}
public void delete(Item item) {
  String sql = "DELETE FROM items WHERE id = ?";
  Object[] params = new Object[] {item.getId()};
  int[] types = new int[]{Types.INTEGER};
  jdbcTemplate.update(sql,params,types);
}
public Item findById(int id) {
  String sql = "SELECT * FROM items WHERE id = ?";
  Object[] params = new Object[] {id};
  int[] types = new int[] {Types.INTEGER};
  List items = jdbcTemplate.query(sql,params,types,new ItemMapper());
  if(items.isEmpty()){
   return null;
  }
  return (Item)items.get(0);
}
public List<Item> findAll() {
  String sql = "SELECT * FROM items";
  return jdbcTemplate.query(sql,new ItemMapper());
}
public List<Item> findAllByUser(int user_id) {
  String sql = "SELECT * FROM items WHERE user_id = ?";
  Object[] params = new Object[]{user_id};
  int[] types = new int[]{Types.INTEGER};
  List items = jdbcTemplate.query(sql,params,types,new ItemMapper());
  return items;
}
protected class ItemMapper implements RowMapper {
  public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
   Item item = new Item();
   item.setId(rs.getInt("id"));
   item.setUserId(rs.getInt("user_id"));
   item.setName(rs.getString("name"));
   item.setPhone(rs.getString("phone"));
   item.setEmail(rs.getString("email"));
   return item;
  }
}
}
5 楼 leonayx123 2013-08-19  
cuisuqiang 写道
leonayx123 写道
试试spring jdbcTemplate的 queryForList()

我用的就是带参数的queryForList,他是不返回对象的


你说他返回的都是map<String,Object>?你想拿到具体的对象而不是Object么?
可以写一个RowMapper。然后用query(sql,RowMapper)
4 楼 cuisuqiang 2013-08-19  
leonayx123 写道
试试spring jdbcTemplate的 queryForList()

我用的就是带参数的queryForList,他是不返回对象的
3 楼 leonayx123 2013-08-19  
试试spring jdbcTemplate的 queryForList()
2 楼 cuisuqiang 2013-08-19  
pharaohsprince 写道
jdbcTemplate 里早就提供了类似的方法:
jdbcTemplate.queryForObject(sql, rowMapper)

如果查询返回的是List?

相关推荐

    jdbc常用方法整理

    包括了jdbc的增删改查的方法,其中包含查询返回包括实体和Map结果,支持更新对象和保存对象的操作。

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map, Object&gt;&gt;转化为...

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData

    Java-JDBC【之】数据类型、封装JDBCUtil、封装通用增删改、ResultSet与ResultSetMetaData、查询结果集映射Map与ListMap 1.数据类型 2.封装通用增删改 2.1.封装JDBCUtil 2.2.封装Dao通用增删改 2.3.测试 3.ResultSet...

    Java连接数据库 JDBC封装类 带使用例子

    Java JDBC封装类,带增删改查例子,支持oracle,MySql,hsqldb 等,支持事务,返回数据格式 支持二维数组,MAP格式,以及javabean对象。有利于初学者DbDemo.java为demo,Connect为jdbc封装类,可以作为项目共通类使用。

    Java_JDBC由浅入深

    15.2 将结果集封装为对象 91 15.2.1 user表POJO的编写 91 15.2.2 Bean结果集的封装 92 15.3 将结果集封装为List 94 15.4 策略模式的应用 96 15.4.1 Map结果集策略模式应用 96 15.4.2 Bean结果集策略模式应用 97 ...

    通用JDBC基本操作封装源代码

    简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java...(注意:作为参数用完的集合和Map注意调用.clear()方法,保证对象正常回收gc。)

    spring-jdbc-orm:基于spring-jdbc 写的一个小型ORM

    ORM工具主要功能分两部分,一是将spring jdbc查询返回Map转换成对应的实体对象,方便上层结构使用。二是自动生成增/删/改/查以及分页查询sql语句,使用了此工具后基础的语句就不必在费尽心思copy 改了。绝对会...

    JDBC封装类升级版,支持DBCP、C3P0连接池,Java连接数据库带例子

    Java JDBC封装类升级版,带增删改查例子,支持oracle,MySql,hsqldb 等,支持事务,返回数据格式 支持二维数组,MAP格式,以及javabean对象。有利于初学者DbDemo.java为demo,Connect为jdbc封装类,可以作为项目共通类...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    jdbc的完全封装工具包,无伤操作数据库中表,提供最新注解操作SQL指令

    Map,LikeItem&gt; condition = new HashMap(); /*condition.put("user_sex", new LikeItem("男")); condition.put("user_name", new LikeItem("张三", LikeModle.LIKE));*/ // 测试升级模糊查询方法 System.out....

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    Dbutils项目实例

    DBUtils封装了对JDBC的操作 简化了JDBC操作 可以少写代码 org apache commons dbutils DbUtils 关闭链接等操作 QueryRunner 进行查询的操作 org apache commons dbutils handlers ArrayHandler :将ResultSet中第一...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式  2.3.1 主动域对象模式  ...

    Java面向对象程序设计笔记

    Java面向对象程序设计笔记: 目录----非原创,上课的时候老师给的资料哦 第一章 Java 前凑 3 1. Java前凑 3 Java产生的目的 3 Java的诞生的历史 3 2.Java语言的特点 3 ...第九章JDBC编 32 第十章GUI编程 32

    JdbcTemplate的jar包.rar

    查询所有的内容,封装为对象用:template.query(sql, new BeanPropertyRowMapper&lt;对象&gt;(对象.class)); 查询需要使用聚合函数的内容,如:select count(id)from account用:template.queryForObject(sql)

    spring05-4

    Spring中使用jdbc模板来查询数据,查询出来的是list中放有map,通过mapper类来讲list中的map转为对象存到list中

    wheel:用于 Java JDBC 的 Scala 包装器

    可以将sql语句传给Sql对象来查询数据表,也可以直接使用String类型的sql语句: // execute query val result = Sql ( " select * from customer " ).query import ...

    HashMap关系数据映射技术软件PVO_v1.2

    3、若无记录,则返回零长度Map对象 4、零长度字符串存入数据库中将保存为null 5、返回值与标准Java库方法返回值一致 6、若仅仅是调用标准库中的方法,则方法签名与被调用方法签名一致 7、遵守驼峰式命名规则 第...

Global site tag (gtag.js) - Google Analytics