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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.