javascript
【Spring学习】Spring JdbcTemplate之五类方法总结
- 預編譯語句及存儲過程創建回調:用于根據JDBCTemplate提供的連接創建相應的語句;
- 預編譯語句設值回調:用于給預編譯語句相應參數設值;
- 自定義功能回調:提供給用戶一個擴展點,用戶可以在指定類型的擴展點執行任何數量需要的操作;
- 結果集處理回調:通過回調處理ResultSet或將ResultSet轉換為需要的形式;
public void testResultSet() { jdbcTemplate.update("insert into TBL_SYS(name) values('name')"); String listSql = "select * from TBL_SYS"; final List result = new ArrayList(); jdbcTemplate.query(listSql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { Map row = new HashMap(); row.put(rs.getInt("id"), rs.getString("name")); result.add(row); }}); } ResultSetExtractor使用回調方法extractData(ResultSet rs)提供給用戶整個結果集,讓用戶決定如何處理該結果集。
public void testResultSet() {jdbcTemplate.update("insert into TBL_SYS(name) values('name')"); String listSql = "select * from TBL_SYS"; List result = jdbcTemplate.query(listSql, new ResultSetExtractor<List>() { @Override public List extractData(ResultSet rs) throws SQLException, DataAccessException { List result = new ArrayList(); while(rs.next()) { Map row = new HashMap(); row.put(rs.getInt("id"), rs.getString("name")); result.add(row); } return result; }}); } 4、JDBCTemplate的queryForXxx()方法:
//1.查詢一行數據并返回int型結果 jdbcTemplate.queryForInt("select count(*) from TBL_SYS"); //2. 查詢一行數據并將該行數據轉換為Map返回 jdbcTemplate.queryForMap("select * from TBL_SYS where name='Tom'"); //3.查詢一行任何類型的數據,最后一個參數指定返回結果類型 jdbcTemplate.queryForObject("select count(*) from TBL_SYS", Integer.class); //4.查詢一批數據,默認將每行數據轉換為Map jdbcTemplate.queryForList("select * from TBL_SYS"); //5.只查詢一列數據列表,列類型是String類型,列名字是name jdbcTemplate.queryForList("select name from TBL_SYS where name=?", new Object[]{"Tom"}, String.class); //6.查詢一批數據,返回為SqlRowSet,類似于ResultSet,但不再綁定到連接上 SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from TBL_SYS"); 5、存儲過程及函數回調:存儲過程回調:
方法一:
首先使用CallableStatementCreator?創建一個預編譯語句,其次由JdbcTemplate通過CallableStatementCallback?回調傳回,由用戶決定如何執行該CallableStatement?。此處我們使用的是execute方法。
public static void callProcedure() {jdbcTemplate.execute(new CallableStatementCreator(){@Overridepublic CallableStatement createCallableStatement(Connection connection) {String procedure = "{call PRC_BJ_SYNC_CIRCUIT_DATA_ALL (?)}";//存儲過程CallableStatement cs = null;try {cs = connection.prepareCall(procedure);cs.registerOutParameter(1,OracleTypes.VARCHAR);//注冊輸出參數的類型} catch (Exception e) {}return cs;}}, new CallableStatementCallback(){@Overridepublic Object doInCallableStatement(CallableStatement cs) {String csStr = null;try {cs.execute();csStr = cs.getString(1);} catch (Exception e) {}return csStr;//獲取輸出參數的值 }}); } 方法二:public void testCallableStatementCreator() { final String callProcedureSql = "{call PROCEDURE_TEST(?, ?)}"; List<SqlParameter> params = new ArrayList<SqlParameter>(); params.add(new SqlInOutParameter("inOutName", Types.VARCHAR)); params.add(new SqlOutParameter("outId", Types.INTEGER)); // outValues:通過SqlInOutParameter及SqlOutParameter參數定義的name來獲取存儲過程結果Map<String, Object> outValues = jdbcTemplate.call( new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection conn) throws SQLException { CallableStatement cstmt = conn.prepareCall(callProcedureSql); cstmt.registerOutParameter(1, Types.VARCHAR); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.setString(1, "test"); return cstmt; }}, params); }自定義函數回調:
1、params:用于描述自定義函數占位符參數或命名參數類型;SqlParameter用于描述IN類型參數、SqlOutParameter用于描述OUT類型參數、SqlInOutParameter用于描述INOUT類型參數、SqlReturnResultSet用于描述調用存儲過程或自定義函數返回的ResultSet類型數據,其中SqlReturnResultSet需要提供結果集處理回調用于將結果集轉換為相應的形式,hsqldb自定義函數返回值是ResultSet類型。
2、CallableStatementCreator:提供Connection對象用于創建CallableStatement對象
3、outValues:調用call方法將返回類型為Map<String, Object>對象;
4、outValues.get("result"):獲取結果,即通過SqlReturnResultSet對象轉換過的數據;其中SqlOutParameter、SqlInOutParameter、SqlReturnResultSet指定的name用于從call執行后返回的Map中獲取相應的結果,即name是Map的鍵。
public void testCallableStatementCreator() { final String callFunctionSql = "{call FUNCTION_TEST(?)}"; List<SqlParameter> params = new ArrayList<SqlParameter>(); params.add(new SqlParameter(Types.VARCHAR)); params.add(new SqlReturnResultSet("result",new ResultSetExtractor<Integer>() { @Override public Integer extractData(ResultSet rs) throws SQLException,DataAccessException { while(rs.next()) { return rs.getInt(1); } return 0; })); Map<String, Object> outValues = jdbcTemplate.call(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection conn) throws SQLException { CallableStatement cstmt = conn.prepareCall(callFunctionSql); cstmt.setString(1, "test");return cstmt; }}, params); }?幾種具體使用:
1、調用無返回值的存儲過程
public class callProcedure { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void test(){ this.jdbcTemplate.execute("{call procedureName (?)}"); } } 2、調用有返回值的存儲過程(不是結果集)
public class test { /** * 調用無參的存儲過程(有返回值) * @return */ public static int callProcedure() { String str = (String)jdbcTemplate.execute(new CallableStatementCreator(){ @Override public CallableStatement createCallableStatement(Connection connection) { String procedure = "{call PRC_BJ_SYNC_CIRCUIT_DATA_INCRE (?)}";//存儲過程 CallableStatement cs = null;//創建存儲過程的對象 try { cs = connection.prepareCall(procedure); cs.registerOutParameter(1,OracleTypes.VARCHAR);//注冊輸出參數的類型 } catch (Exception e) { logger.error("call procedure error : " + e); } return cs; } }, new CallableStatementCallback(){ @Override public Object doInCallableStatement(CallableStatement cs) { String csStr = null; try { cs.execute(); csStr = cs.getString(1);//獲取輸出參數的值 } catch (Exception e) { logger.error("call procedure error : " + e); } return csStr;//獲取輸出參數的值 }}); return Integer.parseInt(str); } /** * 調用有參的存儲過程(有返回值) * @return */ public static int callProcedure() { String str = (String)jdbcTemplate.execute(new CallableStatementCreator(){ @Override public CallableStatement createCallableStatement(Connection connection) { String procedure = "{call PRC_BJ_SYNC_CIRCUIT_DATA_INCRE (?,?)}";//存儲過程 CallableStatement cs = null;//創建存儲過程的對象 try { cs = connection.prepareCall(procedure); cs.setString(1,"value1");//設置入參的值 cs.registerOutParameter(1,OracleTypes.VARCHAR);//注冊輸出參數的類型 } catch (Exception e) { logger.error("call procedure error : " + e); } return cs; } }, new CallableStatementCallback(){ @Override public Object doInCallableStatement(CallableStatement cs) { String csStr = null; try { cs.execute(); csStr = cs.getString(2);//獲取輸出參數的值 } catch (Exception e) { logger.error("call procedure error : " + e); } return csStr;//獲取輸出參數的值 }}); return Integer.parseInt(str); } } 3、調用有返回值的存儲過程(是結果集)
public class test { List resultList = (List) jdbcTemplate.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { String storedProc = "{call PRC_BJ_SYNC_CUST_DATA(?,?)}";// 調用的sql CallableStatement cs = con.prepareCall(storedProc); cs.setString(1, "p1");// 設置輸入參數的值 cs.registerOutParameter(2, OracleTypes.CURSOR);// 注冊輸出參數的類型 return cs; } }, new CallableStatementCallback() { public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException { List resultsMap = new ArrayList(); cs.execute(); ResultSet rs = (ResultSet) cs.getObject(2);// 獲取游標一行的值 while (rs.next()) {// 轉換每行的返回值到Map中 Map rowMap = new HashMap(); rowMap.put("id", rs.getString("id")); rowMap.put("name", rs.getString("name")); resultsMap.add(rowMap); } rs.close(); return resultsMap; } }); for (int i = 0; i < resultList.size(); i++) { Map rowMap = (Map) resultList.get(i); String id = rowMap.get("id").toString(); String name = rowMap.get("name").toString(); System.out.println("id=" + id + ";name=" + name); } }
總結
以上是生活随笔為你收集整理的【Spring学习】Spring JdbcTemplate之五类方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle序列小结
- 下一篇: Linux服务器下搭建JDK、Tomca