`
bearjava
  • 浏览: 82240 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

自己设计的JdbcTemplate

    博客分类:
  • Java
阅读更多
自己写的Jdbc模板,使用了Template,Strategy,Call Back等,可以自动设置参数,并可以完成ResultSet到JTable以及List的自动映射。极大减少重复代码,比较经典。

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);
			}
		}
	}
}

分享到:
评论
1 楼 iql 2009-03-16  
业务复杂时事务如何控制?

相关推荐

    打印JdbcTemplate执行sql

    通过使用模板方法设计模式,`JdbcTemplate`提供了一系列静态和非静态的方法来执行各种SQL操作,如查询、更新、插入和删除。 为了打印`JdbcTemplate`执行的SQL语句,我们需要关注以下几点: 1. **日志配置**:首先...

    JdbcTemplate示例

    `JdbcTemplate`是Spring为简化数据库访问而设计的一个抽象层,它消除了手动管理数据库连接、预编译SQL语句和结果集映射的繁琐工作。这个模板类封装了大部分与JDBC相关的低级细节,使开发者能够更专注于业务逻辑,而...

    spring的jdbctemplate的crud的基类dao

    总结来说,`Spring`的`JdbcTemplate`和基于它的基类DAO设计是面向数据库操作的一种良好实践。它简化了与数据库的交互,提供了易于理解和使用的API,使得开发者能够更加专注于业务逻辑,而不是底层的数据库操作。通过...

    jdbcTemplate的jar包.rar

    2. **模板方法模式**:JdbcTemplate采用了设计模式中的模板方法模式,预先定义了一系列数据库操作的基本步骤,如执行SQL查询、更新、调用存储过程等,用户只需关注具体的SQL语句和参数即可。 3. **事务管理**:...

    JDBCTemplate+JavaPOJO实现通用DAO

    为了简化JDBC的使用,Spring框架提供了JDBCTemplate,它是一个基于模板方法设计模式的数据库访问类,能够帮助我们更安全、更高效地执行SQL语句。在这个"JDBCTemplate+JavaPOJO实现通用DAO"的项目中,我们将探讨如何...

    JdbcTemplate查询

    这些方法通常被设计为易于理解和使用,同时提供了良好的错误处理机制。 #### 三、查询方法详解 ##### 1. `queryForInt()`与`queryForLong()` 这两种方法主要用于执行返回单一整型或长整型数值的SQL语句(如计数...

    Spring JdbcTemplate

    由于这个库主要是针对Oracle数据库设计的,所以很多特定的方法可能只适用于Oracle,比如处理lob类型数据、序列或者触发器相关的操作。在使用时,需要根据Oracle的特性和JdbcTemplate的API进行适当调整。

    一个简单的spring-jdbctemplate扩展

    Spring的JdbcTemplate是Spring框架中的一个核心组件,用于简化数据库操作。它提供了一种模板方法模式,抽象出常见的...通过研究这个项目的代码,我们可以学习如何扩展Spring框架,以及如何更好地组织和设计数据访问层。

    jdbcTemplate相关jar包.zip

    它提供了一种模板方法设计模式,使得开发者可以方便地执行SQL语句,而无需处理底层的JDBC细节。这个压缩包“jdbcTemplate相关jar包.zip”包含了与JdbcTemplate相关的五个核心库,这些库对于构建基于Spring的数据库...

    Spring JdbcTemplate api

    在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...

    SpringMVC整合jdbcTemplate实例

    4. **RESTful API设计**:REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,强调资源的表述状态转移。在本实例中,我们将使用HTTP动词(GET、POST、PUT、DELETE)来表示对资源的...

    JdbcTemplate通用泛型Dao实现

    `JdbcTemplate`的泛型Dao实现是一种设计模式,目的是提高代码的可重用性和可维护性。通过定义一个泛型接口,我们可以创建一个通用的数据访问对象(DAO),这个DAO可以处理任何类型的实体类,只要它们遵循一定的规则...

    Spirng-JdbcTemplate资料.docx

    Spring的JdbcTemplate是Spring框架为简化JDBC操作而设计的一个工具类库,它极大地降低了数据库访问的复杂性,使得开发者可以更加专注于业务逻辑,而不是繁琐的数据库连接管理和SQL语句的执行。JdbcTemplate通过一...

    jdbcTemplate-spring对jdbc的支持

    6. **模板方法设计模式**:通过重写模板方法,我们可以定制自己的数据库访问逻辑,比如添加额外的查询条件或者修改结果集的处理方式。 在描述中提到的博文中,作者可能详细分析了JdbcTemplate的使用方法,以及它...

    Spring-JdbcTemplate

    **Spring-JdbcTemplate 知识详解** `Spring-JdbcTemplate` 是 Spring 框架中的一个核心模块,主要用于简化数据库操作,提供了强大的数据访问功能。它通过模板方法设计模式封装了 SQL 的执行,使得开发者无需直接与 ...

    JDBC连接池&JDBCTemplate

    连接池是一种对象池设计模式的应用,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这大大减少了数据库连接的开销,提高了系统的响应速度和效率。常见的Java连接池实现有Apache的DBCP...

    struts+spring +jdbctemplate demo

    首先,Struts 是一个基于 Model-View-Controller(MVC)设计模式的开源Java Web框架。它的主要目标是提供一个结构化的框架,使得开发者可以更有效地管理前端视图、业务逻辑和数据访问层。在Struts框架中,控制器由...

    基于java+Spring+SpringMVC+JDBCTemplate+JSP开发的博客论坛系统+源码+开发文档+视频演示

    基于java+Spring+SpringMVC+JDBCTemplate+JSP开发的博客论坛系统+源码+开发文档+视频演示,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java+Spring+...

    spring jdbcTemplate 注入到servlet

    它通过模板方法模式设计,允许我们在不丢失灵活性的情况下,保持代码的整洁和可读性。 在Spring应用中,`JdbcTemplate`通常作为依赖项注入到需要执行数据库操作的组件中,比如Servlet。为了在Servlet中注入`...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    4. **HikariCP**: 这是一个高性能的Java数据库连接池,它的设计目标是提供最小的延迟和最佳的性能。 在Spring Boot中配置多数据源,我们需要创建两个或更多的数据源配置,每个数据源对应一个数据库。以下是一个基本...

Global site tag (gtag.js) - Google Analytics