1) ibatis statement 的属性包括: id,parameterClass,parameterMap,resultClass,resultMap. 由于这三类操作insert、update、delete 节点无需返回数据类型定义(总是 int),因此涉及到的属性只id,parameterClass/Map,通常不使用 parameterMap。对于select操作通常涉及到所有属性。
2)ibatis 会自动根据 select 语句中的字段名,调用对应 POJO 的 set 方法设定属性值,例如在ibatis 会调用 setUserid, setPassword方法将 Select 语句返回的数据赋予相应的 POJO 实例。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" > <sqlMap namespace="Table_User"> <!-- alias --> <typeAlias alias="UserDO" type="UserDO" /> <select id="getUser" parameterClass="java.lang.String" resultClass="UserDO"> SELECT userid,password,username,address FROM Table_User WHERE userid=#userid:varchar# </select> <!-- insert --> <insert id="insertUser" parameterClass="UserDO"> INSERT INTO Table_User( userid,password,username,address) VALUES(#userid:varchar#,#password:varchar#,#username:varchar#,#address:varchar#) </insert> <!-- delete --> <delete id="deleteUser" parameterClass="java.lang.String"> DELETE FROM Table_User WHERE userid = #userid:varchar# </delete> </sqlMap>
3)ibatis的动态映射<dynamic>
在复杂的查询过程中,需要根据用户的选择决定查询条件(例如,查找city=“HZ”的user有多少个)。这里发生变化的并不只是SQL中的参数,包括select语句中所包含的字段和限定条件,都可能发生变化。引入<dynamic prepend=“” >,例如
<dynamic prepend="WHERE"> <isNotEmpty prepend="AND" property="username"> username = #username:VARCHAR# </isNotEmpty> <isNotEmpty prepend="AND" property="address"> address like #address:VARCHAR# </isNotEmpty> </dynamic>表示:如果usrname和address不为空。则会动态产生SQL语句 WHERE usrname = #usrname# AND address like #address#.like为模糊匹配,=为完全匹配。
位于<dynamic> </dynamic>之间的SQL语句根据条件动态生成。ibatis提供了多种条件判断:
一元:<isNull>,<isNotNull>,<isNotEmpty>, <isEmpty>,<isPropertyAvaible>
二元:<isGreaterThan>,<isEqual>,<isLessThan>
4)result Map
resultMap 结果集的映射,就是将返回的记录逐个字段的映射赋值给对象的属性上。例如<resultMap id="usrDoMap" class="UserDO"> <result property="userId" column='USER_ID' jdbcType="VARCHAR" /> <result property="password" column='PASSWORD' jdbcType="VARCHAR" /> <result property="username" column='USERNAME' jdbcType="VARCHAR" /> <result property="address" column='ADDRESS' jdbcType="VARCHAR" /> </resultMap> <select id="getUser" parameterClass="java.lang.String" resultMap="usrDoMap"> SELECT userid,password,username,address FROM Table_User WHERE userid=#userid:varchar# </select>
其实如果没有特殊需求的话我们完全可以使用resultclass来代替它。数据库中的字段和DO中的属性命名方式一致。因为如果字段与属性一模一样的话,查询出来数据集会自动匹配到resultclass指定的类的实例对象,如果字段名不在属性中的话,那这个字段将不会被返回的实例体类对象接受,相当于没有查询出这个字段一样的。
resultMap结果映射, 需结合 resultMap 节点对映射关系加以定义。一般而言,对于insert、update、delete、select 语句,优先采用 parameterClass和 resultClass。parameterMap 使用较少,resultMap 则大多用于嵌套查询以及存储过程的处理,之所以这样,原因是由于存储过程相对而言比较封闭(很多情况下需要调用现有的存储过程,其参数命名和返回的数据字段命名往往不符合 Java 编程中的命名习惯,并且由于我们难以通过 Select SQL 的 as 子句进行字段名转义,无法使其自动与 POJO中的属性名相匹配)。此时,使用 resultMap 建立字段名和 POJO 属性名之间的映射关系就显得非常有效。例如字段USER_ID对应的属性为userId
另一方面,由于通过 resultMap 指定了字段名和字段类型,ibatis 无需再通过 JDBC ResultSetMetaData 来动态获取字段信息,在一定程度上也提升了性能表现。
POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。pojo有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或DTO(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
<select id="selectFactById" parameterClass="int" resultClass="PersonFactDo"> select * from person_fact where id=#id:INTEGER# </select>
注意:parameterClass也可以用java.lang.Integer代替,如果是字符串格式parameterClass="string",也可用java.lang.String代替
1)result class的定义格式如下:
<typeAlias alias ="PersonFactDo" type="com.xxx.PersonFactDo"/>
注意type和最后的/结束符
2) resultMap定义格式如下:
<resultMap id="PersonMap" class="com.xxx.PersonFactDo"> <result column="ID" property="id" jdbcType="INTEGER" /> ... </resultMap>
注意:属性class
问题还原: http://hi.baidu.com/edmond80/item/4b0f7a7ca2d322356dc37c82
由于insert,update,delete的返回结果为int,通常select语句较复杂些。复杂体现在:
1)输出参数:resultClass或resultMap; resultClass利用<typeAlias alias="" type=“”/>来定义;resultMap利用<resultMap id="" class=""><result column="" property="" jdbcType=""/> </resultMap>来定义。
2)在实际应用中,通常查询条件被封装成一个query类,而且查询条件是动态变化的,因此要利用ibatis提供的<dynamic>机制;
3) 当查询记录很多条时,利用分页查询完成