Mybatis的配置文件中的代码
<select id="todoTotalCount" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT COUNT(*) AS total_count
FROM (
SELECT STATUS FROM `TABLE1` WHERE company_id LIKE '${companyId}%'
UNION ALL
SELECT STATUS FROM `TABLE2` WHERE company_id LIKE '${companyId}%'
UNION ALL
SELECT STATUS FROM `TABLE3` WHERE company_id LIKE '${companyId}%'
) AS combined_tables
WHERE STATUS = 1;
</select>
控制台输出的报错原因:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'orgId' in 'class java.lang.String'
问题发现:
MyBatis 在解析结果映射时找不到 'orgId' 属性,而这个属性是在查询中作为参数传递的。报错可能是由于使用 ${orgId}
时 MyBatis 试图在 java.lang.String
类型上查找 'orgId' 属性,而这个属性实际上不存在。通过将 ${}
替换为 #{}
,MyBatis 将 orgId
视为参数,并能够正确地处理它,避免了错误。
占位符:
1、#{}
占位符: 是预编译的占位符,用于防止 SQL 注入。在使用 #{}
时,MyBatis 会使用预编译语句,并确保参数被正确地设置到 SQL 语句中。这样可以有效地防止 SQL 注入攻击。
2、${}
占位符: 是直接替换占位符,不进行预编译。使用${}
时,参数的值会被直接拼接到 SQL 语句中。虽然 ${}
允许你动态地拼接 SQL 片段,但它也增加了 SQL 注入的风险。
解决方法:
将 ${}
替换为 #{}
,使用 #{}
占位符可以确保 MyBatis 能够正确地处理参数,并在运行时将参数传递给查询。这样,应该就不再出现 "There is no getter for property named 'orgId'" 的异常了。
<select id="todoTotalCount" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT COUNT(*) AS total_count
FROM (
SELECT STATUS FROM `table1` WHERE company_id LIKE #{companyId}
UNION ALL
SELECT STATUS FROM `table2` WHERE company_id LIKE #{companyId}
UNION ALL
SELECT STATUS FROM `table3` WHERE company_id LIKE #{companyId}
) AS combined_tables
WHERE STATUS = 1;
</select>