Как использовать MyBatis для итерации всех полей объекта? - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу вставить все поля объекта в строку, но я не знаю точных имен полей. MyBatis поддерживает это?

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

ваш столбец pojo s properties should be consistent with the table s, и автоматическое отображение должно быть истинным. может быть, вы должны дать некоторые коды вашего проекта, поэтому я дам вам больше советов

0 голосов
/ 01 ноября 2018

Mybatis использует OGNL в местах, где ожидается выражение, включая collection атрибут foreach.

OGNL позволяет вызывать статические методы, чтобы вы могли использовать это.

С помощью обработчика сценариев по умолчанию (при условии, что имена свойств совпадают с именами столбцов), вы можете сделать что-то вроде этого для генерации списка полей:

<bind name="objectProperties"
  value="@org.apache.commons.beanutils.BeanUtils@describe(myParameter).entrySet()" />

INSERT INTO mytable (
  <foreach index="propertyName" item="propertyValue"
    collection="objectProperties" separator=",">
        ${propertyName}
  </foreach>
)
VALUES (
  <foreach index="propertyName" item="propertyValue"
    collection="objectProperties" separator=",">
        @{propertyValue}
  </foreach>
)

Обратите внимание, что это не было проверено и приведено здесь лишь для того, чтобы продемонстрировать идею, как вы можете подойти к этому.

Лично я не использовал foreach, так как предпочитаю использовать движок скриптинга скорости . С помощью движка скриптинга скорости это можно сделать:

#set( $objectProperties = $BeanUtils.describe($myParameter) )

INSERT INTO mytable (
  #foreach($property in $objectProperties)
    ${property.key}
  #end
)
VALUES (
  #foreach($property in $objectProperties)
    @{property.value}
  #end
)

Вам также необходимо добавить ссылку на класс BeanUtils commons в контекст скорости, добавив эту конфигурацию в mybatis-velocity.properties:

additional.context.attributes=BeanUtils:org.apache.commons.beanutils.BeanUtils
0 голосов
/ 01 ноября 2018

Я думаю, вам следует использовать оператор SQL select into для выполнения этого требования.

...