继续上一篇的功能改造,小弟我发现每次都要根据自己定义的实体类去直接实现 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实现分页功能
本篇文章将深入探讨如何利用JdbcTemplate结合游标滚动来解决分页问题。 首先,我们要理解什么是游标滚动。在数据库中,游标允许我们从结果集中顺序地读取一行数据,也可以向前或向后移动,甚至可以在当前行上进行...
本文将深入探讨如何利用Spring的JdbcTemplate进行MySQL数据库的分页查询,并对其进行封装,提高代码的复用性和可维护性。 首先,了解Spring JdbcTemplate的基本用法。JdbcTemplate是Spring提供的一个模板类,用于...
### Oracle + jdbcTemplate + Spring + Java + Flex 实现分页 #### 一、Oracle存储过程分页 在Oracle数据库中,为了实现高效的分页查询,通常会采用存储过程的方式来完成。这种方式能够有效地减少网络传输的数据量...
4. **分页功能** SpringJdbcTemplate支持分页查询,通过`SimpleJdbcCall`或`NamedParameterJdbcCall`类,可以配合`RowCallbackHandler`或`ResultSetExtractor`处理分页结果。此外,还可以使用`JdbcPagingItemReader...
项目经理编写的这个`JDBCTemplate`框架,可能是基于Spring的`JdbcTemplate`进行了二次开发或者封装,以适应项目的特定需求。 `JdbcTemplate`的主要功能包括: 1. **参数绑定**:`JdbcTemplate`支持预编译的SQL语句...
JdbcTemplate 调用存储过程
这篇博客文章的标题"打印JdbcTemplate执行sql"主要涉及如何在使用`JdbcTemplate`时,追踪并打印出执行的SQL语句,这对于调试和性能分析非常有帮助。接下来,我们将深入探讨`JdbcTemplate`的工作原理以及如何实现SQL...
3. 执行分页查询:通过分页信息调用JdbcTemplate方法来返回结果集合。 JdbcTemplate的使用涉及到许多细节,如事务管理、异常处理和SQL注入防护等。在具体应用时,开发者需要结合实际业务需求和Spring框架的其他特性...
二、Spring JdbcTemplate的核心概念 1. **JdbcTemplate对象**:这是Spring JdbcTemplate的核心,它包含了执行SQL语句的所有方法,如update()用于更新,query()用于查询,insert()用于插入等。 2. **参数绑定**:...
在这个例子中,我们使用了`JdbcTemplate`的`batchUpdate`方法来进行批量更新操作,并且在调用该方法之前关闭了`Connection`对象的自动提交功能。如果在执行过程中发生了异常,比如主键冲突导致的插入失败,那么所有...
Spring MVC支持动态页面参数,可以配合JdbcTemplate的查询方法实现分页。开发者可以通过设置SQL的LIMIT和OFFSET子句来获取特定范围的数据,然后传递这些数据到视图进行渲染。同时,可以使用Spring提供的Pageable接口...
二、JdbcTemplate的使用 1. 配置JdbcTemplate 在Spring配置文件中,我们需要声明一个JdbcTemplate的bean,并注入数据源(DataSource)。例如: ```xml <bean id="jdbcTemplate" class="org.spring...
JdbcTemplate是Spring框架中的一个核心组件,主要用于简化Java应用程序对数据库的...通过下载并导入这个"jdbcTemplate相关jar包.zip",你可以开始学习和实践JdbcTemplate的相关功能,进一步提升你的数据库编程技能。
本示例将深入探讨`JdbcTemplate`的使用,包括其核心功能以及如何进行CRUD(创建、读取、更新和删除)操作。 `JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL...
首先,JdbcTemplate的核心功能在于它提供了一系列的方法来执行SQL语句,包括查询、更新、插入和删除等操作。这些方法通常会返回一个受影响的行数或结果集。例如: 1. `update(String sql, Object... args)`:用于...
本文档主要讨论如何利用Oracle存储过程、jdbcTemplate(Spring框架的一个组件)以及Flex前端实现这一功能。 首先,Oracle存储过程是实现分页的关键部分。在Oracle中,可以通过创建存储过程来动态构造SQL语句,以...
4. **事务管理**:如果需要在多个数据库操作之间保持一致性,可以利用JdbcTemplate提供的事务管理功能。你可以使用`@Transactional`注解来声明一个方法需要在事务内执行。 ```java @Service @Transactional public ...