ResultSet中结果反射
import java.lang.reflect.*; import java.sql.*; import java.util.*; import java.util.Date; public class ResultToBean { /** * 将ResultSet内容映射到实体 须有 ColToProperty注解 * @param rs * @param clazz * @return * @throws SecurityException * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws SQLException * @throws IllegalArgumentException * @throws InvocationTargetException */ public static <T> List<T> getBean(ResultSet rs, Class<T> clazz) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, SQLException, IllegalArgumentException, InvocationTargetException { List<T> l = new ArrayList<T>(); Method method = null; T obj = null; while (rs.next()) { obj = clazz.newInstance(); Field fs[] = clazz.getDeclaredFields(); int count = 1; for (Field f : fs) { ColToProperty colToProperty = f .getAnnotation(ColToProperty.class); if (null == colToProperty) { continue; } String m = f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1); if (f.getType() == java.lang.Boolean.class) { method = clazz.getDeclaredMethod("set" + m, Boolean.class); method.invoke(obj, rs.getBoolean(count)); } else if (f.getType() == boolean.class) { method = clazz.getDeclaredMethod("set" + m, boolean.class); method.invoke(obj, rs.getBoolean(count)); } else if (f.getType() == java.util.Date.class || f.getType() == Date.class) { method = clazz.getDeclaredMethod("set" + m, Date.class); method.invoke(obj, rs.getDate(count)); } else if (f.getType() == java.lang.Double.class) { method = clazz.getDeclaredMethod("set" + m, Double.class); method.invoke(obj, rs.getDouble(count)); } else if (f.getType() == Double.class) { method = clazz.getDeclaredMethod("set" + m, double.class); method.invoke(obj, rs.getDouble(count)); } else if (f.getType() == java.lang.Float.class) { method = clazz.getDeclaredMethod("set" + m, Float.class); method.invoke(obj, rs.getFloat(count)); } else if (f.getType() == Float.class) { method = clazz.getDeclaredMethod("set" + m, float.class); method.invoke(obj, rs.getFloat(count)); } else if (f.getType() == java.lang.Integer.class) { method = clazz.getDeclaredMethod("set" + m, Integer.class); method.invoke(obj, rs.getInt(count)); } else if (f.getType() == int.class) { method = clazz.getDeclaredMethod("set" + m, int.class); method.invoke(obj, rs.getInt(count)); } else if (f.getType() == java.lang.Short.class || f.getType() == short.class) { method = clazz.getDeclaredMethod("set" + m, Short.class); method.invoke(obj, rs.getShort(count)); } else if (f.getType() == java.lang.String.class) { method = clazz.getDeclaredMethod("set" + m, String.class); method.invoke(obj, rs.getString(count)); } else if (f.getType() == java.lang.Long.class || f.getType() == long.class) { method = clazz.getDeclaredMethod("set" + m, Long.class); method.invoke(obj, rs.getLong(count)); } else { throw new RuntimeException("非基础数据类型,无法正确匹配,请检查ColToProperty是否使用正确!"); } count++; } l.add(obj); } return l; } }
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface ColToProperty { }
相关推荐
通过使用JdbcTemplate,开发者可以避免编写大量的样板代码,如打开和关闭连接、处理结果集等,从而更加专注于业务逻辑。JdbcTemplate支持各种数据库操作,包括查询、更新、插入和删除,同时提供事务管理功能。 **2....
为了解决这个问题,我们需要调整创建`Statement`的方式以及处理结果集的方法: 1. **更改结果集类型**:在创建`Statement`对象时,应确保使用适当的结果集类型。如果需要执行像`absolute`这样的操作,必须创建一个...
例如,我们可以使用`SimpleJdbcCall`来执行存储过程,并提供一个`SqlParameterSource`来传递参数,再通过`ResultSetExtractor`或`RowCallbackHandler`来处理结果集: ```java SimpleJdbcCall storedProc = new ...
然后,`JdbcTemplate`会使用`ResultSetExtractor`接口来处理这个结果集。`SplitPageResultSetExtractor`可能就是这样一个自定义的提取器,用于分割结果集并进行分页处理。 下面是一个使用`JdbcTemplate`进行游标...
5. **处理结果**:对于查询操作,可以指定结果集的映射方式,如使用RowMapper或ResultSetExtractor。 在`jdbcTemplate`压缩包文件中,可能包含了实现上述功能的类、配置文件以及其他辅助工具类。这些文件可以帮助...
在Spring4版本中,JdbcTemplate已经成为了一个成熟的模块,它通过提供一系列的模板方法,使得开发者无需直接处理JDBC的低级细节,如手动打开和关闭连接、处理结果集等。这样不仅减少了出错的可能性,也使得代码更加...
Spring JdbcTemplate的出现是为了弥补原生JDBC在编码上的繁琐,它通过模板方法模式,将SQL执行、结果集处理等进行了抽象,使得开发者可以更专注于业务逻辑,而无需过多关注数据库访问的细节。同时,它还提供了事务...
JdbcTemplate是Spring提供的一个模板类,它是基于JDBC但又对JDBC进行了高度封装,旨在减少数据库访问时的繁琐代码,如打开和关闭连接、处理结果集等。它通过预编译的SQL语句、批处理以及异常转换等功能,实现了...
JdbcTemplate提供了一种简单、安全的方式来执行SQL语句,避免了手动处理数据库连接、预编译语句、结果集等繁琐工作,从而降低了出错的可能性。本压缩包“jdbcTemplate的jar包.rar”包含了使用Spring的JdbcTemplate所...
`UserRowMapper`是自定义的类,用于将结果集的每一行转换为`User`对象。 **3. 自动处理异常和资源关闭** JdbcTemplate会自动处理JDBC相关的异常,比如SQLException,并转换为Spring的DataAccessException。此外,...
5. 处理结果:JdbcTemplate会自动处理结果集,将数据转换为Java对象。 JdbcTemplate提供的主要API包括: - `query(String sql, RowMapper<T> rowMapper)`: 执行SQL查询并使用RowMapper将结果映射到自定义类型。 - `...
`JdbcTemplate`是Spring对JDBC的轻量级封装,它消除了手动管理连接、事务和结果集的繁琐过程,提高了代码的可读性和可维护性。通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种...
JdbcTemplate提供了一种模板方法模式,使得开发人员可以更加便捷、安全地执行SQL语句,而无需关心诸如打开和关闭连接、处理结果集等低级细节。 首先,我们来详细了解一下JdbcTemplate。在传统的JDBC编程中,我们...
在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...
JdbcTemplate通过预编译的SQL语句、参数绑定和结果集处理等功能,有效地降低了SQL注入的风险,同时也提高了代码的可读性和可维护性。 ### JdbcTemplate的核心特性 1. **自动管理连接**:JdbcTemplate会自动管理...
首先,让我们了解在不使用JDBCTemplate时,传统的JDBC操作通常涉及以下步骤:加载驱动、建立数据库连接、创建Statement或PreparedStatement对象、执行SQL、处理结果集、关闭资源。这个过程繁琐且容易出错,尤其是在...
这些方法通常会返回一个受影响的行数或结果集。例如: 1. `update(String sql, Object... args)`:用于执行更新操作,如INSERT、UPDATE和DELETE。`args`参数可以用来占位符替换,避免SQL注入问题。 2. `query...
在Java应用开发中,尤其是在企业级应用中,JDBCTemplate扮演了重要的角色,因为它提供了事务管理、异常转换、结果集处理等功能,极大地提升了开发效率。 JDBCTemplate的核心思想是将SQL语句和执行逻辑分离,通过预...