ibatis使用过程中应该知道的知识:
1.占位符
是占位符,$是字符串拼接。id = #id# 生成的sql语句是 id = ? 使用的是PreparedStatement,执行时,通过setXXX方法,将值加入到sql语句中。
若字段id为String类型,传递的参数id为1,
则 id = #id# 实际SQL为:select * from user where a = ‘1’;
而 id =
id
实际SQ*强调内容L为:select from user where a = 1;
注:尽量用#id# 而不要用
id
,因为后面这种只是拼接,很容易被sql注入攻击。
2.动态生成查询的结果列:
有时会出现不能动态生成查询结果列的情况,那是因为ibaits 会缓存查询的meta信息,所以在生成动态列时一定要加上 remapResults=”true”。
[html] view plain copy
<span style="font-size:14px;"><select id="getxx" resultClass="java.util.HashMap" parameterClass="map" remapResults="true"></span>
3.动态指定表名
有时会碰到2张表结构相同,但是表名不一样的情况,这时候查询语句中的表名就需要动态指定了。这时只能用
tableName
,而不能用#tableName#。
[html] view plain copy
<span style="font-size:14px;">select * from $tableName$
where id = #id#</span>
4.动态标签里面的属性
1)dynamic的prepend只要检测到第一个条件为“真”的比较元素,则覆盖其prepend属性并组装where关键字为动态SQL的一部分。 如果dynamic下面第一条动态标签不含prepend属性,则会覆盖第二个条件为“真”的动态标签的prepend属性值,所有最好每个动态标签都加上prepend属性。
2)isNotNull的prepend=’and’ 只要检测到参数值满足比较条件,则前置组装and关键字为动态SQL的一部分。
5.动态sql片段
[html] view plain copy
//动态sql片段
<sql id="sql_count">
select count(*)
</sql>
<sql id="sql_select">
select *
</sql>
<sql id="sql_where">
from student
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
name like '%$name$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="no">
no like '%no$%'
</isNotEmpty>
</dynamic>
</sql>
<select id="findStudentCount" parameterClass="map" resultClass="int">
<include refid="sql_count"/>
<include refid="sql_where"/>
</select>
<select id="findStudent" parameterClass="map" resultMap="student.result_base">
<include refid="sql_select"/>
<include refid="sql_where"/>
</select>