问题一:
之前在mysql客户端上编写sql习惯导致使用mybatis 将字符串参数逗号拼接进行传值 in(1,2,3) 一直返回一条数据 ,控制台输出的sql也没问题反复找不出所以然,经过同事指导才解决…
//错误示例 原因:使用in 参数传值为1,2,3 mybaits底层不会解析 只能返回一条数据
List<String> list = usersMapper.getUserAccountByUsersId("1,2,3");
Assert.assertNotNull(list);
<select id="getUserAccountByUsersId" resultType="java.lang.String">
select uas.userAccountId as userAccountIds from users u LEFT JOIN user_account uc ON u.id = uc.userId AND uc.`status` = 1
LEFT JOIN user_account_settlement uas on u.id = uas.userId AND uas.`status` = 1
WHERE u.deleted_at IS NULL AND u.id in #{usersids,jdbcType=VARCHAR}
</select>
//正确示例 将参数值存入list中 1 2 3
@Test
public void select () {
List<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
ids.add("3");
List<String> list = usersMapper.getUserAccountByUsersId(ids);
Assert.assertNotNull(list);
}
//foreach 进行集合遍历
<select id="getUserAccountByUsersId" resultType="java.lang.String">
select uas.userAccountId as userAccountIds from users u LEFT JOIN user_account uc ON u.id = uc.userId AND uc.`status` = 1
LEFT JOIN user_account_settlement uas on u.id = uas.userId AND uas.`status` = 1
WHERE u.deleted_at IS NULL AND u.id in
<foreach collection="list" item="uid" index="index" open="(" close=")" separator=",">
#{uid}
</foreach>
</select>
问题二:
mybatis 使用Map<String,Object>进行参数传递(map中有String,List类型)
//正确示例
@Test
public void selectEntryExitCount() {
List<String> arr = new ArrayList<String>();
arr.add("1");
arr.add("2");
arr.add("3");
HashMap<String, Object> params = new HashMap<>();
params.put("user_account_ids", arr);
params.put("start_date", "2019-1-1");
params.put("end_date", "2019-1-1");
Assert.assertNotNull(entryExitCountMapper.selectEntryExitCount(params));
}
<select id="selectMerchantsCountOrder" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT SUM(loadings.money+overs.money+fails.money) as acount_money FROM
(
SELECT IFNULL(SUM(money),0) as money FROM entry_exit_account
where 1=1 and status = 0
<if test="user_account_ids.size() > 0">
and userAccountId in
<foreach collection="user_account_ids" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</if>
<if test="start_date != null and start_date != ''"> AND date <![CDATA[>=]]> #{start_date}</if>
<if test="end_date != null and end_date != ''"> AND date <![CDATA[<=]]>#{end_date}</if>
) loadings,
注意:<if test="_parameter.containsKey('user_account_ids')"> 判空不推荐使用因为参数无值会传递null值, 注意括号中的单引号不能少!!!
map中集合遍历 foreach collection map中的key(集合) 注意不要使用#{params.userAccountId}报错 也不要params.userAccountId 都不行