`

iBatis2之SqlMap配置总结

 
阅读更多

iBatis2之SqlMap配置总结

 

SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。

 

1、命名空间:
    <sqlMap namespace="Account">,在此空间外要引用此空间的元素,则需要加上命名空间名。 

 

2、实体的别名:
  <typeAlias alias="Account" type="com.lavasoft.ibatissut.simple.domain.entity.Account"/>
   如果有用到的全名的地方,可以用别名代替,受命名空间约束。 

 

3、插入操作
    对于自增主键的表,插入可以不配置插入的主键列。否则是必须的。 

 

4、获取主键
     插入语句之前配置:主要是针对Sequence主键而言,插入前必须指定一个主键值给要插入的记录。Oracle、DB2亦如此,方法是在插入语句标签<insert....>之前配置上:
<insert id="insertAccount" parameterClass="Account">
        <selectKey resultClass="long" keyProperty="sctId">
            SELECT SEQ_TEST.NEXTVAL FROM DUAL
        </selectKey>   
        insert into .... ........
</insert>

 插入语句之后配置:主要是针对自增主键的表而言,这类表在插入时不需要主键,而是在插入过程自动获取一个自增的主键。比如MySQL

<insert id="insertAccount" parameterClass="Account">
        <selectKey resultClass="long" keyProperty="sctId">
            SELECT LAST_INSERT_ID() 
       </selectKey>   
        insert into .... ........
</insert>

当然,是否需要配置<selectKey>根据情况,只要能保证记录有主键即可。一旦配置了<selectKey>,就可以在执行插入操作时获取到新增记录的主键。

 

6、SQL入参parameterClass

插入语句入参:parameterClass="类别名"  来设定。

  查询语句入参:可以设定类别名,也可以设定为map,也可以设定为iBatis支持的原生类型(比如string、int、long等),当只有一个原生类型入参时,则在SQL中用value关键字来引用。比如:
<select id="getById"  parameterClass="long" resultMap="result_base">
        select * from customer where id = #value#
</select>

map是最强大的入参方式,任何入参方式都可以转换为这种入参方式,因为iBatis仅接受一个入参,当几个参数分布在不同对象中的时候,将这些对象的属性(或者对象本身put)到map中,然后一次传递给sql语句是非常有效。可以自己写一个将对象或者对象集合转换为map的工具。

另外,map的中的元素(比如pobj)是个复杂对象,则还可以在SQL中以#pobj.protyename#的格式来引用其中内嵌的属性。当然不推荐这么干。

 

7、返回值参数类型

  返回值参数也同样有两种类型,一种是对象类型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="lastName" column="ACC_LAST_NAME"/>
        <result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>

 resultMap映射的结果的目的就是要将查询的结果集绑定到映射对象的属性上。 

   不管使用哪种返回值参数类型,其最终目的就是要把每条记录映射到一个类的对象或者对象集合上,如果有某个类属性映射不上,则在得到的这个对象或对象集合中这个属性为空。映射的属性可以是表与实体中的一部分。不要同时使用两种返回值参数类型,这样只会令人迷惑。
 
 
8、查询结果集分组
    查询结果集排序有两种方式:一是在结果集映射上定义<resultMap id="result" class="bar" groupBy="id">,另一种就是在SQL语句中分组。建议在SQL语句中分组,以获得更大的可控制性。
 
 
9、SQL中参数的引用
     SQL中引用parameterClass的参数有三种方式:
     iBatis内置支持的类型,比如int、string,使用#value#来引用,这个value是关键字,不可变。
     map类型的参数,使用#keyName#来引用,keyName为键名。
     复杂对象的参数,使用#propertyName#来引用,propertyName类属性的名字。
 
 
10、模糊查询中参数的引用
    模糊查询是针对字符串而言的,如果遇到两个单引号要包含一个参数,则不能再用#来引用变量了,而应该改为$,比如:'%$varName$%',当然,也可以使用 '%' || #varname# || '%' 来绕过此问题。
 
 
11、SQL片段
       可以通过<sql id="sql_xxx">...</sql>定义SQL片段,然后<include refid="sql_xxx"/>来在各种语句中引用,达到复用目的。
 
 
12、动态SQL
      可以通过使用动态SQL来组织灵活性更大的更通过的SQL,这样极大减少了编码量,是iBatis应用的第二大亮点。
      比如:一个动态的where条件
复制代码
<dynamic prepend="where">
                        <isNotEmpty prepend="and" property="$$$$$">
                                $name like '%'|| #$name# ||'%'
                        </isNotEmpty>
                        <isGreaterThan prepend="and" property="$$$$$" compareValue="$$$number">
                                $code like '%'|| #$code# ||'%'
                        </isGreaterThan>
</dynamic>
复制代码

当然,prepend表示链接关键字,可以为任何字符串,当为sql关键字时,iBatis自动判断是否应该添加该关键字。该语法也很简单,关键是要会用心思考组织动态SQL。

这里面有一点要注意:区别<isNotEmpty>和<isNotNull>区别,当为空空串时<isNotEmpty>返回true,当为空串时<isNotNull>返回真。
 
 
13、结果集映射继承
  结果集映射的继承的目的是为了映射定义的复用,比如下面定义了两个映射,AccountResult继承了base:
复制代码
<resultMap id="base" class="Account">
        <result property="id" column="ACC_ID"/>
        <result property="firstName" column="ACC_FIRST_NAME"/>
        <result property="lastName" column="ACC_LAST_NAME"/>
    </resultMap>
    <resultMap id="AccountResult" class="Account" extends="Account.base">
        <result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>
复制代码

这样,就很容易扩展了一个映射策略。

14、查询注入
查询注入是在一个查询中嵌入另外一个查询,这样做的目的是为了实现实体对象之间的关联关联关系(一对一、一对多、多对多)分单项双向。有关这些内容,是比较复杂的,笔者对此做了深入研究,并分别写了三篇来讲述。
 
查询注入的实现就是在实体属性为另外一个实体或者实体集合的时候,引入一个相关的查询来实现,例如,客户和订单的映射关系:
复制代码
public class Customer {
    private Long id;
    private String name;
    private String address;
    private String postcode;
    private String sex;
    private List<Orders> orderlist = new ArrayList<Orders>();
复制代码
复制代码
<resultMap id="result" class="customer">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="address" column="address"/>
        <result property="postcode" column="postcode"/>
        <result property="sex" column="sex"/>
        <result property="orderlist" column="id" select="orders.findByCustomerId"/>
</resultMap>
复制代码

在这个映射中,为了查询客户的时候,能查询到相关的订单,可以在映射orderlist属性的时候,将其指向另外一个查询orders.findByCustomerId,这个查询是以Customer的id为参数来查询的。

select="orders.findByCustomerId"这个查询定义如下:
   
<select id="findByCustomerId" resultMap="result_base" parameterClass="long">         
  select * from orders where customerId = #value#     
</select>

原理就是这么简单,然后根据实际情况,可以自由实现实体间的关联关系。

14、iBatis的分页查询
iBatis的分页有两种方式,一点都不神秘,不要被网上的流言所迷惑。
 
  第一种方式:结果集筛选分页。先执行部分页的SQL查询语句,然后得到一个ResultSet,然后根据分页范围选择有效的记录填充到对象中,最终以集合的形式返回。对于10w条以下的记录的表,不存在性能问题,如果存在,你可以选择第二中方式。
 
  第二种方式:SQL分页,通过组装分页类型的SQL来实现分页。这个关键在于分页参数的传递和分页SQL的构建。分页SQL构件每种数据库都不一样,不说了。分页参数的传递却可以通用。我主张用map封装入参,连同分页参数一块传递进来,就搞定了。如果原来没有考虑到分页,而用的是对象做参数,则可以通过apache 的 beanutils组件来实现一个object到map之间的转换工具,问题迎刃而解。
 
  当然,这还不是分页查询应用的最高境界。思考,分页需要计算一个总记录数,记录数执行的sql返回值是count(?),条件是除了分页以外的条件,因此应该将查询SQL静态分开,以MySQL为例,可以将查询 分为查什么,和什么条件两部分,在条件部分对分页参数进行动态判断,如果分页参数就不分页,如果有则分页。这样最后只需要两个组装的sql就可以计算总数和分页查询了。大大简化了问题的难度。 Oracle的解决思路也一样,不一样的地方就是拼装分页SQL改变了。
 
 
15、执行存储过程的配置
SQL Map 通过<procedure>元素支持存储过程。下面的例子说明如何使用具有输出参数 的存储过程。
复制代码
<parameterMap id="swapParameters" class="map">
        <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
        <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters">
        {call swap_email_address (?, ?)}
</procedure>
复制代码

调用上面的存储过程将同时互换两个字段(数据库表)和参数对象(Map)中的两个 email地址。如果参数的 mode 属性设为 INOUT 或 
OUT,则参数对象的值被修改。否则保持不变。 
注意!要确保始终只使用 JDBC 标准的存储过程语法。参考 JDBC 的 
CallableStatement
文档以获得更详细的信息。

 

16、就是iBatis中各种id的命名了,这个看起来小菜一碟,但是搞砸了会很痛苦。建议如果有DAO层的话,DAO接口的名字和SQL语句id的名字保持一致。同时,在DAO中将save和update封装为一个方法(从Hibernate中学来的),这是非常好的。也可以直接在SQL层将插入和更新柔和在一块,太复杂,有点影响效率,这见机行事了。
 
   另外Spring提供了各种数据操作模板,通过模板,操作数据也就是“一句话”的问题,写个DAO还有必要么,尤其对iBatis来说,根本没有必要。这样,就需要在领域活动层的设计上下功夫了。

 

 

17 、iBatis的查询也可以配置缓存策略,缓存的配置很复杂,分很多中情况,要获得详细的信息,请参考 OSCache 文档。OSCache 及其文档可以从 OpenSymphony
网站上获取:
http://www.opensymphony.com/oscache/
 
 
18、偷懒的最高境界,让程序去干哪里80%的体力活。自己仅仅把把关。任何重复的活动都有规律可循的,一旦发现了其中的规律,你就可以想办法把自己从中解脱出来。
    iBatis也不例外,每个表都有增删改查、分页等操作。对应在每个DAO方法上亦如此。可以通过数据库生成sqlmap、entity、dao,然后将这些东西改吧改吧就完成大部分的工作量。当然开发这个工具的前提是你对iBatis有深入研究和理解。
 
-------------------------------------------------
下面是iBatis开发指南中内容:
 
附录:容易出错的地方 
本附录是译者添加的,列出了初学者容易出错的地方,作为完成快速入门课程后的学习 笔记,可以让初学者少走些弯路。
 
仅供参考。
 
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中指定数据类型。
 
4)  对于二进制类型的数据,可以将 LONGVARBINARY 映射成 byte[]。
 
5)  对于文本类型较大的数据,可以将 CLOB 映射成 String。
 
6) Java Bean 必须拥有缺省的构造器(即无参数的构造器)。
 
7) Java Bean 最好实现 Serializable 接口,以备应用的进一步扩展。
 
本人认为:尽量避免在每个入参后面附加参数的类型。以保持配置简洁,并且本人在长期开发中,没有发现必须要那么做。
分享到:
评论

相关推荐

    iBatis_SqlMap的配置总结[1]

    以下是关于iBatis_SqlMap配置的一些关键知识点: 1. **命名空间(Namespace)**: 命名空间是SqlMap配置中的一个重要概念,用于区分不同的SqlMap片段。例如,`&lt;sqlMap namespace="Account"&gt;`,这个命名空间使得在...

    ibatis_sqlMap的配置总结

    综上所述,iBatis的SqlMap配置是其核心功能之一,涵盖了命名空间、实体别名、主键处理、参数传递以及结果集映射等多个方面。熟练掌握这些配置细节,能够显著提升iBatis项目的开发效率和代码质量。

    ibatis 中sqlMap配置

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

    ibatis-sqlmap-2.jar.zip

    总结,`ibatis-sqlmap-2.jar.zip`中的`ibatis-sqlmap-2.jar`是iBatis-SQLMap 2的核心库,它为开发者提供了强大的SQL操作和对象映射功能。通过理解并熟练运用iBatis-SQLMap 2,开发者可以构建出高效、灵活的数据库...

    ibatis_修改sqlmap不重启

    "ibatis_修改sqlmap不重启"这个主题聚焦于如何在开发过程中优化流程,提升效率,即在Ibatis中更改SqlMap配置后,无需重启应用即可生效。 一、Ibatis SqlMap概述 SqlMap是Ibatis的核心组件,它包含了SQL查询的配置...

    ibatis sqlmap配置详解

    SqlMap的配置是iBatis中应用的核心。这部分任务占据了iBatis开发的70的工作量。Sql Map配置文件是iBatis配置的核心,从数据库连接到执行SQL时使用的sqlMap文件都是通过此文件中的配置提供给框架的,它通常命名为...

    ibatis-sqlmap_2.3.4_2.jar两个版本的jar包

    总结,Ibatis-SqlMap作为一个强大的持久层框架,通过XML映射文件实现了SQL与Java代码的解耦,提供了灵活的SQL支持和良好的缓存机制。对于开发者而言,理解其核心概念和使用流程,以及关注不同版本之间的差异,有助于...

    ibatis的SqlMap辅助生成工具

    Ibatis的SqlMap配置文件是其核心部分,用于定义SQL语句、参数映射和结果映射,但手动编写SqlMap文件可能效率低下且容易出错。为了解决这个问题,出现了"ibatis的SqlMap辅助生成工具",它旨在提高开发效率,减少错误...

    ibatis-sqlMap相关参考

    2. **SQLMap配置**:学习如何编写SqlMapConfig.xml,配置数据源、事务管理器以及日志设置。 3. **SQL映射文件**:了解XML格式的SQLMap文件,包括如何定义SQL语句、参数映射和结果映射。 4. **动态SQL**:探索如何...

    ibatis-sqlmap-2.3.0中sqlmap支持通配符

    2. **在SqlMap配置文件中使用通配符**: 在Ibatis的XML配置文件中,可以使用`&lt;if&gt;`标签来插入动态SQL部分,结合`#{}`占位符和通配符,实现动态模糊查询。例如: ```xml SELECT * FROM my_table WHERE column_...

    ibatis-sqlmap-2.3.4.726-sources.jar.zip_birth84v_cutting1v2_ibat

    此外,iBatis的映射机制是其核心特色之一。它允许将SQL查询结果自动映射到Java对象,这主要依赖于ResultMap和ResultMapType。ResultMap定义了如何从数据库结果集中提取数据并映射到Java对象,包括字段映射、级联映射...

    ibatis-sqlMap-入门教程(代码)

    2. **sqlMap**:在MyBatis中,SQL Map是XML配置文件,用于定义SQL查询、存储过程等,与Java对象映射关系。 3. **入门**:表示教程会涵盖基础概念和步骤,适合初学者。 4. **代码**:意味着教程将包含实际的编程示例...

    ibatis-sqlMap

    综上所述,ibatis-sqlMap提供了丰富的功能集,不仅简化了数据库访问逻辑的编写,还提供了高度灵活的配置选项。通过深入理解上述各个组件的功能和使用方法,开发者可以充分利用DataMapper的能力,构建出高效、健壮且...

    实现ibatis手动控制加载sqlmap文件,终于不用重启应用了

    iBatis在初始化时会读取配置文件(如:mybatis-config.xml),并根据其中的设置加载所有的SQL映射文件。这些文件通常位于类路径下的指定目录,例如"com/example/mapping"。在默认情况下,一旦应用启动,这些文件就会...

    ibatis相关的common,dao,sqlmap包

    2. **Ibatis-dao**: DAO(Data Access Object)层是软件设计模式中用于数据库访问的接口,Ibatis-dao提供了对数据库操作的抽象层,使得开发者可以编写更简洁、可维护的代码。在Ibatis中,DAO通常由Mapper接口和...

    ibatis-sqlmap-2.3.4.741-sources.zip_4 3 2 1_ibatis-sqlm_ibatis-s

    标题 "ibatis-sqlmap-2.3.4.741-sources.zip_4 3 2 1_ibatis-sqlm_ibatis-s" 暗示了这是一个关于iBATIS SQLMap的源码包,版本号为2.3.4.741,可能是一个增强或修改后的版本,具有特定的优化和改进。描述中提到了针对...

    ibatis2mybatisConverter:将 sqlMap xmls 从 iBatis 2 迁移到 Mybatis 3

    总结来说,`ibatis2mybatisConverter` 是一个实用的工具,它可以帮助开发者快速地将基于 iBatis 2 的项目过渡到 Mybatis 3,利用后者提供的更多特性和改进。通过理解 iBatis 2 和 Mybatis 3 在 SQL 映射、参数映射和...

    java ibaties sqlMap配置文件

    ### Java Ibaites SqlMap配置文件详解 #### 一、SqlMap配置文件概述 Ibaites 是一个基于 Java 的优秀持久层框架,它通过 XML 配置文件将 SQL 语句与 Java 代码分离,使得数据库操作变得更加简单且易于维护。在 ...

    sqlmap配置.pdf

    iBatis 中的 SqlMap 配置是核心组件之一,占据了 iBatis 开发的 70% 的工作量。因此,了解 SqlMap 的配置是非常重要的。本文将详细介绍 SqlMap 配置的各个方面。 命名空间 在 SqlMap 中,命名空间是指在配置文件中...

Global site tag (gtag.js) - Google Analytics