ibatis 实践

1. sql Map File详解

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之类的方法。
   

2.  Ibatis实践注意事项

   2.1  区分resultclass和resultMap
	<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 

2.2  DO类中提供无参数的构造函数或者不提供构造函数
     DO中必须提供无参数的构造函数或者不提供构造函数,否则ibatis实例化失败。这是因为ibatis实例化对象时,会调用不带参数的构造函数。如果do提供了带参数的构造函数就复写了不带参数的构造函数,因此ibatis实例化不成功。解决方法,在DO中显示添加无参数的public构造函数。

     问题还原: http://hi.baidu.com/edmond80/item/4b0f7a7ca2d322356dc37c82

3.   总结

   由于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)  当查询记录很多条时,利用分页查询完成


你可能感兴趣的:(ibatis 实践)