Описание справочного фона: Обычно, если вам нужно обновлять несколько данных за раз, есть два способа обновить их один за другим. (1) Проверка бизнес -кода, чтобы обновить один за другим. (2) Обновите все данные одновременно (если быть более точным, это оператор SQL для обновления всех данных, поместите операции обновления один за другим на стороне базы данных, а стороной бизнес -кода является обновление всех данных одновременно). Два метода имеют свои плюсы и минусы. Следующее будет кратко анализировать плюсы и минусы двух методов и в основном введет реализацию второго метода в Mybatis.
Обновить один за другим
Этот метод, очевидно, является самым простым и наименее подверженным ошибкам. Даже если возникает ошибка, это только влияет на данные ошибки. Это может управлять каждой частью данных. Если обновление не удается или добивается успеха, оно может быть получено из того, какой контент обновляется до какого контента. Код может выглядеть так:
UpdateBatch (list <mydata> datas) {for (mydata data: datas) {try {mydatadao.update (data); // Обновление данных, обновление файла XML ниже в Mybatis} Catch (Exception e) {// Если обновление не удается, вы можете выполнять некоторые другие операции, такие как Mybatis, как MyBatis inpertize eRemantio <dupet> Обновить набор MyData ... где ... </update>Самая большая проблема с этим методом - проблема эффективности. Он обновляется один за другим и каждый раз подключается к базе данных, а затем обновляет, а затем выпускает ресурсы соединения (хотя эффективность часто подключенных данных может быть значительно улучшена через пул соединений, который не может противостоять большому количеству данных). Эта потеря будет отражать проблему эффективности, когда объем данных велик. Это также при удовлетворении потребностей бизнеса, обычно используется вторая реализация обновления партии (конечно, этот метод также имеет ограничения по шкале данных, что будет упомянуто позже).
Обновление партии SQL
Оператор SQL используется для обновления всех данных в партиях. Давайте посмотрим на то, как это обычно написано в Mybatis (удаление синтаксиса Mybatis является нативным заявлением SQL, поэтому я не говорю о том, как он написан в SQL).
<Update id = "updateBatch" parameterType = "java.util.list"> update myData_table set status = <foreach collection = "list" item = "item" index = "index" seperator = "" open = "case id" close = "cond"> #{item.id} then #{item.status} </for in id in id in in " #" #" #index. item = "item" sepreator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>Где, когда ... тогда ... синтаксис "Switch" в SQL. Здесь синтаксис Mybatis <foreach> Mybatis используется, чтобы собрать вместе пакетное обновление SQL. Приведенное выше означает, что поле состояния данных, передаваемых в списке идентификатора в параметре UpdateBatch, обновлено. Вы также можете использовать <Trim> для реализации той же функции, код следующим образом:
<Update id = "updateBatch" parameterType = "java.util.list"> update myData_table <trim prefix = "set" suffixOverrides = ","> <trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "> # #{item.Id}. </foreach> </trim> </trim>, где ID в <foreach collection = "list" index = "index" item = "item" sepeator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </uppletion><mit> Описание свойства
1.prefix, суффикс означает добавление контента спереди или после того, как деталь обернута в тег TRIM
2. Если есть префиксоверриды одновременно, суфксерриды означает, что содержание в переопределениях будет перезаписано префиксом и суффиксом.
3. Если только префиксоверриды, суфаксверриды означает удаление содержания, указанного XXXOVERIDES в начале или конце.
Приведенный выше код преобразуется в SQL следующим образом:
обновить myData_table set status = case over = #{item.id} Затем #{item.status} // Это должно быть значение <Foreach> расширение ... конец, где идентификатор в (...);Конечно, это самая простая реализация обновления партийного обновления. Иногда может потребоваться обновление нескольких полей, поэтому вам нужно
<trim prefix = "status = case" Suffix = "End,"> <foreach collection = "list" item = "item" index = "index"> over = #{item.id}, затем #{item.status} </foreach> </trim>Скопируйте несколько раз, измените содержимое префикса и когда ... тогда ... и если вам нужно установить значение по умолчанию для определенного поля, вы можете использовать Else
<trim prefix = "status = case" Suffix = "End,"> <foreach collection = "list" item = "item" index = "index"> over = #{item.id}, затем #{item.status} </foreach> else default_value </trim>Существует также более распространенная ситуация, когда необходимо оценить данные, которые необходимо обновлять, и только данные, соответствующие условиям, могут быть обновлены. Эта ситуация может быть сделана:
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null и item.status! = -1"> Когда id = #{item.id} Затем #{item.status} </if> </foreeach> В этом случае можно обновить только status != null && status != -1 Другие будут обновляться значениями по умолчанию, не сохраняя исходные данные неизменными. Что если вы хотите сохранить исходные данные без изменений? То есть обновления, которые соответствуют условиям, и те, которые не соответствуют условиям, остаются неизменными. Простой способ сделать это - добавить еще один <if>, потому что нет, если ... иначе ... синтаксис в Mybatis, но один и тот же эффект может быть достигнут с помощью множественного <fic>, следующим образом:
<trim prefix = "status = case" suffix = "end,"> <foreach collection = "list" item = "item" index = "index"> <if test = "item.status! = null и item.status! = -1"> Когда id = #{item.id} then #{item.status} </if> test = "item.status = int.trat или int.trat или int.t.tral или intatus. Когда id =#{item.id}, затем mydata_table.status // Это исходные данные </if> </foreach> </trim>Общее обновление партии написано следующим образом:
<Update id = "updateBatch" parameterType = "java.util.list"> Update myData_Table <trim prefix = "set" suffixOverrides = ","> <trim prefix = "case = case" Suffix = "End,"> <foreach collection = "list" item = "index ="> <if test = "item.stat! -1 "> Когда id =#{item.id} then#{item.status} </if> <if test =" item.status == null или item.status == -1 "> over =#{item.id} trimex_table.status // inriginal data </if> </for> </trim> </ritex = in id <for for in id </foreex = trim> </for in ideex = item = "item" sepreator = "," open = "(" close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>Этот метод пакетной и основной базы данных может обновить все данные в подключении к базе данных, избегая накладных расходов на частого заведения и отключения базы данных, а также значительно повысить эффективность обновления данных. Тем не менее, проблема в том, что если в ходе этого процесса возникает ошибка обновления, будет трудно понять, какие данные неверны. Если используется гарантия собственной транзакции данных, то после возникновения ошибки все обновления будут автоматически откачены. И этот метод часто более подвержен ошибкам. Следовательно, обычное решение состоит в том, чтобы поставить компромиссы, то есть обновлять часть ее партий (например, за один раз было обновлена лиц, в общей сложности 1000 элементов данных, и 100 элементов данных обновляются за раз). Это может разделить вероятность ошибок, и легче найти ошибку.
Конечно, если объем данных действительно большой, это партийное обновление также приведет к неэффективным обновлениям (например, если 100 элементов обновляются за раз, то если 1 миллиард данных обновляется, потребуется 10 миллионов раз, чтобы получить обновление 10 миллионов раз, а 10 миллионов баз данных будут установлены и отключены, что невыносимо). В настоящее время вы можете только рассмотреть другие решения, такие как введение механизма кэширования.
Суммировать
Выше приведено пакетный обновление, введенный редактором для вас, используя UpdateBatch в Mybatis. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!