因项目需要最近使用ibatis,在使用查询语句的时候,想着通用性所以没有在配置文件里用N多的and 语句,而是如下:
<select id="getUsersList" resultClass="userInfo" parameterClass="java.util.HashMap"> select user_id userId,user_no userNo,user_name userName, pass pass,area_no areaNo,phone phone, mail mail,is_admin isAdmin,'status' 'status',create_date createDate, last_login_date lastLoginDate, last_login_ip lastLoginIp from p_sys_user <isParameterPresent> <isNotNull property="conditional"> where #conditional# </isNotNull> <isNotNull property="orderByClause"> order by #orderByClause# </isNotNull> <isNotNull property="pageStart"> limit #pageStart#, #pageEnd# </isNotNull> </isParameterPresent> </select>
页面上如此调用:
String conditional=" user_no like concat('%', 'q', '%')"; int pageSize=Integer.valueOf(request.getParameter("rows")); int pageIndex=Integer.valueOf(request.getParameter("page")); users = userService.getSysUserList(pageSize, conditional, pageIndex, "user_id asc");
结果在日志里出现的语句放在数据库是可以执行的,但是就是一直取不到正确的数据,后来发现是ibatis的$与#的区别导致的,将配置文件改成
<select id="getUsersList" resultClass="userInfo" parameterClass="java.util.HashMap"> select user_id userId,user_no userNo,user_name userName, pass pass,area_no areaNo,phone phone, mail mail,is_admin isAdmin,'status' 'status',create_date createDate, last_login_date lastLoginDate, last_login_ip lastLoginIp from p_sys_user <isParameterPresent> <isNotNull property="conditional"> where $conditional$ </isNotNull> <isNotNull property="orderByClause"> order by #orderByClause# </isNotNull> <isNotNull property="pageStart"> limit #pageStart#, #pageEnd# </isNotNull> </isParameterPresent> </select>
一切正常,因为#时,会当成字符串来解析所以没有得到正确的结果。这个错误调了好久记录下,但是这种得记住要注意SQL注入。