spring的jdbctemplate与 namedjdbctemplate的区别

本文详细对比了JdbcTemplate和NamedParameterJdbcTemplate在调用存储过程时的不同,包括参数设置方式和调用语法的区别,展示了具名参数在复杂查询中的优势。

1、调用存储过程不一样
2、后者能够用具名参数

        sql="{ call \"sp_account_member_fetch\"(?)}"; -- jdbctemplate的调用方式
        sql=" select * from \"sp_account_member_fetch\"(:id)";--namedjdbctemplate的使用方式

参数设置不一样:
1、
比如说,这个是jdbctemplate的调用存储过程方式:

 public PagerResult<Member> getPager(
            int pageindex,
            int pagesize,
            Integer cnd_id_eq,
            Integer cnd_region_id_eq,
            String cnd_name_like,
            String cnd_email_like,
            String cnd_mobile_eq,
            Timestamp cnd_regist_time_min,
            Timestamp cnd_regist_time_max,
            String cnd_wxopenid_eq,
            String cnd_unionid_eq,
            String sort_column,
            Boolean sort_by_asc

    ){
        int theParamIndex=0;
        PagerResult<Member> pagerResult=new PagerResult<>();
        pagerResult=jdbcTemplate.execute(new CallableStatementCreator() {
            @Override
            public CallableStatement createCallableStatement(Connection con) throws SQLException {

                String sql="";
                sql="{ call \"sp_account_member_getPager\"(?,?,?,?,?,?,?,?,?,?,?,?,?)}";
                CallableStatement st=con.prepareCall(sql);
                int paraIndex=1;
                st.setInt(paraIndex,pageindex);

                paraIndex++;
                st.setInt(paraIndex,pagesize);

                paraIndex++;
                st.setInt(paraIndex,cnd_id_eq);

                paraIndex++;
                st.setInt(paraIndex,cnd_region_id_eq);

                paraIndex++;
                st.setString(paraIndex,cnd_name_like);

                paraIndex++;
                st.setString(paraIndex,cnd_email_like);

                paraIndex++;
                st.setString(paraIndex,cnd_mobile_eq);

                paraIndex++;
                st.setTimestamp(paraIndex,cnd_regist_time_min);

                paraIndex++;
                st.setTimestamp(paraIndex,cnd_regist_time_max);

                paraIndex++;
                st.setString(paraIndex,cnd_wxopenid_eq);

                paraIndex++;
                st.setString(paraIndex,cnd_unionid_eq);


                paraIndex++;
                st.setString(paraIndex,sort_column);

                paraIndex++;
                st.setBoolean(paraIndex,sort_by_asc);

                return st;
            }
        },new CallableStatementCallback<PagerResult<Member>>(){
            @Override
            public PagerResult<Member> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                PagerResult<Member> pager=new PagerResult<>();
                List<Member> list=new ArrayList<>();
                cs.execute();
                ResultSet rs=(ResultSet)cs.getResultSet();
                if (rs.next()){
                    String json_str=rs.getString(1);
                    if(ValidateUtils.isEmpty(json_str)){
                        return pager;
                    }
                    pager=JSONObject.parseObject(json_str,PagerResult.class);
                }
                if (rs.next()){
                    String json_str=rs.getString(1);
                    if(ValidateUtils.isEmpty(json_str)){

                    }
                    else{
                        list=JSONObject.parseArray(json_str,Member.class);
                    }
                    pager.setData(new ArrayList<>());
                    for(Member item:list){
                        pager.getData().add(item);
                    }
                }
                rs.close();
                cs.getConnection().setAutoCommit(true);
                return pager;
            }
        });
        return pagerResult;
    }

而具名jdbctemplate则可以这样调用:

 @Autowired
    JdbcTemplate jdbcTemplate;
    @Autowired
    NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public PagerResult<Member> getPager(
            int pageindex,
            int pagesize,
            Integer cnd_id_eq,
            Integer cnd_region_id_eq,
            String cnd_name_like,
            String cnd_email_like,
            String cnd_mobile_eq,
            Timestamp cnd_regist_time_min,
            Timestamp cnd_regist_time_max,
            String cnd_wxopenid_eq,
            String cnd_unionid_eq,
            String sort_column,
            Boolean sort_by_asc

    ){
        int theParamIndex=0;
        PagerResult<Member> pagerResult=new PagerResult<>();


        String sql="";
        sql="{ call \"sp_account_member_getPager\"(?,?,?,?,?,?,?,?,?,?,?,?,?)}";
        sql="select * from \"sp_account_member_getPager\"(:pageindex,\n" +
                "            :pagesize,\n" +
                "            :cnd_id_eq,\n" +
                "            :cnd_region_id_eq,\n" +
                "            :cnd_name_like,\n" +
                "            :cnd_email_like,\n" +
                "            :cnd_mobile_eq,\n" +
                "            :cnd_regist_time_min,\n" +
                "            :cnd_regist_time_max,\n" +
                "            :cnd_wxopenid_eq,\n" +
                "            :cnd_unionid_eq,\n" +
                "            :sort_column,\n" +
                "            :sort_by_asc)";
        MapSqlParameterSource parameterSource=new MapSqlParameterSource();
        parameterSource.addValue("pageindex",pageindex);
        parameterSource.addValue("pagesize",pagesize);
        parameterSource.addValue("cnd_id_eq",cnd_id_eq);
        parameterSource.addValue("cnd_region_id_eq",cnd_region_id_eq);
        parameterSource.addValue("cnd_name_like",cnd_name_like);
        parameterSource.addValue("cnd_email_like",cnd_email_like);
        parameterSource.addValue("cnd_mobile_eq",cnd_mobile_eq);
        parameterSource.addValue("cnd_regist_time_min",cnd_regist_time_min);
        parameterSource.addValue("cnd_regist_time_max",cnd_regist_time_max);
        parameterSource.addValue("cnd_wxopenid_eq",cnd_wxopenid_eq);
        parameterSource.addValue("cnd_unionid_eq",cnd_unionid_eq);
        parameterSource.addValue("sort_column",sort_column);
        parameterSource.addValue("sort_by_asc",sort_by_asc);
        
        
        pagerResult=namedParameterJdbcTemplate.execute(sql, parameterSource, new PreparedStatementCallback<PagerResult<Member>>() {
            @Override
            public PagerResult<Member> doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
                PagerResult<Member> pager=new PagerResult<>();
                List<Member> list=new ArrayList<>();
                ps.execute();
                ResultSet rs=(ResultSet)ps.getResultSet();
                if (rs.next()){
                    String json_str=rs.getString(1);
                    if(ValidateUtils.isEmpty(json_str)){
                        return pager;
                    }
                    pager=JSONObject.parseObject(json_str,PagerResult.class);
                }
                if (rs.next()){
                    String json_str=rs.getString(1);
                    if(ValidateUtils.isEmpty(json_str)){

                    }
                    else{
                        list=JSONObject.parseArray(json_str,Member.class);
                    }
                    pager.setData(new ArrayList<>());
                    for(Member item:list){
                        pager.getData().add(item);
                    }
                }
                rs.close();
                ps.getConnection().setAutoCommit(true);
                return pager;
            }
        });

        return pagerResult;
    }

package com.sjsemi.lsmm.web.dao.impl; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback; import org.springframework.jdbc.support.lob.DefaultLobHandler; import org.springframework.jdbc.support.lob.LobCreator; import org.springframework.jdbc.support.lob.LobHandler; import org.springframework.stereotype.Repository; import com.sjsemi.common.Global; import com.sjsemi.common.constants.Database; import com.sjsemi.common.dao.CommonSQLDao; import com.sjsemi.common.exception.CommonException; import com.sjsemi.common.exception.UnknownDataSourceException; import com.sjsemi.common.model.DataEntry; import com.sjsemi.common.service.MailService; import com.sjsemi.lsmm.web.dao.WebCommonSQLDao; import oracle.jdbc.pool.OracleDataSource; import oracle.sql.BLOB; import com.sjsemi.prms.proxy.MailSendProxy; public class WebCommonSQLDaoImpl implements WebCommonSQLDao { private NamedParameterJdbcTemplate tysJdbcTemplate; public void setTysJdbcDataSource() { OracleDataSource oracleDataSource; try { oracleDataSource = new OracleDataSource(); oracleDataSource.setURL("jdbc:oracle:thin:@10.106.11.20:1521:ohsabdbs"); oracleDataSource.setUser("prms"); oracleDataSource.setPassword("prms4jowner"); tysJdbcTemplate = new NamedParameterJdbcTemplate(oracleDataSource); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Resource private MailService mailService; @Override public void updateSQL(String sql, Map<String, Object> paramMap, String dbName) { NamedParameterJdbcTemplate jdbcTemplate = this.getJdbcTemplate(dbName); MapSqlParameterSource sqlParamMap = new MapSqlParameterSource(); if (paramMap != null) { Entry<String, Object>[] entryArray = paramMap.entrySet().toArray(new Entry[1]); for (int i = 0; i <= entryArray.length - 1; i++) { Entry<String, Object> entry = entryArray[i]; if (entry != null) { sqlParamMap.addValue(entry.getKey(), entry.getValue()); } } } jdbcTemplate.update(sql, sqlParamMap); } @Override public List<Map<String, Object>> querySQL(String sql, Map<String, Object> paramMap, String dbName) { NamedParameterJdbcTemplate jdbcTemplate = this.getJdbcTemplate(dbName); List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); MapSqlParameterSource sqlParamMap = new MapSqlParameterSource(); if (paramMap != null) { Entry<String, Object>[] entryArray = paramMap.entrySet().toArray(new Entry[1]); for (int i = 0; i <= entryArray.length - 1; i++) { Entry<String, Object> entry = entryArray[i]; if (entry != null) { sqlParamMap.addValue(entry.getKey(), entry.getValue()); } } } resList = jdbcTemplate.queryForList(sql, sqlParamMap); return resList; } @Override public void updateBatchSQL(List<String> sqlList, String dbName) { for (String sql : sqlList) { updateSQL(sql, null, dbName); } } @Override public void updateBatchSQL(String sql, List<Map<String, Object>> paramMapList, String dbName) { Map<String, Object>[] mapArrType = new Map[0]; NamedParameterJdbcTemplate jdbcTemplate = this.getJdbcTemplate(dbName); jdbcTemplate.batchUpdate(sql, paramMapList.toArray(mapArrType)); } private NamedParameterJdbcTemplate getJdbcTemplate(String dbName) { if (dbName.equals(Database.DS_TYS_NAME)) { OracleDataSource oracleDataSource; try { oracleDataSource = new OracleDataSource(); oracleDataSource.setURL("jdbc:oracle:thin:@10.106.11.20:1521:ohsabdbs"); oracleDataSource.setUser("prms"); oracleDataSource.setPassword("prms4jowner"); return tysJdbcTemplate = new NamedParameterJdbcTemplate(oracleDataSource); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { throw new UnknownDataSourceException("Unknown DS: " + dbName); } return tysJdbcTemplate; } @Override public void updateBlobSQL(String sql, final Map<Integer, DataEntry> paramMap, String dbName) { NamedParameterJdbcTemplate namedJdbcTemplate = this.getJdbcTemplate(dbName); JdbcTemplate jdbcTemplate = (JdbcTemplate) namedJdbcTemplate.getJdbcOperations(); LobHandler lobHandler = new DefaultLobHandler(); jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(lobHandler) { protected void setValues(PreparedStatement stmt, LobCreator lobCreator) throws SQLException { for (Entry<Integer, DataEntry> entry : paramMap.entrySet()) { int key = entry.getKey(); DataEntry dataEntry = entry.getValue(); if(DataEntry.TYPE_BLOB_FILE.equals(dataEntry.getDataType())){ File file = (File)dataEntry.getDataValue(); if(file == null){ lobCreator.setBlobAsBytes(stmt, entry.getKey(), null); } else { InputStream is = null; try{ is = new FileInputStream(file); byte [] b = new byte[(int)file.length()]; is.read(b); lobCreator.setBlobAsBytes(stmt, entry.getKey(), b); } catch(Exception e){ throw new CommonException(e.getMessage()); }finally{ try{ is.close(); } catch(Exception e){} } } } else { stmt.setObject(key, dataEntry.getDataValue()); } } } }); } @Override public InputStream getBlobAsInputStream(String sql, Map<Integer, Object> paramMap, String dbName) { InputStream result = null; BLOB blob = null; try { blob = this.getBlob(sql, paramMap, dbName); result = blob.getBinaryStream(); } catch (Exception e) { throw new CommonException(e.getMessage()); } return result; } @Override public BLOB getBlob(String sql, Map<Integer, Object> paramMap, String dbName) { NamedParameterJdbcTemplate namedJdbcTemplate = this.getJdbcTemplate(dbName); JdbcTemplate jdbcTemplate = (JdbcTemplate) namedJdbcTemplate.getJdbcOperations(); Connection connection = null; PreparedStatement stmt = null; ResultSet rs = null; BLOB result = null; try { connection = jdbcTemplate.getDataSource().getConnection(); stmt = connection.prepareStatement(sql); for (Entry<Integer, Object> entry : paramMap.entrySet()) { int key = entry.getKey(); Object value = entry.getValue(); stmt.setObject(key, value); } rs = stmt.executeQuery(); if (rs.next()) { BLOB blob = (BLOB) rs.getBlob(1); if(blob.isEmptyLob() || blob.length() == 0){ result = null; } else { result = blob; } } } catch (Exception e) { String subject = "数据库"+dbName+"获取连接失败,请检查。"; MailSendProxy.sendMail(mailService, subject, "<br />" + e.getMessage(), Global.MAIL_BIZ_RECEIVERS, Global.MAIL_DEFAULT_RECEIVERS); } finally { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (Exception e) { e.printStackTrace(); } } } return result; } @Override public byte[] getBlobAsBytes(String sql, Map<Integer, Object> paramMap, String dbName) { byte [] result = null; BLOB blob = null; try { blob = this.getBlob(sql, paramMap, dbName); if(blob != null){ result = blob.getBytes(1, (int)blob.length()); } } catch (Exception e) { throw new CommonException(e.getMessage()); } return result; } } 改成读配置文件,例如: try { Properties properties = new Properties(); String path = Thread.currentThread().getContextClassLoader().getResource("").getPath(); String fileName = path + "config.properties"; try (InputStreamReader reader = new InputStreamReader(new FileInputStream(fileName), StandardCharsets.UTF_8)) { properties.load(reader); String rmsKey = properties.getProperty("rmsKey"); this.returnJsonToAjax(resp, AjaxCode.RETURN_SUCCESS, rmsKey); } } catch (Exception e) { throw new RmsManageException(e.getMessage()); }
最新发布
12-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值