如何解决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 <= #{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 举报,一经查实,本站将立刻删除。