MyBatis提供了防止動態表名注入的方法,可以通過使用動態SQL和參數替換來實現。
<if>
、<choose>
、<when>
、<otherwise>
等,根據條件判斷來拼接表名。例如:<select id="selectUserById" resultType="User">
SELECT * FROM
<choose>
<when test="tableType == 'A'">
table_A
</when>
<when test="tableType == 'B'">
table_B
</when>
<otherwise>
table_C
</otherwise>
</choose>
WHERE id = #{id}
</select>
<select id="selectUserById" resultType="User">
SELECT * FROM #{tableName}
WHERE id = #{id}
</select>
在Java代碼中,將表名作為參數傳遞給MyBatis的方法:
String tableName = "table_A";
int id = 1;
User user = sqlSession.selectOne("selectUserById", Collections.singletonMap("tableName", tableName));
通過這種方式,可以確保表名是從可信來源獲取,避免了直接拼接表名導致的注入風險。