`
zhq_tony
  • 浏览: 30186 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(原创)JDBCTemplate 分页 功能改造 (二)

阅读更多

 

    继续上一篇的功能改造,小弟我发现每次都要根据自己定义的实体类去直接实现 PageTemplate类中private List ResultSetForList(ResultSet rs, RowMapper rm)方法中的RowMapper方法,实在是很麻烦,不但要定义实体类,每次对应不同的实体类,总是需要实现RowMapper,麻烦死了。自己根据反射机制的一部分写了一个从记录集映射实体类的小东西。下面就和大家分享一下。

 

1.DefaultMapper类

实现RowMapper 接口的基类

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.free.source.plusin.ResultSet4Bean;

public class DefaultMapper implements RowMapper {

private ResultSet4Bean rsb;

public DefaultMapper(String className)
{
   rsb=new ResultSet4Bean(className);
}
public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
   Object obj=new Object();
   try {
    obj=rsb.getBeanObject(arg0);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return obj;
}

}

红色的部分就是关键了。自己写的封装注入对象的类。

 

2.ResultSet4Bean类

用于封装记录集映射实体类。

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;

import com.free.source.plusin.resultset.IResultSetWrapper;
import com.free.source.plusin.resultset.ResultSetWrapperImpl;

/**
* @author TonyDev
*
*/
public class ResultSet4Bean {

private IResultSetWrapper rsp;

private BeanWrapper bw;

private String className;

public ResultSet4Bean(String className) {
   this.className = className;
   init();
}

private void init() {
   rsp = new ResultSetWrapperImpl();
}

public Object getBeanObject(ResultSet rs) throws InstantiationException,
    IllegalAccessException, ClassNotFoundException,
    IntrospectionException, SQLException, IllegalArgumentException,
    InvocationTargetException {
   bw = new BeanWrapper(this.className);

   Map<String, Object> hm = rsp.setWrapper(rs);

   if (hm.size() > 0) {
    bw.setProperty(hm);
   }

   return bw.getObj();
}

}

红色的部分是自己封装的类,请继续往下看。

 

3.IResultSetWrapper接口

用于获取记录集中实体字段属性的接口

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;

/**
* @author TonyDev
*
*/
public interface IResultSetWrapper {

public Map setWrapper(ResultSet rs) throws SQLException;
}

 

4.ResultSetWrapperImpl 类

用于实现IResultSetWrapper 接口

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
* @author TonyDev
*
*/
public class ResultSetWrapperImpl implements IResultSetWrapper {

/*
* (non-Javadoc)
*
*/

public Map setWrapper(ResultSet rs) throws SQLException {
   Map <String,Object> setMap = new HashMap <String,Object>();
  
  
    if ( rs.getRow()!=0) {

     ResultSetMetaData rsMetaData;
     try {
      rsMetaData = rs.getMetaData();
      int columnCount = rsMetaData.getColumnCount();
      for (int i = 0; i < columnCount; i++) {
     
       String columnName = rsMetaData.getColumnName(i + 1);
     
       setMap.put(columnName, rs.getObject(i + 1));

      }
     } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }

    }

   return setMap;
}
}

 

5.BeanWrapper 类

用于封装注入实体属性的类。

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
* @author TonyDev
*
*/
public class BeanWrapper {

private BeanInfo bf;

private Object obj;

/**
* 默认构造子,用于生成新的对象
* @param className
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
* @throws IntrospectionException
*/
public BeanWrapper(String className) throws InstantiationException,
    IllegalAccessException, ClassNotFoundException,
    IntrospectionException {
   obj = Class.forName(className).newInstance();
   bf = Introspector.getBeanInfo(obj.getClass());
}

/**
* 将参数注入对象
* @param resultsetMap
* @throws IntrospectionException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public void setProperty(Map resultsetMap) throws IntrospectionException,
    IllegalArgumentException, IllegalAccessException,
    InvocationTargetException {

   PropertyDescriptor[] propDescs = bf.getPropertyDescriptors();
   for (int i = 0; i < propDescs.length; i++) {
    if (!propDescs[i].getName().equals("class")) {
     String propName = propDescs[i].getName();
     Object mapObj = resultsetMap.get(propName);
     this.methodInvoke(propDescs[i], mapObj);
    }

   }

}

/**
* 参数注入到对象的方法
* @param selfObj
* @param valueObj
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
private void methodInvoke(PropertyDescriptor selfObj, Object valueObj)
    throws IllegalArgumentException, IllegalAccessException,
    InvocationTargetException {
   Method method = selfObj.getWriteMethod();
   Object arglist[] = new Object[1];

   arglist[0] = valueObj;
   method.invoke(obj, arglist);

}

public Object getObj() {
   return obj;
}

public void setObj(Object obj) {
   this.obj = obj;
}

}

红色的部分是自己定义的实体Bean的基本属性。

6.BeanInfos类

用于封装实体基本属性的类

/**
* @author TonyDev
*
*/
public class BeanInfos {

private String fieldName;    //属性名

private Class fieldType;    //属性类型

private Object fieldValue;    //属性值对象

public String getFieldName() {
   return fieldName;
}

public void setFieldName(String fieldName) {
   this.fieldName = fieldName;
}

public Class getFieldType() {
   return fieldType;
}

public void setFieldType(Class fieldType) {
   this.fieldType = fieldType;
}

public Object getFieldValue() {
   return fieldValue;
}

public void setFieldValue(Object fieldValue) {
   this.fieldValue = fieldValue;
}

}

以上的错误处理部分没做得太详细,还往大家自己开动脑筋。

由于自己发现了许多BUG,暂时不提供JAR包,我会尽快修正。之后再开放下载

分享到:
评论

相关推荐

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate实现分页功能

    jdbcTemplate分页彻底解决,使用游标滚动

    本篇文章将深入探讨如何利用JdbcTemplate结合游标滚动来解决分页问题。 首先,我们要理解什么是游标滚动。在数据库中,游标允许我们从结果集中顺序地读取一行数据,也可以向前或向后移动,甚至可以在当前行上进行...

    Spring jdbctemplate + mysql 分页封装

    本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页

    ### Oracle + jdbcTemplate + Spring + Java + Flex 实现分页 #### 一、Oracle存储过程分页 在Oracle数据库中,为了实现高效的分页查询,通常会采用存储过程的方式来完成。这种方式能够有效地减少网络传输的数据量...

    SpringJdbcTemplate封装工具类

    4. **分页功能** SpringJdbcTemplate支持分页查询,通过`SimpleJdbcCall`或`NamedParameterJdbcCall`类,可以配合`RowCallbackHandler`或`ResultSetExtractor`处理分页结果。此外,还可以使用`JdbcPagingItemReader...

    jdbcTemplate

    项目经理编写的这个`JDBCTemplate`框架,可能是基于Spring的`JdbcTemplate`进行了二次开发或者封装,以适应项目的特定需求。 `JdbcTemplate`的主要功能包括: 1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句...

    JdbcTemplate

    JdbcTemplate 调用存储过程

    打印JdbcTemplate执行sql

    这篇博客文章的标题"打印JdbcTemplate执行sql"主要涉及如何在使用`JdbcTemplate`时,追踪并打印出执行的SQL语句,这对于调试和性能分析非常有帮助。接下来,我们将深入探讨`JdbcTemplate`的工作原理以及如何实现SQL...

    Spring--JdbcTemplate.pdf

    3. 执行分页查询:通过分页信息调用JdbcTemplate方法来返回结果集合。 JdbcTemplate的使用涉及到许多细节,如事务管理、异常处理和SQL注入防护等。在具体应用时,开发者需要结合实际业务需求和Spring框架的其他特性...

    spring-jdbcTemplate实例工程

    二、Spring JdbcTemplate的核心概念 1. **JdbcTemplate对象**:这是Spring JdbcTemplate的核心,它包含了执行SQL语句的所有方法,如update()用于更新,query()用于查询,insert()用于插入等。 2. **参数绑定**:...

    JdbcTemplate的事务控制.docx

    在这个例子中,我们使用了`JdbcTemplate`的`batchUpdate`方法来进行批量更新操作,并且在调用该方法之前关闭了`Connection`对象的自动提交功能。如果在执行过程中发生了异常,比如主键冲突导致的插入失败,那么所有...

    SpringMvc+jdbcTemplate+mysql(注解)

    Spring MVC支持动态页面参数,可以配合JdbcTemplate的查询方法实现分页。开发者可以通过设置SQL的LIMIT和OFFSET子句来获取特定范围的数据,然后传递这些数据到视图进行渲染。同时,可以使用Spring提供的Pageable接口...

    spring jdbcTemplate

    二、JdbcTemplate的使用 1. 配置JdbcTemplate 在Spring配置文件中,我们需要声明一个JdbcTemplate的bean,并注入数据源(DataSource)。例如: ```xml &lt;bean id="jdbcTemplate" class="org.spring...

    jdbcTemplate相关jar包.zip

    JdbcTemplate是Spring框架中的一个核心组件,主要用于简化Java应用程序对数据库的...通过下载并导入这个"jdbcTemplate相关jar包.zip",你可以开始学习和实践JdbcTemplate的相关功能,进一步提升你的数据库编程技能。

    JdbcTemplate示例

    本示例将深入探讨`JdbcTemplate`的使用,包括其核心功能以及如何进行CRUD(创建、读取、更新和删除)操作。 `JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL...

    Spring JdbcTemplate 常用方法整理

    首先,JdbcTemplate的核心功能在于它提供了一系列的方法来执行SQL语句,包括查询、更新、插入和删除等操作。这些方法通常会返回一个受影响的行数或结果集。例如: 1. `update(String sql, Object... args)`:用于...

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页.docx

    本文档主要讨论如何利用Oracle存储过程、jdbcTemplate(Spring框架的一个组件)以及Flex前端实现这一功能。 首先,Oracle存储过程是实现分页的关键部分。在Oracle中,可以通过创建存储过程来动态构造SQL语句,以...

    spring的jdbcTemplate小案例

    4. **事务管理**:如果需要在多个数据库操作之间保持一致性,可以利用JdbcTemplate提供的事务管理功能。你可以使用`@Transactional`注解来声明一个方法需要在事务内执行。 ```java @Service @Transactional public ...

Global site tag (gtag.js) - Google Analytics