首页 > 解决方案 > 如何使用 MyBatis 迭代一个对象的所有字段?

问题描述

我想将对象的所有字段插入一行,但我不知道确切的文件名。MyBatis 支持吗?

标签: javamysqlsqlmybatis

解决方案


Mybatis在需要表达式的地方使用OGNL ,包括.collectionforeach

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通过将此配置添加到以下配置来将公共类的引用添加到速度上下文mybatis-velocity.properties

additional.context.attributes=BeanUtils:org.apache.commons.beanutils.BeanUtils

推荐阅读