`

java bean自动进行rowMapper or handler的类

    博客分类:
  • JAVA
 
阅读更多
一般情况下在进行jdbc编程的时候避免不了的要写n多的bean类,用来封装数据库获取的查询结果集,同时又要写n多的rowMapper或者handler来操作装配结果集中的数据进入bean中,最近研究了下自己写了一个对java bean自动进行rowMapper or handler的类 AutoBoxingRowMapper(其实现了spring jdbc的rowMapper),这是一个通用的rowMapper,大多数情况下可以帮助我们省去写n多的rowMapper类。 
 
(注:在应用该类之前应该约定你的java bean中的属性名字的与sql查询中列名不区分大小写匹配,该类保证结果集与bean之间满足toLowerCase(columnName) = toLowerCase(propertyName)时才自动装配) 
 
代码如下:


package com.loansystem.common.util;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.JdbcUtils;

/** 
 * 
 * 对查询数据结果集进行bean自动装箱 
 * (注:结果集与bean之间满足toLowerCase(columnName) = toLowerCase(propertyName))时才自动装箱 
 */  
public class AutoBoxingRowMapper implements RowMapper {  
      
//    protected final Log logger = LogFactory.getLog(this.getClass());  
      
    private boolean stringNotEmpty = true;//结果集中由字段值全部以string类型返回其值,并且为空时以空串""返回  
      
    private Class<Object> beanClass;//即将要进行包装的bean的Class  
      
    private Map<String,PropertyDescriptor> beanPropertyMap = new HashMap<String,PropertyDescriptor>();//即将要进行包装的bean的属性描述,以Map形式保存  
      
    public boolean isStringNotEmpty() {  
        return stringNotEmpty;  
    }  
  
    public void setStringNotEmpty(boolean stringNotEmpty) {  
        this.stringNotEmpty = stringNotEmpty;  
    }  
  
    public Class<Object> getBeanClass() {  
        return beanClass;  
    }  
  
    public void setBeanClass(Class<Object> beanClass) {  
        this.beanClass = beanClass;  
    }  
      
    public Map<String, PropertyDescriptor> getBeanPropertyMap() {  
        return beanPropertyMap;  
    }  
  
    public void setBeanPropertyMap(Map<String, PropertyDescriptor> beanPropertyMap) {  
        this.beanPropertyMap = beanPropertyMap;  
    }  
      
    /** 
     * 自动装配sql查询结果集的各列值到beanClass所指定的bean中的对应属性上,满足toLowerCase(columnName) = toLowerCase(propertyName)时进行装配 
     * @param beanClass - 要装配的bean的java.lang.Class 
     */  
    @SuppressWarnings({"rawtypes", "unchecked"})  
    public AutoBoxingRowMapper(Class beanClass){  
        super();  
        this.beanClass = beanClass;  
          
        //初始化beanClass对应的bean的所有属性  
        PropertyDescriptor[] props = null;  
        try {  
            props = Introspector.getBeanInfo(this.getBeanClass(), Object.class)  
                    .getPropertyDescriptors();  
            if (props != null) {  
                for (int i = 0; i < props.length; i++) {  
                    this.beanPropertyMap.put(props[i].getName().toLowerCase().trim(), props[i]);  
                }  
            }  
        } catch (IntrospectionException e) {  
//            logger.error(e, e);  
        }  
    }  
      
    /** 
     * 自动装配sql查询结果集的各列值到beanClass所指定的bean中的对应属性上,满足toLowerCase(columnName) = toLowerCase(propertyName)时进行装配 
     * @param beanClass - 要装配的bean的java.lang.Class 
     * @param stringNotEmpty - 是否将结果集中由字段值全部以string类型返回其值,并且为空时以空串""返回,default true 
     */  
    @SuppressWarnings({"rawtypes"})  
    public AutoBoxingRowMapper(Class beanClass,boolean stringNotEmpty){  
        this(beanClass);  
        this.stringNotEmpty = stringNotEmpty;  
    }  
      
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  
          
        Object defaultInstance = null;  
        try {  
            defaultInstance = this.getBeanClass().newInstance();//获取bean的实例  
        } catch (Exception e) {  
//            logger.error(e, e);  
        }  
        if(defaultInstance == null){  
//            logger.error("attempt to new a instance of class named : " + this.getBeanClass().getName() + " but failed!!!");  
            return null;  
        }  
        //获取元数据  
        ResultSetMetaData rsmd = rs.getMetaData();  
        int columnCount = rsmd.getColumnCount();  
          
        PropertyDescriptor propertyDescriptor = null;  
        try {  
            for (int i = 1; i <= columnCount; i++) {  
                String key = getColumnKey(JdbcUtils.lookupColumnName(rsmd, i));//获取resultset结果集中第i列对应的列名  
                Object obj = getColumnValue(rs, i, key);//获取resultset结果集中第i列对应的值  
                  
                propertyDescriptor = this.beanPropertyMap.get(key);  
                if(propertyDescriptor == null){//当前列名key对应的属性在bean中找不到,给予警告  
//                    logger.warn("no corresponding property defined in class : " + this.getBeanClass().getName() + " for sql query resultset column '" + key + "' !!!");  
                    continue;  
                }else{////当前列名key对应的属性在bean中找到,则调用其setXxx方法设置其值  
                    propertyDescriptor.getWriteMethod().invoke(defaultInstance, obj);  
                }  
            }  
        } catch (Exception e) {  
//            logger.error(e, e);  
        }   
          
        return defaultInstance;  
    }  
      
    protected String getColumnKey(String columnName) {  
        return columnName == null ? null : columnName.toLowerCase().trim();  
    }  
      
    @SuppressWarnings("rawtypes")  
    protected Object getColumnValue(ResultSet rs, int index, String columnName) throws SQLException {  
        Object val = null;  
        if(stringNotEmpty){//所有列以string类型解析(前提做到要约定你的bean中的所有属性都定义成string类型)  
            val = rs.getString(index) == null ? "" : rs.getString(index);  
        }else{//所有类型以其bean类中对应的属性类型进行解析  
            PropertyDescriptor propertyDescriptor = this.beanPropertyMap.get(columnName);  
              
            if(propertyDescriptor != null){  
                Class propertyTypeClass = propertyDescriptor.getPropertyType();  
                String className = propertyTypeClass.getName();  
                if(className.equals("int") || className.equals(Integer.class.getName())){  
                    val = rs.getInt(index);  
                    return val;  
                }else if(className.equals("short") || className.equals(Short.class.getName())){  
                    val = rs.getShort(index);  
                    return val;  
                }else if(className.equals("byte") || className.equals(Byte.class.getName())){  
                    val = rs.getByte(index);  
                    return val;  
                }else if(className.equals("long") || className.equals(Long.class.getName())){  
                    val = rs.getLong(index);  
                    return val;  
                }else if(className.equals("float") || className.equals(Float.class.getName())){  
                    val = rs.getFloat(index);  
                    return val;  
                }else if(className.equals("double") || className.equals(Double.class.getName())){  
                    val = rs.getDouble(index);  
                    return val;  
                }else if(className.equals("char") || className.equals(Character.class.getName())){  
                    val = rs.getString(index);  
                    return val;  
                }else if(className.equals(String.class.getName())){  
                    val = rs.getString(index);  
                    return val;  
                }else if(className.equals(java.util.Date.class.getName())){  
                    val = rs.getDate(index);  
                    return val;  
                }else if(className.equals(java.math.BigDecimal.class.getName())){  
                    val = rs.getBigDecimal(index);  
                    return val;  
                }else{//Object  
                    val = rs.getObject(index);  
                    return val;  
                }  
            }else{  
                val = JdbcUtils.getResultSetValue(rs, index);  
            }  
        }  
        return val;  
    }  
}  



应用时,DAO中类似代码示例:


List<Object> list = this.getJdbcTemplate().query(sql, new AutoBoxingRowMapper(Department.class,false));  
          
Map<String,Object> map = this.callProcedure(procName, new Object[]{deptNo,0,5}, new AutoBoxingRowMapper(Employee.class,false),true);

分享到:
评论

相关推荐

    Java利用Freemarker模板自动生成dto、dao、rowmapper、bo、service代码

    Java开发中,自动化的代码生成可以极大地提高开发效率,减少重复劳动。本主题涉及的核心技术是使用Freemarker模板引擎来生成DTO(Data Transfer Object)、DAO(Data Access Object)、RowMapper、BO(Business ...

    JAVA 版本ResultSet 转换为JAVABEAN的工具类

    这个工具类虽然简洁,但在实际应用中可能需要进行扩展,比如处理多行数据、处理自定义类型、异常处理等。此外,如果你使用的是Spring框架,可以考虑使用RowMapper或者JPA的EntityGraph来实现相同的功能,这些内置...

    使用java实现OR框架

    然后在Java中创建对应的实体类`User`,这个类的属性和表的字段相对应,通过getter和setter方法进行访问。 ```java public class User { private Long id; private String name; private String email; // ...

    JAVA调用ORACLE存储过程通用类

    - 创建一个内部匿名类`RowMapper`,用于从结果集中映射数据到Java对象。 - 使用`ProcedureUtil`工具类调用存储过程,并处理结果集。 ##### 3. 其他关键组件 - **`ProcedureUtil`**:这是一个自定义工具类,用于...

    Spring JdbcTemplate 常用方法整理

    通过`JsonBean.java`和`JdbcUtils.java`,我们可以看到如何在实际项目中定义数据模型类以及如何利用JdbcTemplate进行数据库操作。在使用时,注意事务管理和错误处理也是关键,以确保数据的一致性和应用程序的稳定性...

    java数据库操作封装.zip

    这个"java数据库操作封装.zip"压缩包中的文件,如JDBCcontrol.java、ConnectionManagement.java、PreparedStatementSetter.java和RowMapper.java,都是围绕这个目标设计的。下面我们将详细讲解这些类和接口的功能...

    java从mdb中读取并显示数据

    首先,要与mdb数据库进行交互,我们需要一个Java库,如JDBC-ODBC桥接器或者Apache的Jackcess库。JDBC-ODBC桥接器是Java标准版的一部分,允许通过ODBC数据源连接到各种数据库,包括Access。而Jackcess是一个开源库,...

    Java深入(1)

    `DefaultRowMapper.java`文件是Spring框架中的一个类,它实现了`RowMapper`接口。在Spring JDBC模块中,`RowMapper`接口是用于将数据库查询结果集(ResultSet)映射为Java对象的关键组件。`DefaultRowMapper`提供了...

    springJdbcDemo11_java_springjdbc_

    - 查询操作:使用`query(String sql, RowMapper&lt;T&gt; rowMapper)`方法执行SQL查询,将结果映射到Java对象。 - 更新操作:使用`update(String sql, Object... args)`方法执行SQL更新,如插入、删除或修改记录。 6. *...

    Spring-JDBC整合-MySQL8、java8版本

    本知识点主要聚焦于Spring框架的一个重要组件——Spring JDBC,以及如何将它与MySQL8数据库进行整合,同时考虑了Java 8的新特性。下面我们将深入探讨这个主题。 Spring JDBC模块是Spring框架对Java数据库连接(JDBC...

    java大批量导入excel,多线程加分片处理的dome

    - **分片读取数据**:自定义`ReadRowHolder`类实现`RowMapper`接口,用于根据当前分片的起始和结束位置读取Excel中的数据行。 ```java private static class ReadRowHolder implements RowMapper&lt;List&lt;String&gt;&gt; { ...

    S2dao架包集合

    - **RowMapper**:将数据库查询结果映射到Java对象的接口,S2dao提供了一些默认实现,如`BeanHandler`和`MapHandler`。 - **SqlBuilder**:用于构建SQL语句的工具类,可以根据条件动态生成SQL。 ### 4. 使用S2dao的...

    Web服务启动时自动加载Servlet,并读取数据库内容

    这里,我们使用`WebApplicationContextUtils`类来从Servlet上下文中获取Spring的WebApplicationContext,然后通过ApplicationContext获取Service层的bean。 下面是一个示例,展示了如何在Servlet中获取Service层的...

    匹配实体类的实现了大部分功能分页 网页分页

    例如,JdbcTemplate的`queryForList(String sql, Object[] args, RowMapper&lt;T&gt; rowMapper)`方法可以用来执行SQL查询,并通过RowMapper将结果映射为Java对象。 3. 实体类(Entity Class): 在数据库操作中,实体类...

    java分页实现(面向对象)

    在Java编程中,分页是数据管理中一个非常重要的概念,特别是在处理大量数据时,为了提高用户体验和系统性能,我们通常需要将数据分块显示,而不是一次性加载所有数据。本篇将详细介绍如何在Java中实现面向对象的分页...

    java使用druid1.0.1数据库连接池demo

    接下来,我们可以创建一个Java配置类,用来初始化Druid数据源: ```java @Configuration public class DruidConfig { @Bean public DataSource dataSource() { DruidDataSource dataSource = new Druid...

    SpringJdbcTemplate封装工具类

    - 如果是查询操作,可以使用`RowMapper`或`ResultSetExtractor`来映射结果到Java对象。 8. **性能考虑** 尽管SpringJdbcTemplate提供了便利,但在高并发、大数据量的场景下,可能需要考虑其性能。例如,大量数据...

    spring jdbc

    - `query(String sql, RowMapper&lt;T&gt; rowMapper)`:用于执行查询,`RowMapper`接口用于映射结果集中的每一行数据到Java对象。 - `update(String sql, Object... args)`:执行更新操作,参数可以是占位符的值。 - `...

    java基于jdbctemplate数据持久层操作封装

    - "基于jdbctemplate封装"可能包含一个或多个类文件,如BaseJdbcDao.java,它定义了通用的方法,以及针对特定业务的子DAO类,如UserDao.java,实现了用户相关的数据库操作。 7. **使用示例**: - 创建一个新的...

    java jdbc template

    Java JDBC 模板是Spring框架中的一个核心组件,主要用于简化Java数据库连接(JDBC)的操作。在传统的JDBC编程中,我们需要手动管理连接、预编译SQL语句、设置参数和处理结果集,这些繁琐的过程容易引入错误且不易...

Global site tag (gtag.js) - Google Analytics