日期:2014-05-16  浏览次数:20420 次

JdbcTemplate的封装~

? 贴一个很好用的 JdbcTemplate的封装~

? 总有人说Hibernate在特殊情况下多不好用多不好用~

? 只是我认为,一个系统中 jdbc 和 Orm 共存是必要滴。

?

? 分享分享~代码非我所写。 我的第一个导师 czp 写的。

? 现在他已经不在这里干了,据说是念博去了 ~

? 只是我知道那不太现实,他可能是做的不爽就闪人了吧.

?

? 纪念我的 志平~ 。

?

? 欢迎 直接copy走,不过copy的时候,帮我祝福下志平~

?

?

package com.cnc.erp.jdbc;

import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSet;
import org.springframework.util.Assert;

import com.cnc.erp.cfg.Globals;
import com.cnc.erp.jdbc.permission.RecordPermissionChecker;
import com.cnc.erp.jdbc.support.QueryObject;
import com.cnc.erp.jdbc.support.QueryParam;
import com.cnc.erp.jdbc.support.QuerySqlParser;
import com.cnc.erp.jdbc.support.QueryWebParameter;
import com.cnc.erp.jdbc.support.QueryWebUtils;
import com.cnc.erp.util.Log;
import com.cnc.erp.util.SqlUtil;
import com.cnc.erp.util.StringUtil;

/**
 * 基于spring NamedParameterJdbcTemplate封装的jdbc操作
 * 
 * 待补充的功能:TODO 1)、中间需要增加sql 函数的转换;日志、异常的处理 <br>
 * 2)、另外结合实际需要直接给出xml数据格式
 * 
 * @author 陈志平 chenzp
 * @desc CriteriaPage.java
 * 
 * @说明: web 应用基础平台
 * @date Aug 1, 2006 4:57:47 PM
 * @版权所有: All Right Reserved 2006-2008
 */
public class JdbcDAOImpl extends NamedParameterJdbcDaoSupport implements
		IJdbcDAO {

	// protected Log log = LogFactory.getLog(getClass());

	public JdbcDAOImpl() {
	}

	public JdbcOperations getJdbcOperations() {
		return getNamedParameterJdbcTemplate().getJdbcOperations();
	}

	/**
	 * 直接执行一条sql
	 * 
	 * @param sql
	 */
	public void execute(String sql) {
		Assert.hasText(sql, "sql must be not null");
		getJdbcOperations().execute(sql);
	}

	/**
	 * 可直接运行的sql语句数组
	 * 
	 * @param sql
	 *            update ca_user set a ='newea' ,b=3 where c = 5
	 * @return
	 */
	public int[] batchUpdate(String[] sql) {
		return getJdbcOperations().batchUpdate(sql);
	}

	/**
	 * 注意:这里的sql不支持 命名参数,只能用 ? 代替
	 * 
	 * @param sql
	 *            update ca_user set a =? ,b=? where c = ?
	 * @param dataSet
	 *            List<String[]>
	 * @return
	 */
	public int[] batchUpdate(String sql, final List<String[]> dataSet) {
		BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {

			public int getBatchSize() {
				return dataSet.size();
			}

			public void setValues(PreparedStatement psmt, int i) {
				String[] obj = dataSet.get(i);
				try {
					for (int j = 0; j < obj.length; j++) {
						psmt.setString(j + 1, obj[j]);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};

		return getJdbcOperations().batchUpdate(sql, setter);

	}

	/**
	 * 更新sql语句的执行,没有参数的情况
	 * 
	 * @param sql
	 * @return 受影响的行数
	 */
	public boolean update(String sql) {
		Assert.hasText(sql, "sql must be not null");
		return getJdbcOperations().update(sql) > 0;
	}

	/**
	 * 只有一个参数更新语句执行
	 * 
	 * @param sql:更新语句
	 * @param paramMap:命名参数
	 * @return 受影响的行数
	 */
	public boolean update(String sql, String namedParam, Object value) {
		Map<String, Object> paramMap = new HashMap<String, Object>(1);
		paramMap.put(StringUtil.strnull(namedParam), value);
		return update(sql, paramMap);
	}

	/**
	 * 更新语句执行
	 * 
	 * @param sql:更新语句
	 * @param p