`

Ibatis比较少人使用的配置语法‎

 
阅读更多

简单来说,ibatis3虽然没有ognl,不过也支持基本的表达式(看起来有点像el表达式的样子) 上次有个问题,说到两个表单数据(两个javabean),入同一个表,传参就应该不成问题了
java代码1:

Java代码 复制代码 
  1. Map map = new HashMap();   
  2. ComplexBean bean = new ComplexBean();   
  3. bean.setMap(new HashMap());   
  4. bean.getMap().put("id"new Integer(1));   
  5. map.put("bean", bean);   
  6. Account account = new Account();   
  7. account.setId(2);   
  8. Account anotherAccount = new Account();   
  9. anotherAccount.setId(3);   
  10. map.put("accounts"new Account[] {account, anotherAccount});   
  11. Integer id = (Integer) sqlMap.queryForObject("mapBeanMap", map);  
   Map map = new HashMap();
   ComplexBean bean = new ComplexBean();
   bean.setMap(new HashMap());
   bean.getMap().put("id", new Integer(1));
   map.put("bean", bean);
   Account account = new Account();
   account.setId(2);
   Account anotherAccount = new Account();
   anotherAccount.setId(3);
   map.put("accounts", new Account[] {account, anotherAccount});
   Integer id = (Integer) sqlMap.queryForObject("mapBeanMap", map);
ibatis配置1:
Xml代码 复制代码 
  1. <select id="mapBeanMap"  
  2.   parameterClass="map"  
  3.   resultClass="int" >  
  4.   select count(ACC_ID) from Account where ACC_ID in (#bean.map.id#,#accounts[0].id#,#accounts[1].id#)   
  5. </select>  
 <select id="mapBeanMap"
   parameterClass="map"
   resultClass="int" >
   select count(ACC_ID) from Account where ACC_ID in (#bean.map.id#,#accounts[0].id#,#accounts[1].id#)
 </select>
java代码2:
Java代码 复制代码 
  1. Map map = new HashMap();   
  2. ComplexBean bean = new ComplexBean();   
  3. bean.setMap(new HashMap());   
  4. Account account = new Account();   
  5. account.setId(2);   
  6. Account anotherAccount = new Account();   
  7. anotherAccount.setId(3);   
  8. bean.getMap().put("accounts"new Account[] {account, anotherAccount});   
  9. map.put("bean", bean);  
   Map map = new HashMap();
   ComplexBean bean = new ComplexBean();
   bean.setMap(new HashMap());
   Account account = new Account();
   account.setId(2);
   Account anotherAccount = new Account();
   anotherAccount.setId(3);
   bean.getMap().put("accounts", new Account[] {account, anotherAccount});
   map.put("bean", bean);
ibatis配置2:
Xml代码 复制代码 
  1. <select id="mapBeanMap2"  
  2.   parameterClass="map"  
  3.   resultClass="int" >  
  4.   select count(ACC_ID) from Account where ACC_ID in   
  5.   <iterate close=")" open="(" conjunction="," property="bean.map.accounts">  
  6.     #bean.map.accounts[].id#   
  7.   </iterate>  
  8. </select>  
 <select id="mapBeanMap2"
   parameterClass="map"
   resultClass="int" >
   select count(ACC_ID) from Account where ACC_ID in
   <iterate close=")" open="(" conjunction="," property="bean.map.accounts">
     #bean.map.accounts[].id#
   </iterate>
 </select>
当使用复杂配置并且参数带有泛型的时候,使用比较标签有可能导致如下错误:There is no READABLE property named ‘XXX’ in class ‘java.lang.Object’.这是因为进行比较的时候,ibatis是通过反射获取类型而不是先计算值的,这样泛型的时候会获取到Object类而不能得到真实的类型,自己简单打个补丁先:
Java代码 复制代码 收藏代码
  1. Index: src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java   
  2. ===================================================================   
  3. --- src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (revision 1079874)   
  4. +++ src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (working copy)   
  5. @@ -72,14 +72,13 @@   
  6.   
  7.      if (prop != null) {   
  8.        value1 = PROBE.getObject(parameterObject, prop);   
  9. -      type = PROBE.getPropertyTypeForGetter(parameterObject, prop);   
  10.      } else {   
  11.        value1 = parameterObject;   
  12. -      if (value1 != null) {   
  13. -        type = parameterObject.getClass();   
  14. -      } else {   
  15. -        type = Object.class;   
  16. -      }   
  17. +    }   
  18. +    if (value1 != null) {   
  19. +     type = value1.getClass();   
  20. +    } else {   
  21. +     type = Object.class;   
  22.      }   
  23.      if (comparePropertyName != null) {   
  24.        Object value2 = PROBE.getObject(parameterObject, comparePropertyName);  
Index: src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
===================================================================
--- src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (revision 1079874)
+++ src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java (working copy)
@@ -72,14 +72,13 @@

     if (prop != null) {
       value1 = PROBE.getObject(parameterObject, prop);
-      type = PROBE.getPropertyTypeForGetter(parameterObject, prop);
     } else {
       value1 = parameterObject;
-      if (value1 != null) {
-        type = parameterObject.getClass();
-      } else {
-        type = Object.class;
-      }
+    }
+    if (value1 != null) {
+     type = value1.getClass();
+    } else {
+     type = Object.class;
     }
     if (comparePropertyName != null) {
       Object value2 = PROBE.getObject(parameterObject, comparePropertyName);
 
关于inlineParameterMap
例如#name#(标准配置),#name:NUMBER#(以:分割),#myVar:javaType=int#都是有效的
其中以:分割的有两种方式,#name:jdbcTypeName#,#name:jdbcTypeName:nullvalue#(如果后面还有则会被加到nullvalue上去) 这是老配置方法,个人不推荐使用。
最后一种是新的配置方式,可以带上javaType,jdbcType,mode,nullValue,numericScale,handler等参数(这个文档有详细描述)
jdbcType,javaType和TypeHandler
首先要说明一点的是,配置里边的jdbcType和javaType两个配置参数是为了生成TypeHandler(如果没有指定的话);
查找typeHandler的内部结构是Map<javaType, Map<jdbcType, typeHandler>>,其中javaType是一个类,jdbcType是一个字符串;
所以jdbcType其实和数据库的字段类型没什么关系,只要能找到相应的TypeHandler即可(当然通常都会对应上);
typeHandler主要是做什么用的呢?无非就是使用jdbc api的时候选择setString/setInt还是getString/getObject之类~~
只指定resultClass,没有resultMap
如果没有指定resultMap,ibatis会根据parameterClass生成一个AutoResultMap对象;
对于AutoResultMap,里边的每个属性的映射对应的typeHandler是什么?
resultClass TypeHandler
Map ObjectTypeHandler
原型类型 相应类对应的typeHandler(javaType=?,jdbcType=null)
Bean 会对实例变量名称进行大写并和ResultSetMetaData信息进行对比,最后生成typeHandler(javaType=?,jdbcType=null)
所以使用parameterClass是map的时候,某些字段的处理可能会有点问题,例如oracle的NUMBER类型会被转成BigDecimal类;
只指定parameterClass,没有parameterMap
如果没有指定parameterMap,就会根据配置的sql解析inlineParameterMap;
其中每个参数的TypeHandler如果没有指定,会根据参数的类型来寻找,例如#name,jdbcType=NUMBER# 会根据name计算后的类型来制定javaType
这个typeHandler的好处可以对jdbc api友好,例如对于int默认会采用IntegerTypeHandler,这样会调用PreparedStatement#setInt, 而不是统统setString或者setObject。
通常参数类型和jdbc类型不对应的时候,需要考虑设置typeHandler或者使用更强类型的Bean而不是统统使用map;
分享到:
评论

相关推荐

    ibatis用xml配置文件配置使用

    本篇文章将深入探讨如何使用XML配置文件来配置iBATIS,以解决你在实际开发中可能遇到的各种问题。 首先,我们了解iBATIS的核心概念——映射器(Mapper)。映射器是定义SQL语句的地方,而XML配置文件是映射器的主要...

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

    IBatis.net 配置各种数据库

    本文将详细介绍如何在IBatis.net中配置和使用各种数据库。 首先,理解IBatis.net的核心概念。IBatis 是一个基于.NET平台的持久层框架,它实现了SQL语句与.NET代码的解耦,通过XML或注解的方式将SQL与数据访问逻辑...

    iBatis资料 语法

    本资料包包含了关于iBatis语法和常用方法的全面介绍,帮助开发者深入理解并熟练运用iBatis进行数据库操作。 首先,`iBatis 2.3.4 api.chm`是iBatis 2.3.4版本的API参考手册,包含了所有类和接口的详细说明,是学习...

    Ibatis的应用和配置

    下面,我们将详细探讨Ibatis的配置文件、映射文件以及其在实际应用中的使用。 一、Ibatis配置文件 Ibatis的主要配置文件是`mybatis-config.xml`,它是整个系统的全局配置文件。这个文件中包含了数据源、事务管理器...

    ibatis总配置和映射配置.txt

    此文本主要是关于ibatis总配置和映射配置和一些需要主要的细节。

    SPRING IBATIS 保留IBATIS事务的配置方式

    当我们将Spring与iBatis进行整合时,可以充分利用Spring的依赖注入(DI)和面向切面编程(AOP)能力来简化iBatis的配置和使用。其中一种重要的整合方式就是保留iBatis本身的事务管理机制,而不是完全依赖Spring的...

    ibatis 配置文件详解

    ibatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 二、ibatis配置文件解析 ibatis的核心配置文件是`SqlMapConfig.xml...

    ibatis的使用教程

    【Ibatis 框架详解】 Ibatis 是一个基于 Java 的持久层框架,源自于“internet”和“abatis...通过合理的配置和使用,Ibatis 可以有效地帮助开发者实现数据持久化,并与其他主流框架(如Spring)集成,提高开发效率。

    ibatis 中sqlMap配置

    总结来说,iBatis中的SQLMap配置涉及到命名空间、别名、插入操作、主键获取、参数类型和结果映射等多个方面,理解和熟练掌握这些知识点对于高效地使用iBatis框架至关重要。通过合理的配置,可以有效地将Java代码与...

    springMVC整合ibatis 配置详细

    1. **引入依赖**:在项目中添加SpringMVC和iBatis的相关jar包或者使用Maven或Gradle引入对应的依赖库。 2. **配置SpringMVC**:配置SpringMVC的DispatcherServlet,设置拦截器、视图解析器等,同时开启注解驱动,如...

    ibatis 相关使用文档及安装包ibatis 相关使用文档及安装包

    使用iBATIS时,首先需要在项目中引入iBATIS库,然后创建数据库配置文件(如`sqlmap-config.xml`),在此文件中定义数据源和事务管理器。接着,编写SQL Map文件,其中包含具体的SQL查询和存储过程。在Java代码中,...

    常用ibatis配置

    标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...

    ibatis相关配置

    Ibatis,全称为MyBatis,是一款开源的Java持久层框架,它允许开发者将SQL语句直接集成到Java代码中,避免了传统的JDBC代码编写,...在实际项目中,Ibatis通常与Spring框架结合使用,以实现更高效的事务管理和依赖注入。

    ibatis配置文件信息

    ### ibatis配置文件信息 #### 一、简介 在Java开发领域中,ibatis(现称为MyBatis)是一款优秀的持久层框架,它通过XML或注解的方式将接口方法与SQL语句绑定起来,实现对象关系映射(ORM)功能。ibatis的主要优势...

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    动态ibatis查询语句配置

    - 使用`#{}`语法引用参数,这有助于防止SQL注入。 - 当动态SQL块中的所有内容都被忽略时,Ibatis会自动删除多余的SQL片段,如开头的AND或OR,以及空的`&lt;if&gt;`、`&lt;choose&gt;`等。 总结起来,Ibatis的动态查询语句配置...

    ibatis 实例 配置 源码

    ibatis 实例 配置 源码 依赖包 ibatis-2.3.4.726.jar commons-logging-api.jar commons-logging-1.1.jar commons-dbcp-1.2.2.jar commons-pool.jar

    spring+ibatis配置实例

    在IT行业中,Spring框架与iBatis(现为MyBatis)是两个广泛使用的开源库,主要用于构建企业级Java应用程序。本实例将介绍如何将它们整合以实现数据访问层的操作。"spring+ibatis配置实例"这个项目提供了一个完整的...

Global site tag (gtag.js) - Google Analytics