【问题标题】:How to use MyBatis to iterate all fields of an object?如何使用 MyBatis 迭代一个对象的所有字段?
【发布时间】:2018-11-01 05:55:49
【问题描述】:

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

【问题讨论】:

  • 请举例说明你的班级和你的表格列
  • 请添加一些你的代码,以便我给你一些例子。

标签: java mysql sql mybatis


【解决方案1】:

Mybatis 在需要表达的地方使用OGNL,包括foreachcollection 属性。

OGNL allows 调用静态方法,以便您可以利用它。

使用默认脚本引擎(假设属性名称与列名称匹配)您可以执行以下操作来生成字段列表:

<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,因为我更喜欢使用velocity scripting engine。使用速度脚本引擎,这绝对可以做到:

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

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

您还需要通过将此配置添加到 mybatis-velocity.properties 来将公共 BeanUtils 类的引用添加到速度上下文:

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

【讨论】:

    【解决方案2】:

    您的 pojos properties should be consistent with the tables 列,并且自动映射应该为真。可能你得给你项目的一些代码,所以我会给你更多的建议

    【讨论】:

    • autoMapping和insert有什么关系?
    • 感谢提醒,自动映射与插入无关
    【解决方案3】:

    我认为你应该使用SQL语句select into来完成这个要求。

    【讨论】:

    • 欢迎来到 Stackoverflow。通过显示一些示例代码可以改进您的答案。这个问题专门针对 MyBatis,我想知道您的回答是否解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多