Spring 5 中文解析數據存儲篇-JDBC數據存儲(中)
{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"3.5 JDBC批量操作"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果將多個調用批處理到同一條準備好的語句,則大多數JDBC驅動程序都會提高性能。通過將更新分組成批,可以限制到數據庫的往返次數。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"###### 3.5.3 使用JdbcTemplate的基本批處理操作"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過實現特殊接口的兩個方法BatchPreparedStatementSetter並將該實現作爲batchUpdate方法調用中的第二個參數傳入,可以完成JdbcTemplate批處理。你可以使用getBatchSize方法提供當前批處理的大小。你可以使用setValues方法設置語句的參數值。此方法稱爲你在getBatchSize調用中指定的次數。以下示例根據列表中的條目更新t_actor表,並將整個列表用作批處理:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"public class JdbcActorDao implements ActorDao {\n\n private JdbcTemplate jdbcTemplate;\n\n public void setDataSource(DataSource dataSource) {\n this.jdbcTemplate = new JdbcTemplate(dataSource);\n }\n\n public int[] batchUpdate(final List actors) {\n return this.jdbcTemplate.batchUpdate(\n \"update t_actor set first_name = ?, last_name = ? where id = ?\",\n new BatchPreparedStatementSetter() {\n public void setValues(PreparedStatement ps, int i) throws SQLException {\n Actor actor = actors.get(i);\n ps.setString(1, actor.getFirstName());\n ps.setString(2, actor.getLastName());\n ps.setLong(3, actor.getId().longValue());\n }\n public int getBatchSize() {\n return actors.size();\n }\n });\n }\n\n // ... additional methods\n}"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果處理更新流或從文件讀取,則可能具有首選的批處理大小,但最後一批可能沒有該數量的條目(譯者:意思是最後一批數據可能沒有分割數量大)。在這種情況下,可以使用InterruptibleBatchPreparedStatementSetter接口,該接口可在輸入源耗盡後中斷批處理(譯者:意思是數據源數據消耗完)。isBatchExhausted方法使你可以發出批處理結束的信號。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"###### 3.5.2 批處理操作的對象列表"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"JdbcTemplate和NamedParameterJdbcTemplate都提供了另一種提供批處理更新的方式。無需實現特殊的批處理接口,而是將調用中的所有參數值作爲列表提供。框架循環這些值,並使用一個內部語句setter。API會有所不同,具體取決於你是否使用命名參數。對於命名參數,你提供一個SqlParameterSource數組,該批處理的每個成員都有一個條目。你可以使用SqlParameterSourceUtils.createBatch便捷方法創建此數組,傳入一個bean樣式的對象數組(帶有與參數相對應的getter方法),字符串鍵Map實例(包含對應的參數作爲值),或者混合使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下示例顯示使用命名參數的批處理更新:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"public class JdbcActorDao implements ActorDao {\n\n private NamedParameterTemplate namedParameterJdbcTemplate;\n\n public void setDataSource(DataSource dataSource) {\n this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);\n }\n\n public int[] batchUpdate(List actors) {\n return this.namedParameterJdbcTemplate.batchUpdate(\n \"update t_actor set first_name = :firstName, last_name = :lastName where id = :id\",\n SqlParameterSourceUtils.createBatch(actors));\n }\n\n // ... additional methods\n}"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於使用經典的SQL語句"},{"type":"codeinline","content":[{"type":"text","text":"?"}]},{"type":"text","text":"佔位符,則傳入包含更新值的對象數組的列表。該對象數組在SQL語句中的每個佔位符必須具有一個條目,並且它們的順序必須與SQL語句中定義的順序相同。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下示例與前面的示例相同,不同之處在於它使用經典的JDBC"},{"type":"codeinline","content":[{"type":"text","text":"?"}]},{"type":"text","text":"佔位符:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"public class JdbcActorDao implements ActorDao {\n\n private JdbcTemplate jdbcTemplate;\n\n public void setDataSource(DataSource dataSource) {\n this.jdbcTemplate = new JdbcTemplate(dataSource);\n }\n\n public int[] batchUpdate(final List actors) {\n List
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.