java - 如何使用 MyBatis 迭代一个对象的所有字段?
问题描述
我想将对象的所有字段插入一行,但我不知道确切的文件名。MyBatis 支持吗?
解决方案
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
通过将此配置添加到以下配置来将公共类的引用添加到速度上下文mybatis-velocity.properties
:
additional.context.attributes=BeanUtils:org.apache.commons.beanutils.BeanUtils
推荐阅读
- javascript - 在网页中使用光滑的滑块后出现水平滚动条
- c# - VSIX:IErrorTag 工具提示内容未显示
- java - Spring/Hibernate 数据访问并发问题
- artifactory - 有没有办法使用 API 将存储库从 zip 导入到 jfrog 工件?
- r - 如何在r中获取整数的十进制值
- grails - 如果重命名 id 列,Grails 数据将不会绑定
- python - 在jetson nano上使用python opencv加载相机的问题
- python - ml-workspace 保留已安装的扩展和 pip,而不会因重新启动而丢失
- c# - 哪种 Azure 指标聚合类型返回十进制值?
- java - 使用 java.lang.ref.Cleaner 作为 Object.finalize 的替代品