ibatis的几个类型属性

来源:互联网 发布:怎么签署淘宝空间协议 编辑:程序博客网 时间:2024/05/22 01:34

一、ResultClass 和 ResultMap 的区别
resultMap和resultClass指的是在 select查询中的返回数据类型。
resultMap: 可以预先定义 resultMap 元素,可以控制数据如何从结果集中取出,以及哪个属性匹配哪个字段。首先requltmap的值是指定的映射字段配置的id值,其次必须是数据表中的字段和实体类的属性像对应,如果缺少或者不对应的话就会包缺少字段的错误,即查询的语句查询出来的字段必须和映射的字段相互对应,俗话就是select中查询出来多少字段那么映射配置中(result 属性中)就要有多少数据。便于将此数据封装到对象中,便于运输,例如像jsp文件中遍历数据等操作的时候比较好用。
例如:

<typeAlias alias="wp" type="com.shared.Wp"/>        <resultMap id="wpResult" class="wp">        <result property="id" column="id"/>        <result property="name" column="name"/>        <result property="wp" column="wp"/>      <result property="flag" column="flag"/>     </resultMap>    <select id="chakan"  resultMap="wpResult">          select user.id,user.name,wpb.wp,wpb.flag        from user,wpb  where  user.id=wpb.id                        </select> 

resultClass: 可以把结果自动映射到相应的 JAVA 类中,但无法指定输出字段的类型,会对性能产生轻微的影响。 首先requestClass指定的值为你映射类的别名,在查询的时候不考虑是否一一对应,只要在你定义的bean类中能找到这个属性就行。这样不能直接读出具体的数据,不便于运输。
例如: resultClass取值
1.resultClass=”int”
2.resultClass=”com.sfbest.product.bean.ProductPicture”
3.resultClass=”string”
4.resultClass=”long”
5.resultClass=”java.util.HashMap”

<select id="ms" resultClass="java.lang.Integer">    select COUNT(*) from table</select>

返回值参数也同样有两种类型,一种是对象类型resultClass=”Account”,一种是resultMap=”AccountResult”。这两种类型的选择常常会令人迷惑不解,一言明其理:
当结果集列名和类属性名完全对应的时候,则应该使用resultClass来指定查询结果类型。当然有些列明不对应,可以在sql中使用as重命名达到一致的效果。
当查询结果列名和类属性名对应不上的时候,应该选择 resultMap指定查询结果集类型。否则,则查询出来填充的对象属性为空(数字的为0,对象的为null)。
但是实际上 resultMap是对一个Java Bean的映射,需要先定义xml的映射后,才可以引用,例如:

<resultMap id="AccountResult" class="Account">    <result property="id" column="ACC_ID"/>      <result property="firstName" column="ACC_FIRST_NAME"/>    <result property="emailAddress" column="ACC_EMAIL"/></resultMap> 

resultMap映射的结果的目的就是要将查询的结果集绑定到映射对象的属性上。
不管使用哪种返回值参数类型,其最终目的就是要把每条记录映射到一个类的对象或者对象集合上,如果有某个类属性映射不上,则在得到的这个对象或对象集合中这个属性为空。映射的属性可以是表与实体中的一部分。不要同时使用两种返回值参数类型,这样只会令人迷惑。

二、parameterClass和parameterMap区别
parameterClass 属性值是 JAVA 类的全限定名,目的是限制输入参数的类型为指定的 JAVA 类,如果不指定,任何带有合适属性( get/set 方法)的 JAVA BEAN 都可以作为输入参数
parameterMap: 预先定义 parameterMap 的属性值,用于有次序的参数匹配。

属性parameterMap
属性parameterMap的值等于一个预先定义的元素的名称。parameterMap属性很少使用,更多的是使用的parameterClass。但是使用parameterMap可以提高数据库的访问效率。

<parameterMap id=”parameterMapName”   [class=”com.domain.Product”]>         <parameter property =”propertyName”                  [jdbcType=”VARCHAR”]                 [javaType=”string”]                 [nullValue=”NUMERIC”]                  [null=”-9999999”]         />        <parameter…… />        <parameter …… /> </parameterMap> Class属性是可选的,Class属性必须是JavaBean或Map实列,Class属性虽是可选的,但推荐自己指定,Class属性可以用来验证传入的参数的合法性及优化查询

元素:

1.property
属性property是传给statement的参数对象的Java Bean属性名称。该名称根据需要,可以在statement中多次出现(即在SQL语句SET子句中被更新的属性,也可以作为条件出现在WHERE子句中)。
2.jdbcType
属性jdbcType用于显式地指定给本属性(property)赋值的数据库字段的数据类型。
注意! 大多数JDBC Driver只有在字段可以为NULL时需要指定jdbcType属性。因此,对于这些Driver,只是在字段可以为NULL时才需要指定type属性。
注意! 当使用Oracle Driver时,如果没有给可以为NULL的字段指定jdbcType属性,当试图给这些字段赋值NULL时,会出现“Invalid column type”错误。
3.javaType
属性javaType用于显式地指定被赋值参数Java属性的类名。
4.nullValue (要特别关注)
属性nullValue的值可以是对于property类型来说任意的合法值,用于指定NULL的替换值。就是说,当Java Bean的属性值等于指定值时,相应的字段将赋值NULL。这个特性允许在应用中给不支持null的数据类型(即int,double,float等)赋值null。当这些数据类型的属性值匹配null值(即匹配-9999)时,NULL将代替null值写入数据库。

元素
最后总结列出几点ParameterMap需要特别注意的几个细节:

1.在配置ParameterMap的时候,如果传入的参数对像是元数据类型(int,string etc),那么在配置Parameter元素的时候,property的属性名使用value。通过这种情况主要使用在为存储指定参数的情况下。

2.如果ParameterMap中配置的parameter元素不包含在传入参数对象中(属性或IDictionary对象的一个key,value项),将会产生异常,而不管在statement中有没有用到。

3.在使用parameterMap的extends属性时,它将会继承extends值对应的parameterMap配置,并且会继承它的所有的参数映射,并且顺序是从继承的那配置为基准开始计算。这个在需要用到extends属性的时候要特别注意。

4.在为存储过程传参过程要特别注意,参数映射与存储过程的参数之间的顺序对应要正确。而且必须为提供与存储过程足够的参数(parameter配置足够多),即使存储过程的部分参数已经有默认值了。否则将抛出System.ArgumentOutOfRangeException异常。

5.正常情况下,应该尽量使用内联参数。

SQL入参parameterClass
parameterClass指的是select save update delete SQL语句的where执行条件
插入语句入参:parameterClass=”类别名” 来设定。
查询语句入参:可以设定类别名,也可以设定为map,也可以设定为iBatis支持的原生类型(比如string、int、long等),当只有一个原生类型入参时,则在SQL中用value关键字来引用。比如:

select * from customer where id = #value#

map是最强大的入参方式,任何入参方式都可以转换为这种入参方式,因为iBatis仅接受一个入参,当几个参数分布在不同对象中的时候,将这些对象的属性(或者对象本身put)到map中,然后一次传递给sql语句是非常有效。可以自己写一个将对象或者对象集合转换为map的工具。
parameterClass可以的取值
1、parameterClass=”int”
2、parameterClass=”map”
3、parameterClass=”com.sfbest.bean.AccountMerchantDistribution”
SQL中引用parameterClass的参数有三种方式:
iBatis内置支持的类型,比如int、string,使用#value#来引用,这个value是关键字,不可变。
map类型的参数,使用#keyName#来引用,keyName为键名。
复杂对象的参数,使用#propertyName#来引用,propertyName类属性的名字。

可以在ibatis的源码:com.ibatis.sqlmap.engine.type.TypeHandlerFactory
中看到支持的别名类型
putTypeAlias(“string”,String.class.getName());
putTypeAlias(“byte”, Byte.class.getName());
putTypeAlias(“long”, Long.class.getName());
putTypeAlias(“short”, Short.class.getName());
putTypeAlias(“int”, Integer.class.getName());
putTypeAlias(“integer”, Integer.class.getName());
putTypeAlias(“double”, Double.class.getName());
putTypeAlias(“float”, Float.class.getName());
putTypeAlias(“boolean”, Boolean.class.getName());
putTypeAlias(“date”, Date.class.getName());
putTypeAlias(“decimal”,BigDecimal.class.getName());
putTypeAlias(“object”, Object.class.getName());
putTypeAlias(“map”, Map.class.getName());
putTypeAlias(“hashmap”, HashMap.class.getName());
putTypeAlias(“list”, List.class.getName());
putTypeAlias(“arraylist”,ArrayList.class.getName());
putTypeAlias(“collection”, Collection.class.getName());
putTypeAlias(“iterator”, Iterator.class.getName());
putTypeAlias(“cursor”, java.sql.ResultSet.class.getName());

在根据缩写查找Class name的时候会全部转换为小写再进行查找

即:resultClass=” string”,resultClass=”String”都是可以的

(1) 如果写的是全路径,则全路径必须大小写正确,例如:java.lang.string就不能识别,转换时会报ClassCast错误,必须是java.lang.String

(2) resultClass中必须必须输可以实例化的具体类,而不能输接口,如:hashmap是可以的,而输map就不行,因为处理结果的时候需要先实例化resultClass,然后进行赋值

(3) parameterClass可以输接口类,如list,map都是可以的,因为子类可以转换为父类。

1) 在 parameterMap 和 resultMap 中,字段数据类型是 java.sql.Types 类定义的常量名
称。常用的数据类型包括 BLOB,CHAR,CLOB,DATE,LONGVARBINARY,
INTEGER,NULL,NUMERIC,TIME,TIMESTAMP 和 VARCHAR 等。
2) 对于数据表中 NULLABLE 的字段,必须在 parameterMap 和 resultMap 中指定字段
的数据类型。
3) 对于数据类型是 DATE,CLOB 或 BLOB 的字段,最好在 parameterMap 和 resultMap中指定数据类型。

0 0
原创粉丝点击