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

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?

相关推荐

    java中将数据库中数据赋值给Map对象源代码

    本文将深入探讨如何在Java中利用Spring JDBC将数据库查询结果转换为Map对象。 首先,确保已经引入了Spring JDBC的相关依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.spring...

    封装jdbc,采用Map方式快速增删改数据库例子

    本文将深入探讨如何通过封装JDBC来提高数据库操作的效率,特别是使用Map数据结构实现快速的增删改操作。我们将以`BaseDao`类为例,位于项目的`util`包下。 首先,理解JDBC的基础知识是必要的。JDBC提供了一组接口和...

    PropertySet的map/xml/jdbc

    这个主题可能是关于如何在Java程序中使用Map对象,将它们序列化为XML格式,并通过JDBC连接进行数据库操作。 首先,让我们深入了解一下Map接口。在Java中,Map是用于存储键值对的数据结构,其中每个键都是唯一的。它...

    map与Javabean相互转换实例

    例如,当从数据库查询结果转换为Java对象时,或者在网络间传递数据时,`Map`经常被用作中间载体。 在项目开发中,我们可能会遇到需要将`Map`转换为`JavaBean`,或者反过来将`JavaBean`转换为`Map`的情况。反射机制...

    java实现jdbc查询结果集result转换成对应list集合

    1. 创建一个ArrayList来存储转换后的Map对象,每个Map对象代表ResultSet中的一行数据。 2. 获取ResultSet的元数据(ResultSetMetaData),这可以提供关于列的信息,如列的数量、名称等。 3. 使用while循环遍历...

    查询返回Map

    在这个场景下,我们讨论的是如何从数据库查询数据,将结果封装成Map对象,然后通过JSP(JavaServer Pages)页面显示在表格中,并且提供删除操作。下面将详细阐述这一过程涉及的知识点。 首先,我们要理解Map数据...

    ResultSet 转为listmap

    在 Java 中,使用 JDBC 连接数据库时,通常会返回一个 ResultSet 对象,该对象包含了查询结果集的所有记录。为了方便数据处理和使用,我们需要将 ResultSet 转为 List&lt;Map&gt;,以便于后续的数据处理和展示。 下面是将...

    jdbc 连接数据库封装类,可返回map,或者vo(自用)

    这类库通常会提供方便的方法来执行SQL查询,获取结果集并将其转换为Map对象或VO(Value Object)对象,以便于数据处理和业务逻辑操作。 在描述中提到的“NULL 博文链接:https://taoge-tony.iteye.com/blog/1973356...

    jdbc相关知识点的MindMap

    - `DriverManager`是JDBC的核心类之一,负责加载JDBC驱动以及根据提供的数据库URL创建`Connection`对象。 - 常用方法包括: - `getConnection(String url, String user, String pwd)`: 根据URL、用户名和密码建立...

    struts+jdbc+dwr 实现googlemap功能

    在"struts+jdbc+dwr 实现googlemap功能"的项目中,开发者利用这些技术构建了一个功能,当用户点击地图上的特定图标时,会显示相关的公司信息,如公司电话和名称。以下是对这个项目的详细解释: 首先,Struts框架在...

    通用模板,JDBC 增删改查封转

    在JDBC中,查询的结果通常会返回一个ResultSet对象,我们需要遍历这个结果集来获取数据。ResultMaker可能提供了便利的方法,如将ResultSet转换成List、Map或者其他自定义的数据结构,方便业务层进行数据处理。这可以...

    Java笔记Map,九大内置对象

    存储过程是预先在数据库中编译好的SQL语句集合,通过Java的JDBC(Java Database Connectivity)API可以调用这些存储过程。以下是一个基本示例,假设有一个名为`getEmployee`的存储过程: ```java CallableStatement...

    spring-jdbc.rar_goldenw65_map25w_sellwof_spring-jdbc

    2. **自动资源管理**:包括连接、语句对象等,Spring JDBC会自动创建、关闭,避免了资源泄露。 3. **参数绑定**:支持PreparedStatement的参数绑定,有效防止SQL注入。 4. **结果集映射**:通过RowMapper或...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    它通过映射Java类到数据库表,使得开发者可以避免编写大量的JDBC代码,而是以对象的方式操作数据。 2. Hibernate配置: 在使用Hibernate之前,需要进行一些基本的配置,包括创建`hibernate.cfg.xml`配置文件,定义...

    spring JDBC

    - `findALLDepts()` 方法将查询结果转换为自定义的`Dept`对象列表。 3. **删除操作** (`delete()`): - 该方法接受一个部门ID作为参数,并执行删除操作。 4. **主方法** (`main()`): - 通过`SpringUtil.getBean...

    执行sql语句,并将结果通过ArrayList返回。字段名统一大写 JDBC 连接数据库

    本文将详细介绍如何利用JDBC连接不同的数据库,并执行SQL查询语句,同时将查询结果存储到`ArrayList`中返回,其中字段名统一转换为大写形式。 #### 二、JDBC连接数据库 JDBC是一种用于执行SQL语句的标准Java API,...

    驱动程序jdbc_4.2

    JDBC(Java Database Connectivity)是Java编程语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它是Java平台的标准部分,允许程序员以一种标准的方式与各种关系...

    JDBC及DBUtils

    6. **处理结果**:对于查询语句,`executeQuery()`返回ResultSet对象,可以遍历查询结果。 7. **关闭资源**:在完成数据库操作后,应依次关闭ResultSet、Statement和Connection,释放数据库资源。 DBUtils是Apache...

    List<Map>转化为List工具类

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

    JDBC学习笔记

    #### 二十四、利用结果集元数据将查询结果封装为Map - **实现方式**: - 使用`ResultSetMetaData`获取结果集的列信息。 - 通过`getColumnLabel()`方法获取列别名或名称。 - 将每条记录封装为一个Map,然后存储到...

Global site tag (gtag.js) - Google Analytics