ibatis的几个类型属性

一、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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.apache.ibatis.exceptions.PersistenceException 是 MyBatis 持久化框架抛出的异常,通常表示在执行数据库操作时发生了错误。要解决该异常,您可以考虑以下几个步骤: 1. 查看异常堆栈轨迹:首先,查看异常堆栈轨迹以获取更详细的错误信息。异常堆栈轨迹可以告诉您哪个方法、类或语句引发了异常。通过调试和检查异常轨迹,您可以更好地理解问题的根本原因。 2. 检查数据库连接:确保数据库连接配置正确并且可用。检查数据库连接字符串、用户名、密码等是否正确。还要确保数据库服务器正在运行。 3. 检查 SQL 语句:如果异常消息中提到了具体的 SQL 语句,您可以检查该语句是否正确。请注意语法错误、表名或列名拼写错误等常见问题。 4. 检查映射文件:MyBatis 使用映射文件将 Java 对象与数据库进行映射。请确保映射文件中配置的查询、插入、更新或删除语句正确。还要检查参数名称、返回类型和结果集映射等是否正确配置。 5. 检查实体类:如果使用了实体类来映射数据库表,确保实体类的属性与表的列名匹配。还要注意实体类属性数据类型是否与数据库字段的数据类型兼容。 6. 检查数据库连接池配置:如果使用了数据库连接池,确保连接池配置正确。检查最大连接数、最小空闲连接数、连接超时等参数是否适当。 7. 日志记录:在 MyBatis 的配置文件中启用日志记录,可以帮助您更好地理解执行过程中发生的问题。通过查看日志,您可以获得更详细的错误信息和执行过程。 如果以上步骤都无法解决问题,建议您将完整的异常信息、SQL 查询语句、映射文件和相关配置一起提供,以便进行进一步的分析和排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值