日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【Spring学习】Spring JdbcTemplate之五类方法总结

發布時間:2024/4/14 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Spring学习】Spring JdbcTemplate之五类方法总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近寫了幾個同步數據的統計任務,使用到了JDBCTemplate的批處理,順手將JDBCTemplate的用法大概總結了一下。 JDBCTemplate主要提供了五類方法:
  • execute()方法:可用于執行任何sql語句,但是一般用來執行DDL語句;
  • update()以及batchUpdate()方法:update()方法用來執行增加、修改和刪除等語句;batchUpdate()方法用來執行批處理相關的語句;
  • query()以及queryForXxx():用來執行查詢相關的語句;
  • call()方法:用于執行存儲過程、函數相關的語句;
  • JDBCTemplate支持的回調類:
    • 預編譯語句及存儲過程創建回調:用于根據JDBCTemplate提供的連接創建相應的語句;
    1、PreparedStatementCreator:通過回調獲取JDBCTemplate提供的Connection,由用戶使用該Connection來創建相關的PreparedStatement;? ? ??代碼示例:jdbcTemplate.update(new PreparedStatementCreator(){@Overridepublic PreparedStatement createPreparedStatement(Connection conn) {PreparedStatement ps = null;final String sql = "******";try{ps = conn.prepareStatement(sql);ps.setString(1,UUID.randomUUID().toString());}catch(Exception e){logger.error("**** error " + e);}finally{conn.commit();}return ps;} }); 2、CallableStatementCreator:通過回調獲取JDBCTemplate提供的Connection,由用戶使用該Connection來創建相關的CallableStatement;代碼示例: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) {logger.error("call procedure error : " + e);log.setResultCode("-2");//調用存儲過程失敗}return cs;}}, new CallableStatementCallback(){@Overridepublic Object doInCallableStatement(CallableStatement cs) {String csStr = null;try {cs.execute();csStr = cs.getString(1);} catch (Exception e) {logger.error("call procedure error : " + e);log.setResultCode("-2");//調用存儲過程失敗}return csStr;//獲取輸出參數的值 }} );
    • 預編譯語句設值回調:用于給預編譯語句相應參數設值;
    1、PreparedStatementSetter:通過回調獲取JDBCTemplate提供的PreparedStatement,由用戶來對相應的預編譯語句的參數設值;2、BatchPreparedStatementSetter:類似于PreparedStatementSetter,但用于批處理,需要指定批處理的大小;
    • 自定義功能回調:提供給用戶一個擴展點,用戶可以在指定類型的擴展點執行任何數量需要的操作;
    1、ConnectionCallBack:通過回調獲取JDBCTemplate提供的Connection,用戶可在該Connection執行任何數量的操作;2、StatementCallBack:通過回調獲取JDBCTemplate提供的Statement,用戶可以在該Statement提供任何數量的操作;3、PreparedStatementCallBack:通過回調獲取JDBCTemplate提供的PreparedStatement,用戶可以在該PreparedStatement執行任何數量的操作;4、CallableStatementCallBack:通過回調獲取JDBCTemplate提供的CallableStatement,用戶可以在該CallableStatement執行任何數量的操作;
    • 結果集處理回調:通過回調處理ResultSet或將ResultSet轉換為需要的形式;
    1、RowMapper:用于將結果集每行數據轉換為需要的類型,用戶需實現方法mapRow(ResultSet rs, int rowNum)來完成將每行數據轉換為相應的類型。2、RowCallbackHandler:用于處理ResultSet的每一行結果,用戶需實現方法processRow(ResultSet rs)來完成處理,在該回調方法中無需執行rs.next(),該操作由JdbcTemplate來執行,用戶只需按行獲取數據然后處理即可。3、ResultSetExtractor:用于結果集數據提取,用戶需實現方法extractData(ResultSet rs)來處理結果集,用戶必須處理整個結果集;具體示例:1、預編譯語句或存儲過程創建回調,自定義功能回調使用:首先使用PreparedStatementCreator創建一個預編譯語句,其次由JdbcTemplate通過PreparedStatementCallback回調傳回,由用戶決定如何執行該PreparedStatement。此處我們使用的是execute方法。public void testPreparedStatement() { int count = jdbcTemplate.execute(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { return conn.prepareStatement("select count(*) from test"); }}, new PreparedStatementCallback<Integer>() { @Override public Integer doInPreparedStatement(PreparedStatement pstmt) throws SQLException, DataAccessException { pstmt.execute(); ResultSet rs = pstmt.getResultSet(); rs.next(); return rs.getInt(1); }}); } 2、預編譯語句設值回調使用:通過JdbcTemplate的int update(String sql, PreparedStatementSetter pss)執行預編譯sql,其中sql參數為“insert into TBL_SYS(name) values (?) ”,該sql有一個占位符需要在執行前設值,PreparedStatementSetter實現就是為了設值,使用setValues(PreparedStatement pstmt)回調方法設值相應的占位符位置的值。JdbcTemplate也提供一種更簡單的方式“update(String sql, Object[] args)”來實現設值,所以只要當使用該種方式不滿足需求時才應使用PreparedStatementSetter。public void testPreparedStatement() { String insertSql = "insert into TBL_SYS(name) values (?)"; int count = jdbcTemplate.update(insertSql, new PreparedStatementSetter() { @Override public void setValues(PreparedStatement pstmt) throws SQLException { pstmt.setObject(1, "name"); }}); //************************************************************** String deleteSql = "delete from TBL_SYS where name=?"; count = jdbcTemplate.update(deleteSql, new Object[] {"name"}); } 3、結果集處理回調:RowMapper接口提供mapRow(ResultSet rs, int rowNum)方法將結果集的每一行轉換為一個Map,當然可以轉換為其他類。public void testResultSet() { jdbcTemplate.update("insert into TBL_SYS(name) values('name')"); String listSql = "select * from TBL_SYS"; List result = jdbcTemplate.query(listSql, new RowMapper<Map>() { @Override public Map mapRow(ResultSet rs, int rowNum) throws SQLException { Map row = new HashMap(); row.put(rs.getInt("id"), rs.getString("name")); return row; }}); } RowCallbackHandler接口也提供方法processRow(ResultSet rs),能將結果集的行轉換為需要的形式。
    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對象

    3outValues:調用call方法將返回類型為Map<String, Object>對象;

    4outValues.get("result"):獲取結果,即通過SqlReturnResultSet對象轉換過的數據;其中SqlOutParameter、SqlInOutParameterSqlReturnResultSet指定的name用于從call執行后返回的Map中獲取相應的結果,即nameMap的鍵。

    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之五类方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。