描述:在近期的项目中遇到了一个问题,调用存储过程时,本来想使用mybatis访问,但由于mybatis的复杂的XML文件配置及使用注解对以后更换访问方式的不方便性考虑,且在使用时只需要存入数据库对应的字段Map集合,就可以轻松的实现数据库的增、删、改、查。于是想到了SPring提供的访问Jdbc的模板,NamedParameterJdbcTemplate( 程安全的,可以同时被多个DAO调用,可通过Spring管理)类就可以轻松的实现数据库的字段与传入的参数进行绑定,并返回对应的Map类型的List集合(系统菜单和数据字典),通过遍历就可以轻松的实现对数据库的访问,具体的接口类和实现过程如下所示(事务管理暂未贴出):
文件配置:(ApplicationContxet.xml关键部分)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/> <property name="minPoolSize" value="${jdbc.minPoolSize}"/> <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/> <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/> <property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/> <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg index="0" ref="dataSource"/> </bean> <bean id="jdbcDao" class="com.szkingdom.dao.jdbc.impl.JdbcDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean>
DAO接口:
public interface IJdbcDao { public Map<String, Object> queryForMap(String procName, Map<String,Object> mapParams); public List<Map<String, Object>> queryForList(String procName, Map<String, Object> mapParams); public Object queryForObject(String procName, Map<String, Object> mapParams, Class<Object> sClass); public int update(String procName, Map<String, Object> mapParams); public int delete(String procName, Map<String, Object> mapParams); public int insert(String procName, Map<String, Object> mapParams); }
实现:
public class JdbcDaoImpl implements IJdbcDao { private NamedParameterJdbcTemplate jdbcTemplate; public JdbcDaoImpl() { } public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public Map<String, Object> queryForMap(String procName, Map<String, Object> mapParams){ String strSql = this.getSqlStr(procName, mapParams); return this.jdbcTemplate.queryForMap(strSql, mapParams); } public List<Map<String, Object>> queryForList(String procName, Map<String, Object> mapParams){ String strSql = this.getSqlStr(procName, mapParams); List<Map<String, Object>> list = this.jdbcTemplate.queryForList(strSql, mapParams); return list; } public Object queryForObject(String procName, Map<String, Object> mapParams, Class<Object> sClass) { String strSql = this.getSqlStr(procName, mapParams); Object obj = this.jdbcTemplate.queryForObject(strSql, mapParams, sClass); return obj; } public int update(String procName, Map<String, Object> mapParams) { String strSql = this.getSqlStr(procName, mapParams); return this.jdbcTemplate.update(strSql, mapParams); } public int delete(String procName, Map<String, Object> mapParams) { String strSql = this.getSqlStr(procName, mapParams); return this.jdbcTemplate.update(strSql, mapParams); } public int insert(String procName, Map<String, Object> mapParams) { String strSql = this.getSqlStr(procName, mapParams); return this.jdbcTemplate.update(strSql, mapParams); } public String getSqlStr(String procName, Map<String, Object> mapParams) { String sResult = ""; if(mapParams == null || mapParams.size() == 0) { sResult = "CALL " + procName + "()"; } else { StringBuffer buffer = new StringBuffer(); buffer.append("CALL "); buffer.append(procName); buffer.append("("); Map<String, Object> map = new LinkedHashMap<String, Object>(mapParams); for(Map.Entry<String, Object> en : map.entrySet()) { String sKey = en.getKey(); buffer.append(":" + sKey + ","); } buffer.delete(buffer.length() - 1, buffer.length()); buffer.append(")"); sResult = buffer.toString(); buffer.setLength(0); } return sResult; } }