今天遇到一个问题,弄了一会结果是被一个简单的东西坑了。
如下的配置
<select id="query1" parameterMap="parameterMap1" resultMap="resultMap1">
<![CDATA[
SELECT *
FROM b_p2pclientsum
WHERE dtime >= ? and dtime <= ?
]]>
</select>
平时我常用是直接传入Map,不需要再构造别的bean。如下
<parameterMap class="java.util.Map" id="parameterMap1">
<parameter property="para1"/>
<parameter property="para2"/>
</parameterMap>
Dao层如下
public List<P2pClientSumCompatible> query1(String para1,String para2){
System.out.println("====================================================开始query1");
Map para = new HashMap();
para.put("para1", para1);
para.put("para2", para2);
List<P2pClientSumCompatible> list = this.getSqlMapClientTemplate().queryForList("Pstest5765.query1", para);
System.out.println("====================================================结束query1");
return list;
}
需要注意的是在一些sql中,字符串类型需要单引号包含住,但是在ibatis中不要使用单引号。如上面的para1和para2,将用单引号包住的平para1和para2传入Dao层的query1,导致where条件失效。
还有,表名是参数的时候不需要单引号,可以这样。如下
<select id="query11" parameterClass="java.util.HashMap" resultMap="resultMap4">
<![CDATA[
SELECT MAX(aa.a) AS field0
FROM (SELECT SUM(online_num) AS a,c_time
FROM $para0$ WHERE data_status=1 AND c_time >= #para1# AND c_time <= #para2#
GROUP BY c_time )
as aa
]]>
</select>
这里不用parameterMap,而是用parameterClass(因为试了下用?不行),将参数用$包起来,不会有单引号。
$与#的区别是:
Ibatis我们使用SqlMap进行Sql查询时需要引用参数参数引用遇符号#和$之间区分#进行与编译进行类型匹配而$进行数据类型匹配例:
select * from table where id = #id# 其字段id字符型#id#表示'id'类型id整型#id#id类型
select * from table where id = $id$ 字段id整型Sql语句会出错字段id字符型Sql语句应该写成 select * from table where id = '$id$'
mark下,长个记忆。