今天使用mybatis遇到一个sql查询的问题,在这里记录一下:
情景:
SELECT
g.id,
g.`name`,
g.code,
g.cid_list as cidList,
g.brief_text,
g.brief_image,
g.`image`,
g.group_type,
g.add_time,
g.status,
gs.`name` as specName,
sg.id as sgId,
sg.price as price,
gc.course_id as courseId,
gc.course_uri as courseUri
FROM
cxg_goods g
LEFT JOIN cxg_spec_goods sg ON sg.goods_id = g.id
LEFT JOIN cxg_goods_spec gs ON gs.id = sg.spec_id
LEFT JOIN cxg_goods_course gc ON gc.goods_id = g.id
WHERE
g.id in (#{cidList})
AND g.`status` = 1
当时结果只显示了一个出来,而预期结果应该是10个才对。仔细查看了日志:
确实有正确传入参数,怎么返回结果就一个呢?
经过一番查询资料,最后整理如下:
当参数采用:#{} : 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
也就是说我们实际的sql语句变成了类似:
WHERE
g.id in (
'2,3,4,6,10,11'
)
AND g.`status` = 1
此时自然不是我们想要的查询结果,修改sql语句为:
WHERE
g.id in (${_parameter})
AND g.`status` = 1
达到了我们想要的效果,记住无论参数名是啥,都要改成”_parameter”