- 浏览: 82240 次
- 性别:
- 来自: 天津
-
最新评论
-
may小张:
很管用!谢谢分享!
设置JTable的列宽 -
xiangyufangai:
谢谢 非常好
Struts2 Ajax -
lydawen:
lydawen 写道justry 写道这位大哥!
小弟不想使用 ...
Struts2 Ajax -
lydawen:
justry 写道这位大哥!
小弟不想使用 struts2内置 ...
Struts2 Ajax -
zhuzhu1124:
谢谢,学习了
Struts2 Ajax
自己写的Jdbc模板,使用了Template,Strategy,Call Back等,可以自动设置参数,并可以完成ResultSet到JTable以及List的自动映射。极大减少重复代码,比较经典。
PreparedStatementCallback 是用于回调的接口
PreparedStatementCallback 是用于回调的接口
public interface PreparedStatementCallback { public Object doInPreparedStatement(PreparedStatement pstmt) throws SQLException,ClassNotFoundException; }
public class JdbcTemplate { private static final Log logger = LogFactory.getLog(JdbcTemplate.class); /** * execute template * @param action * @param sql * @param arrayParams * @param mapParams * @return * @throws PersistenceException */ private Object execute(PreparedStatementCallback action, String sql, Object[] arrayParams,HashMap<Integer, Object> mapParams) throws PersistenceException{ Connection conn = null; PreparedStatement pstmt = null; Object result = null; try { conn = DataSourceFactory.getConnection(); conn.setAutoCommit(false); pstmt = conn.prepareStatement(sql); // call back result = action.doInPreparedStatement(pstmt); logger.debug(pstmt.toString()); conn.commit(); } catch (ClassNotFoundException e) { transactionRollback(conn); throw new PersistenceException(e); } catch (SQLException e) { transactionRollback(conn); throw new PersistenceException(e); } finally { this.closeStatement(pstmt); this.closeConnection(conn); } return result; } /** * hook method * @param sql * @param arrayParams * @param mapParams * @return * @throws PersistenceException */ private Object execute(final String sql,final Object[] arrayParams, final HashMap<Integer, Object> mapParams) throws PersistenceException{ PreparedStatementCallback callBack = new PreparedStatementCallback() { @Override public Object doInPreparedStatement(PreparedStatement pstmt) throws SQLException, ClassNotFoundException { if(arrayParams!=null) setParameter(pstmt, arrayParams); if(mapParams!=null) setParameter(pstmt, mapParams); int count = pstmt.executeUpdate(); return new Boolean(count > 0); } }; if(arrayParams!=null) return execute(callBack,sql,arrayParams,null); else if(mapParams!=null) return execute(callBack,sql,null,mapParams); else return execute(callBack,sql,null,null); } /** * hook method * @param sql * @param arrayParams * @param mapParams * @return * @throws PersistenceException */ private Object executeQuery(final String sql,final Object[] arrayParams,final HashMap<Integer, Object> mapParams) throws PersistenceException { PreparedStatementCallback callBack = new PreparedStatementCallback() { @Override public Object doInPreparedStatement(PreparedStatement pstmt) throws SQLException, ClassNotFoundException { if(arrayParams!=null) setParameter(pstmt, arrayParams); if(mapParams!=null) setParameter(pstmt, mapParams); ResultSet rs = pstmt.executeQuery(); return convertResultSetToList(rs); } }; if(arrayParams!=null) return execute(callBack,sql,arrayParams,null); else if(mapParams!=null) return execute(callBack,sql,null,mapParams); else return execute(callBack,sql,null,null); } public Object fillDataToTable(final String sql,final Object[] arrayParams) throws PersistenceException { PreparedStatementCallback callBack = new PreparedStatementCallback() { @Override public Object doInPreparedStatement(PreparedStatement pstmt) throws SQLException, ClassNotFoundException { if(arrayParams!=null) setParameter(pstmt, arrayParams); ResultSet rs = pstmt.executeQuery(); return convertResultSetToTable(rs); } }; return execute(callBack,sql,arrayParams,null); } public Object execute(String sql,Object[] arrayParams) throws PersistenceException{ return execute(sql,arrayParams,null); } public Object execute(String sql,HashMap<Integer, Object> mapParams) throws PersistenceException{ return execute(sql,null,mapParams); } public Object execute(String sql) throws PersistenceException{ return execute(sql,null,null); } public Object executeQuery(final String sql, final Object[] arrayParams) throws PersistenceException { return executeQuery(sql,arrayParams,null); } public Object executeQuery(final String sql, final HashMap<Integer, Object> mapParams) throws PersistenceException { return executeQuery(sql,null,mapParams); } public Object executeQuery(final String sql) throws PersistenceException { return executeQuery(sql,null,null); } /** * setParameter * @param sql * @param parameters HashMap<Integer, Object> * @return * @throws PersistenceException */ private PreparedStatement setParameter(PreparedStatement pstmt, HashMap<Integer, Object> parameters) throws ClassNotFoundException, SQLException { if (parameters!=null) { if (parameters.size()>=0) { for (int i = 1; i <= parameters.size(); i++) { try { if (parameters.get(i).getClass() == Class .forName("java.lang.String")) { pstmt.setString(i, parameters.get(i).toString()); } if (parameters.get(i).getClass() == Class .forName("java.sql.Date")) { pstmt.setDate(i, java.sql.Date.valueOf(parameters .get(i).toString())); } if (parameters.get(i).getClass() == Class .forName("java.lang.Boolean")) { pstmt.setBoolean(i, (Boolean) (parameters.get(i))); } if (parameters.get(i).getClass() == Class .forName("java.lang.Integer")) { pstmt.setInt(i, (Integer) parameters.get(i)); } if (parameters.get(i).getClass() == Class .forName("java.lang.Float")) { pstmt.setFloat(i, (Float) parameters.get(i)); } if (parameters.get(i).getClass() == Class .forName("java.lang.Double")) { pstmt.setDouble(i, (Double) parameters.get(i)); } } catch (ClassNotFoundException ex) { throw ex; } catch (SQLException ex) { throw ex; } } } } return pstmt; } /** * setParameter * @param sql * @param parameters Object[] * @return * @throws PersistenceException */ private PreparedStatement setParameter(PreparedStatement pstmt, Object[] parameters) throws ClassNotFoundException, SQLException { if (parameters!=null) { if (parameters.length>=0) { for (int i = 0; i < parameters.length; i++) { try { if (parameters[i].getClass() == Class .forName("java.lang.String")) { pstmt.setString(i+1, parameters[i].toString()); } if (parameters[i].getClass() == Class .forName("java.sql.Date")) { pstmt.setDate(i+1, java.sql.Date.valueOf(parameters[i].toString())); } if (parameters[i].getClass() == Class .forName("java.lang.Boolean")) { pstmt.setBoolean(i+1, (Boolean) (parameters[i])); } if (parameters[i].getClass() == Class .forName("java.lang.Integer")) { pstmt.setInt(i+1, (Integer) parameters[i]); } if (parameters[i].getClass() == Class .forName("java.lang.Float")) { pstmt.setFloat(i+1, (Float) parameters[i]); } if (parameters[i].getClass() == Class .forName("java.lang.Double")) { pstmt.setDouble(i+1, (Double) parameters[i]); } } catch (ClassNotFoundException ex) { throw ex; } catch (SQLException ex) { throw ex; } } } } return pstmt; } private List<HashMap<Object,Object>> convertResultSetToList( ResultSet rs) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); List<HashMap<Object, Object>> tempList = new ArrayList<HashMap<Object, Object>>(); HashMap<Object, Object> tempHash = null; try{ while (rs.next()) { tempHash = new HashMap<Object, Object>(); for (int i = 0; i < rsmd.getColumnCount(); i++) { tempHash.put(rsmd.getColumnName(i + 1).toUpperCase(), rs .getString(rsmd.getColumnName(i + 1))); } tempList.add(tempHash); } }catch(SQLException e){ throw e; } finally{ this.closeResultSet(rs); } return tempList; } private TableModel convertResultSetToTable(ResultSet rs) throws SQLException { DefaultTableModel tableModel = null; int columnCount = 0; ResultSetMetaData rsmd = null; try { tableModel = new DefaultTableModel(); tableModel.setRowCount(0); rsmd = rs.getMetaData(); columnCount = rsmd.getColumnCount(); String[] arr = new String[columnCount]; for(int i=0;i<columnCount;i++){ tableModel.addColumn(rsmd.getColumnName(i+1)); } while (rs.next()) { for (int i = 0; i < rsmd.getColumnCount(); i++) { arr[i] = rs.getString(rsmd.getColumnName(i + 1)); } tableModel.addRow(arr); } } catch (SQLException e) { throw e; } finally{ this.closeResultSet(rs); } return tableModel; } private void transactionRollback(Connection conn) { if (conn != null) { try { conn.rollback(); } catch (SQLException e) { logger.debug("Could not roll back transaction", e); } } } private void closeStatement(Statement stmt) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { logger.debug("Could not close JDBC Statement", e); } } } private void closeConnection(Connection conn){ if (conn != null) { try { conn.close(); } catch (SQLException e) { logger.debug("Could not close JDBC Statement", e); } } } private void closeResultSet(ResultSet rs){ if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.debug("Could not close ResultSet", e); } } } }
发表评论
-
Java enum
2008-12-07 14:18 2892使用enum可以方便的替代常量类。 /**enum可以单独 ... -
Java Reflection
2008-12-07 14:10 935public class Customer impleme ... -
JDK动态代理
2008-12-07 13:45 1194代理模式是给一个对象提供代理,以控制对它的访问,如只有授权用户 ... -
String str = new String("ABC")
2008-12-06 11:58 1283public class Test{ publi ... -
图形验证码
2008-12-05 00:35 999public class AuthImg extends ... -
Spring的Servlet启动监听器
2008-12-05 00:33 3668public class StartupListener ex ... -
MD5加密
2008-12-05 00:28 949public class SecurityByMD5 ... -
扩展Acegi框架 自定义权限处理
2008-12-05 00:26 1322Acegi默认不支持RBAC权限模型,需要自己扩展。对于数据的 ... -
制作启动界面
2008-12-05 00:17 976以前写的坦克大战的启动代码。 public class S ... -
设置JTable的列宽
2008-12-05 00:08 10491public class JTableUtil { ... -
XML解析之Digester
2008-12-04 23:26 1688Digester package lets you confi ... -
构建CVS项目到Version One
2008-11-30 23:57 1020以前用CVS的时候,一个新的项目需要频繁修改,还有很多文件、包 ... -
XML解析之DOM4j
2008-11-30 23:19 779Dom4j is an easy to use, open s ... -
XML解析之SAX
2008-11-27 00:48 1093SAX是一个用于处理XML事 ... -
XML解析之DOM
2008-11-27 00:36 855Sun公司提供了Java API for XML Parsin ... -
关于Java栈与堆的深入思考
2008-07-02 20:54 7691. 栈(stack)与堆(heap)都是 ... -
JDK环境变量配置
2008-04-28 15:21 1524Windows 1.增加系统变量JAVA_HOME = C:\ ...
相关推荐
通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种SQL操作,如查询、更新、插入和删除。 为了打印`JdbcTemplate`执行的SQL语句,我们需要关注以下几点: 1. **日志配置**:首先...
`JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL语句和结果集映射的繁琐工作。这个模板类封装了大部分与JDBC相关的低级细节,使开发者能够更专注于业务逻辑,而...
总结来说,`Spring`的`JdbcTemplate`和基于它的基类DAO设计是面向数据库操作的一种良好实践。它简化了与数据库的交互,提供了易于理解和使用的API,使得开发者能够更加专注于业务逻辑,而不是底层的数据库操作。通过...
2. **模板方法模式**:JdbcTemplate采用了设计模式中的模板方法模式,预先定义了一系列数据库操作的基本步骤,如执行SQL查询、更新、调用存储过程等,用户只需关注具体的SQL语句和参数即可。 3. **事务管理**:...
为了简化JDBC的使用,Spring框架提供了JDBCTemplate,它是一个基于模板方法设计模式的数据库访问类,能够帮助我们更安全、更高效地执行SQL语句。在这个"JDBCTemplate+JavaPOJO实现通用DAO"的项目中,我们将探讨如何...
这些方法通常被设计为易于理解和使用,同时提供了良好的错误处理机制。 #### 三、查询方法详解 ##### 1. `queryForInt()`与`queryForLong()` 这两种方法主要用于执行返回单一整型或长整型数值的SQL语句(如计数...
由于这个库主要是针对Oracle数据库设计的,所以很多特定的方法可能只适用于Oracle,比如处理lob类型数据、序列或者触发器相关的操作。在使用时,需要根据Oracle的特性和JdbcTemplate的API进行适当调整。
Spring的JdbcTemplate是Spring框架中的一个核心组件,用于简化数据库操作。它提供了一种模板方法模式,抽象出常见的...通过研究这个项目的代码,我们可以学习如何扩展Spring框架,以及如何更好地组织和设计数据访问层。
它提供了一种模板方法设计模式,使得开发者可以方便地执行SQL语句,而无需处理底层的JDBC细节。这个压缩包“jdbcTemplate相关jar包.zip”包含了与JdbcTemplate相关的五个核心库,这些库对于构建基于Spring的数据库...
在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...
4. **RESTful API设计**:REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,强调资源的表述状态转移。在本实例中,我们将使用HTTP动词(GET、POST、PUT、DELETE)来表示对资源的...
`JdbcTemplate`的泛型Dao实现是一种设计模式,目的是提高代码的可重用性和可维护性。通过定义一个泛型接口,我们可以创建一个通用的数据访问对象(DAO),这个DAO可以处理任何类型的实体类,只要它们遵循一定的规则...
Spring的JdbcTemplate是Spring框架为简化JDBC操作而设计的一个工具类库,它极大地降低了数据库访问的复杂性,使得开发者可以更加专注于业务逻辑,而不是繁琐的数据库连接管理和SQL语句的执行。JdbcTemplate通过一...
6. **模板方法设计模式**:通过重写模板方法,我们可以定制自己的数据库访问逻辑,比如添加额外的查询条件或者修改结果集的处理方式。 在描述中提到的博文中,作者可能详细分析了JdbcTemplate的使用方法,以及它...
**Spring-JdbcTemplate 知识详解** `Spring-JdbcTemplate` 是 Spring 框架中的一个核心模块,主要用于简化数据库操作,提供了强大的数据访问功能。它通过模板方法设计模式封装了 SQL 的执行,使得开发者无需直接与 ...
连接池是一种对象池设计模式的应用,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这大大减少了数据库连接的开销,提高了系统的响应速度和效率。常见的Java连接池实现有Apache的DBCP...
首先,Struts 是一个基于 Model-View-Controller(MVC)设计模式的开源Java Web框架。它的主要目标是提供一个结构化的框架,使得开发者可以更有效地管理前端视图、业务逻辑和数据访问层。在Struts框架中,控制器由...
基于java+Spring+SpringMVC+JDBCTemplate+JSP开发的博客论坛系统+源码+开发文档+视频演示,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java+Spring+...
它通过模板方法模式设计,允许我们在不丢失灵活性的情况下,保持代码的整洁和可读性。 在Spring应用中,`JdbcTemplate`通常作为依赖项注入到需要执行数据库操作的组件中,比如Servlet。为了在Servlet中注入`...
4. **HikariCP**: 这是一个高性能的Java数据库连接池,它的设计目标是提供最小的延迟和最佳的性能。 在Spring Boot中配置多数据源,我们需要创建两个或更多的数据源配置,每个数据源对应一个数据库。以下是一个基本...