【发布时间】:2018-11-01 05:55:49
【问题描述】:
我想将对象的所有字段插入一行,但我不知道确切的字段名称。 MyBatis 支持吗?
【问题讨论】:
-
请举例说明你的班级和你的表格列
-
请添加一些你的代码,以便我给你一些例子。
我想将对象的所有字段插入一行,但我不知道确切的字段名称。 MyBatis 支持吗?
【问题讨论】:
Mybatis 在需要表达的地方使用OGNL,包括foreach 的collection 属性。
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
【讨论】:
您的 pojos properties should be consistent with the tables 列,并且自动映射应该为真。可能你得给你项目的一些代码,所以我会给你更多的建议
【讨论】:
autoMapping和insert有什么关系?
我认为你应该使用SQL语句select into来完成这个要求。
【讨论】: