微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mybatis 将预处理语句与 sql 注入混合使用

如何解决Mybatis 将预处理语句与 sql 注入混合使用

我有一个查询,我希望 Mybatis 将其视为 sql 注入,同时也将其视为准备好的语句。我使用的是 Mybatis xml 文件而不是注释。这是我正在尝试做的...

我的 java 对象正在传递一个包含 processId 和开始日期和结束日期的参数映射。 processId 是 WHERE 子句之前查询“顶部”的一部分。开始和结束日期在 WHERE 子句中。所以我试图获得作为准备好的语句运行的好处,但直到运行时我才知道 processId。我的 sql 看起来像下面这样,但不确定如何将这两种构建 sql 的模式混合在一起。有没有办法做到这一点?

   SELECT ${processId},x,y,z FROM AnotherTable t
     WHERE t.startDate >= ? AND t.endDate <= ?```

解决方法

您不需要 SQL 注入(如 <annotationProcessorPaths> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-graal</artifactId> <version>${micronaut.version}</version> </path> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-inject-java</artifactId> <version>${micronaut.version}</version> </path> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-validation</artifactId> <version>${micronaut.version}</version> </path> </annotationProcessorPaths> )。正常参数(如 ${a} 中的)将起作用。您没有提到特定的数据库,但据我所知,我尝试过的所有 JDBC 驱动程序都在“选择列表”中支持参数。

你可以这样做:

#{a}

记住要转义您的 <select id="mySelect"> select #{processId},x,y,z from AnotherTable t where t.startDate >= #{startDate} AND t.endDate &lt;= #{endDate} </select> ,如上所示。

,

我找到了答案。我只需要在我的 Insert 标签中指定 BOTH parameterType 和 parameterMap 属性...

<parameterMap type="java.util.Map" id="myParameterMap">
    <parameter property="startDate"/>
    <parameter property="endDate"/>
  </parameterMap>

  <insert  id="theSqlToRun" parameterType="java.util.Map" parameterMap="myParameterMap">
SELECT ${processId},z FROM AnotherTable t
     WHERE t.startDate >= ? AND t.endDate <= ?
</insert>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。