问题描述:
1.传入多个值时,mybatis会自动将这些值转成类似map形式的值,以0,1,2…的序列为keyName。
这里我们需要先简单了解一下mybatis的传值机制。Mybatis现在可以使用的2.parameterType有基本类型和Java负责类型
3.还有当运用特殊转义字符(例如:<![CDATA]]>)是有foreach循环时需要把循环放到特殊转义字符外面
基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名}获取。
复杂数据类型:包含Java实体类、Map。通过#{属性名}或#{map的keyName}获取。
先上报错:
解决问题:
方法一:(设置下标)
UserMapping.xml
select * from login where name=#{0} and password=#{1}
方法二:(定义别名)
UserDao.java
public Login selectByCondition(@param("name")String username,@param("pwd")String password);
name、pwd 是别名对应UserMapping.xml里面的
select * from login where name=#{name} and password=#{pwd}
方法二:(把foreach循环放外面就可以)以上两种都没效就仔细检查
代码如下:
<select id="selectLeaseManagerVo" resultMap="LeaseManagerVoResultMap">
<![CDATA[
SELECT
(
SELECT
count( tempcc.id )
FROM
c_contract tempcc
LEFT JOIN c_contract_detail tempccd ON tempccd.contract_id = tempcc.id
AND tempcc.logical_state = 0
WHERE
tempccd.end_time > now( )
) AS validLease,
(
SELECT
count( tempcc.id )
FROM
c_contract tempcc
LEFT JOIN c_contract_detail tempccd ON tempccd.contract_id = tempcc.id
AND tempcc.logical_state = 0
WHERE
tempccd.end_time BETWEEN now( )
AND DATE_ADD( now( ), INTERVAL 1 MONTH )
) AS willExpire,
(
SELECT
count( tempcc.id )
FROM
c_contract tempcc
LEFT JOIN c_contract_detail tempccd ON tempccd.contract_id = tempcc.id
AND tempcc.logical_state = 2
WHERE
tempccd.end_time < now( )
) AS expire,
bb.build_name AS buildingName,
ccd.end_time AS expireTime,
bbr.floor_id AS floor,
bbr.door_number AS door
FROM
c_contract cc
LEFT JOIN c_contract_detail ccd ON cc.id = ccd.contract_id
LEFT JOIN b_building_room bbr ON bbr.id = cc.room_id
LEFT JOIN b_building bb ON bb.id = bbr.building_id
WHERE
]]>
cc.m_acc_id IN
<foreach collection="maccids" item="maccid" open="(" separator="," close=")">
#{maccid}
</foreach>
</select>