iBATIS数据映射器开发者指南

1、 iBATIS数据映射
1.1  这里涉及的 1.2  免责声明
2、大局
2.1  它是做什么的? 2.2  它如何工作? 2.3  iBATIS是最好的选择我的项目?
3、 处理数据映射
3.1  什么是在数据映射定义文件呢? 3.2  映射语句
3.2.1   声明类型 3.2.2  存储过程 3.2.3  SQL 3.2.4  语句类型元素属性
3.3  参数地图和内联参数
3.3.1。 < parameterMap >属性 3.3.2章。 < parameter >元素 3.3.3。 内联参数地图 3.3.4。 标准类型参数 3 3 5。 地图或IDictionary类型参数
3.4 结果地图
3 4 1  扩展resultMaps 3.4.2  parameterMap属性 3 4 3  隐式结果地图 3.4.4  原始的结果(即。字符串、整数、Boolean) 3 4 5 地图ResultMaps 3 4 6  复杂的属性 3 4 7  避免N + 1选择(1:1) 3 4 8  复杂集合属性 3 4 9  避免N + 1选择(1:M和M:N) 3 4 10  组合键或多个复杂的参数属性
3.5  支持的类型参数地图和结果地图
3 5 1
3.5.2
3.6  支持数据库类型参数地图和结果地图
3.6.1 操作
3.7  缓存模型
3.7.1  只读和读/写(Java只有) 3.7.2  缓存类型 3.7.3
3 7 4 LRU 3 7 5 FIFO
3.8  动态SQL
3 8 1  二进制条件元素 3 8 2 一元的条件元素 3 8 3  简单的动态SQL元素
4、 Java开发人员指南
4.1  iBATIS数据映射为Java安装
4.4.1  JAR文件和依赖关系 4 1 2  从版本1.x 升级到版本2. x
4.2  配置数据映射为Java
4 2 1  数据映射器客户 4.2.2  数据映射器配置文件(SqlMapConfig.xml) 4.2.3  数据映射器配置元素
4.3  编程和iBATIS数据映射器:Java API
4.3.1  配置 4.3.2  交易 4.3.3  全球(分布式)事务 4.3.4  批次(Java只有) 4 3 5  通过SqlMapClient API执行语句
4.4  一个页面的JavaBeans课程 4.5  日志SqlMap活动与Jakarta Commons日志
4.5.1  日志配置
4.6  SimpleDataSource(com ibatis common jdbc . *) 4.7  ScriptRunner(com ibatis common jdbc . *) 4.8  资源(com ibatis common *)
5、 净开发者指南
5.1  安装数据映射为。net
5.1.1  设置分布 5.1.2  添加程序集引用 5.1.3  添加XML文件条目
5.2 配置数据映射为 .net
5 2 1  数据映射器客户 5.2.2  数据映射器配置文件(SqlMapper.config) 5 2 3  数据映射器配置元素
5.3  编程和iBATIS数据映射器:。 净API
5 3 1  构建一个SqlMapper实例 5 3 2  探索SqlMapper API 5 3 3  使用显式的和自动交易 5 3 4  编码示例[TODO:扩大在一个食谱的实际例子)
5.4  日志SqlMap活动与Apache Log4Net
5.4.1  日志配置

1。 一个iBATIS数据映射

iBATIS数据映射框架使它更容易使用一个数据库和一个Java或 .NET应用程序。 iBATIS数据映射器夫妇对象与存储过程或SQL语句使用一个XML描述符。 简约最大的优势就是iBATIS数据映射器在对象关系映射工具。 使用iBATIS数据映射器你依靠自己的对象、XML和SQL。 几乎没有学习,你不知道。 iBATIS数据映射器你与的全部能力包括SQL和存储过程在你的指尖。

1.1。 这里所讨论的是什么

本指南涵盖了Java和iBATIS数据映射的净实现。

iBATIS数据映射为Java版本2. x
iBATIS数据映射为。 净版本1. x

因为iBATIS依赖于一个XML描述符来创建映射,大部分材料同时适用于实现。 当一个部分属于只有一个实现,它被标记为“Java只有”或“。 净只有”。 如果你不使用该实现,你可以放心地跳过这部分。 (别担心,伙计。)

有关安装指南,请参阅Java或。 网络开发者指南(部分4和5)。

一个教程也是可用的。 我们建议为您的平台回顾本教程之前,阅读本指南。

1 2一个免责声明

iBATIS毫无保证,明示或暗示在这个文档的信息。 实际公司的名字和产品这里提到的可能是他们的各自的主人的商标。

2。 一个大局

iBATIS是一个简单但完整的框架,可以让您映射对象到你的SQL语句或存储过程。 iBATIS框架的目标是获得80%的数据访问功能只使用20%的代码。

2.1。 一个有什么功能?

开发人员常常创建对象之间的映射在一个应用程序。 一个定义的映射是一个“对象,设置两个独立的对象之间的通信。 “一个数据映射器是一个“层之间移动数据对象映射器,和一个数据库,同时让他们相互独立的和映射器本身。 “[模式的企业架构,ISBN 0-321-12742-0]。

你提供数据库和对象;iBATIS提供映射层,是两个人之间的。

2.2。 一个它如何工作?

你的编程平台已经提供了一个能够访问数据库库,无论是通过SQL语句或存储过程。 但是开发人员发现一些事情仍然很难做好当使用JDBC或ADO“股票”。 净,包括:

从编程代码分离SQL代码
通过输入参数库类和提取输出
分离数据访问类从业务逻辑类
缓存常用数据,直到它的变化
管理事务和线程

iBATIS数据映射器解决这些问题——以及更多——通过使用XML文件来创建一个普通之间的映射对象和一个SQL语句或存储过程。 “普通对象”可以是一个地图或JavaBean(如果您使用的是Java)或一个IDictionary或属性对象(如果您使用的是. net)。

提示

对象不需要一个特殊的对象层次结构的一部分或实现特殊的接口。 (这就是为什么我们称之为“普通”对象)。 无论你正在使用应该很好地工作。

图1的图表iBATIS工作流。

FigureA 1。 一个iBATIS数据映射器工作流

iBATIS Data Mapper workflow

这是一个高水平的描述说明了工作流由图1:

  1. 提供一个参数,或者作为一个对象或者一个本地类型。 这个参数可用于设置运行时的值在您的SQL语句或存储过程。 如果一个运行时的值是不需要的,参数可以省略。

  2. 执行映射通过参数和名字你给声明或程序在XML描述符。 在这一步中,奇妙的事情发生。 该框架将准备SQL语句或存储过程,设置任何运行时使用你的参数值,执行程序或声明,并返回结果。

  3. 在执行更新的情况下,返回的行数。 对于一个查询,单个对象,或者返回一个对象集合。 像参数,结果对象或对象集合,可以是一个普通对象或一个本地类型。 结果也可以作为XML(Java只)。

所以,什么看起来像在源代码? 这里是你如何可能的代码插入一个“lineItem”对象到你的数据库:

Mapper.instance().insert("insertLineItem",lineItem); // Java

如果你的数据库生成的主键,生成的键可以从相同的方法调用返回,就像这样:

MyKey = Mapper.Instance().Insert("InsertLineItem",lineItem); // .NET

示例1展示了一个XML描述符为“InsertLineItem”。

ExampleA 1。 一个“InsertLineItem”描述符

  <insert id="InsertLineItem" parameterClass="LineItem">

  INSERT INTO [LinesItem] 
  (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice)
  VALUES
  (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#)

  <selectKey resultClass="int" keyProperty="id" >
    SELECT @@IDENTITY AS ID
  </selectKey>

  </insert>

< selectKey >节返回一个自动生成的键从一个SQL Server数据库(例如)。

如果您需要选择多个行,iBATIS可以返回对象的列表,每个映射到一个结果集行:

IList productList = Mapper.Instance().QueryForList("selectProduct",categoryKey); // .NET

或者只是一个,如果这是你所需要的:

Object product = Mapper.instance().queryForObject("selectProduct",productKey); // Java

当然,还有更多,但这是iBATIS从10000米。 (更长、更温和的介绍,请参阅本教程)。 第三节描述了数据映射定义文件,该声明为“InsertLineItem”将被定义。 为您的平台的开发者指南(部分4或5)描述了“引导”配置文件,暴露了iBATIS应用程序。

2.3。 一个是iBATIS的最佳选择我的项目?

iBATIS是一种数据映射工具。 它的作用是将列映射的一个数据库查询(包括一个存储过程)到一个对象的属性。 如果您的应用程序是基于业务对象(包括地图或IDictionary对象),然后iBATIS可以是一个不错的选择。 iBATIS是一个甚至更好的选择当你的应用程序分层,这样,业务层不同于用户界面层。

在这种情况下,另一个不错的选择将一个对象/关系映射工具(或/ M工具),像Hibernate或NHibernate。 (其他这一类产品是Apache ObjectRelationalBridge和Gentle.NET)。 一个或/ M工具生成所有或大部分的SQL,或者在运行时提前。 这些产品被称为或/ M工具,因为他们试图映射对象图到关系模式。

iBATIS不是一个或/ M工具。 iBATIS可以帮助你对象映射到存储过程或SQL语句。 底层的模式是无关紧要的。 一个或/ M工具是伟大的,如果你可以映射到表对象。 但他们并不是很伟大的如果你的对象被存储为一个关系视图,而不是作为一个表。 如果你可以编写一个语句或过程,揭示了你的对象的列,不管他们是如何存储,iBATIS可以休息。

所以,你如何决定是否或/ M到DataMap吗? 一如既往,最好的建议是实现一个代表你的项目的一部分使用何种方法,然后决定。 但是,一般来说,或/ M是一件好事,当你

1。 可以完全控制您的数据库实现吗

2。 没有一个数据库管理员或SQL大师的团队吗

3。 需要模型问题域之外的数据库作为一个对象图。

同样,最好的时间使用一个数据映射器,比如IBATIS,是当:

1。 你有完全控制数据库实现,或想继续访问遗留数据库,因为它是被重构。

2。 你有数据库管理员或SQL大师的团队。

3。 数据库是被用于模型问题域和应用程序的主要作用是帮助客户端使用的数据库模型。

最后,必须决定什么是最好的项目。 如果一个或/ M的工具为你工作的更好,那太好了! 如果你的下一个项目有不同的需求,那么我们希望你给iBATIS再看一看。 如果iBATIS适合你现在:太棒了! 顺便支持论坛,如果你有任何问题。

3。 一个处理数据映射

如果你想知道如何配置和安装iBATIS,看到开发者指南为您的平台(部分4或5)。但是如果你想知道iBATIS真的工作,继续在这里。

数据映射定义文件是令人感兴趣的东西出现。 在这里,您定义应用程序如何与您的数据库。 正如前面提到的,数据映射定义一个XML描述符文件。 通过使用一个服务程序提供了iBATIS,XML描述符渲染成一个客户端对象(或“映射”)。 访问你的数据地图,您的应用程序调用客户端对象,并通过在声明的名字你需要。

真正的工作使用iBATIS与其说是在应用程序代码中,但在XML描述符,iBATIS呈现。 而不是东与应用程序的源代码,你的猴子用XML描述符相反。 好处是,XML描述符更加适合你的对象属性的任务映射到数据库实体。 至少,这是我们自己的经验和我们自己的应用程序。 当然,你的里程可能有所不同。

3.1。 是什么在数据映射定义文件呢?

如果你阅读本教程中,您已经看到了一些简单的数据映射的例子,像一个示例2中显示的。

ExampleA 2。 一个简单的数据图(. net)

<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace="LineItem" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:noNamespaceSchemaLocation="http://ibatisnet.sf.net/schemaV1/SqlMap.xsd">

 <alias>
  <typeAlias alias="LineItem" assembly="NPetshop.Domain.dll" 
  type="NPetshop.Domain.Billing.LineItem" />
 </alias>

 <statements>

  <insert id="InsertLineItem" parameterClass="LineItem">

  INSERT INTO [LinesItem] 
  (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice)
  VALUES
  (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#)

  </insert>

</statements>

</sqlMap>

这张地图需要一些属性从一个LineItem实例和合并到SQL语句的值。 其附加值是我们的SQL在脱离我们的程序代码,我们可以通过我们的LineItem实例直接向图书馆法:

Mapper.Instance().Insert("InsertLineItem",lineItem); // C#

没有大惊小怪,没有混乱。 同样地,看到示例3为一个简单的select语句。

ExampleA 3。 一个简单的数据地图(Java)

<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace=”Product”>
<select id=”selectProduct” 
  parameterClass=”com.ibatis.example.Product” 
  resultClass=”com.ibatis.example.Product”>

  select
  PRD_ID as id,
  PRD_DESCRIPTION as description
  from PRODUCT
  where PRD_ID = #id#

</select>
</sqlMap>

在示例3中,我们使用SQL别名映射到我们的对象属性的列和一个iBATIS内联参数(参见侧栏)插入一个运行时的值。 简单派。

但是,如果你想要一些冰淇淋和蛋糕吗? 也许一个樱桃上吗? 如果我们想要缓存结果的选择吗? 或者,如果我们不想使用SQL别名或命名参数。 (说,因为我们正在使用已存在的SQL,我们不想碰。) 示例4显示一个数据图,用于指定一个缓存,并使用一个< parameterMap >和< resultMap >来保持我们的SQL原始。

ExampleA 4。 一个数据映射定义文件和一些花哨的功能(Java)

<?xml version="1.0" encoding="UTF-8" ?>
<sqlMap namespace=”Product”>

<typeAlias alias=”product” type=”com.ibatis.example.Product” />

<cacheModel id=”productCache” type=”LRU”>
  <flushInterval hours=”24”/>
  <property name=”size” value=”1000” />
</cacheModel>

<parameterMap id=”productParam” class=”product”>
  <parameter property=”id”/>
</parameterMap>

<resultMap id=”productResult” class=”product”>
  <result property=”id” column=”PRD_ID”/>
  <result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>

<select id=”getProduct” parameterMap=”productParam” cacheModel="productCache">

  select * from PRODUCT where PRD_ID = ?

</select>

</sqlMap>

在例4中,< parameterMap >映射SQL”? “产品id属性。 < resultMap >地图列到我们的对象属性。 < cacheModel >使结果过去一千年的这些查询在活跃的记忆长达24小时。

示例4是长和复杂示例3,但是考虑到你所得到的回报,这似乎是一个公平的贸易。 (一个交易甚至。)

很多“敏捷”开发人员将从类似示例3和添加功能,比如缓存之后。 如果你改变了数据地图从示例3到示例4,你就不会碰你的应用程序源代码在所有。 你可以开始简单并添加复杂性只有当它是必要的。

一个单独的数据映射定义文件可以包含许多缓存模型,类型别名,结果地图、参数映射和映射语句(包括存储过程),就像你们。 一切都是加载到相同的配置,所以你可以定义一个数据图中的元素,然后使用它们在另一个。 使用自由裁量权和组织语句和地图为适合您的应用程序通过寻找一些逻辑方式来组织它们。

3.2。 一个映射语句

映射语句可以容纳任何SQL语句,可以使用参数地图和地图为输入和输出结果。 (一个存储过程的一个特殊形式的声明。 看到第3.2.1节和3.2.2更多。)

如果这个案子很简单,映射的语句可以引用参数和结果类直接。 映射语句支持缓存通过引用一个缓存模型元素。 示例5显示的语法声明元素。

ExampleA 5。 一个声明元素的语法

<statement id=”statementName”

  [parameterMap=”nameOfParameterMap”]
  [parameterClass=”some.class.Name”]
  [resultMap=”nameOfResultMap”]
  [resultClass=”some.class.Name”]
  [cacheModel=”nameOfCache”]
  [xmlResultName="nameOfResult”] (Java only)

>

   select * from PRODUCT where PRD_ID = [?|#propertyName#]
   order by [$simpleDynamic$]

</statement>

在示例5,[括号]部分是可选的,和一些选项是相互排斥的。 这是完全合法的,有一个映射声明简单示例所示6。

ExampleA 6。 一个简单的映射语句

<statement id=”insertTestProduct” >
  insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, “Shih Tzu”)
</statement>

例6显然是不可能的,除非你正在运行一个测试。 但它确实表明,您可以使用iBATIS执行任意SQL语句。 更有可能的是,您将使用对象映射特性与参数地图(3.4节)和结果地图(3.5节),奇妙的事情发生。

3.2.1之上。 一个声明类型

<声明>元素是一个普遍的一个€œ赶上真主安拉€元素,可用于任何类型的SQL语句。 通常这是一个好主意,使用一种更具体的语句类型的元素。 更具体的元素提供了更好的错误检查,甚至更多的功能。 (例如,插入语句可以返回一个数据库生成的关键。) 表1总结了语句类型元素及其支持的属性和特性。

为多1。 一个六语句类型的元素

声明元素 属性 子元素 方法
<声明>
id 
parameterClass 
resultClass 
parameterMap 
resultMap 
cacheModel 
xmlResultName (Java only)
All dynamic elements
insert 
update 
delete 
All query methods
< insert >
id 
parameterClass 
parameterMap
All dynamic elements
<selectKey> 
<generate> (.NET only)
insert 
update 
delete 
< update >
id 
parameterClass 
parameterMap
All dynamic elements 
<generate>  (.NET only)
insert 
update 
delete
<删除>
id 
parameterClass 
parameterMap
All dynamic elements 
<generate>  (.NET only)
insert 
update 
delete
< select >
id 
parameterClass 
resultClass 
parameterMap 
resultMap 
cacheModel
All dynamic elements 
<generate> (.NET only)
All query methods
<程序>
id 
parameterClass 
resultClass 
parameterMap 
resultMap 
xmlResultName (Java only)
All dynamic elements 
insert 
update 
delete 
All query methods

使用的各种属性声明类型的元素都包含在部分3.2.4条。

第3.2.2章。 一个存储过程

iBATIS数据映射器将存储过程作为另一个语句类型。 例7显示了一个简单的数据地图托管一个存储过程。

ExampleA 7。 一个数据地图使用存储过程

<!-- Java -->
<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>


<!-- .NET -->
<procedure id="SwapEmailAddresses" parameterMap="swap-params">
  ps_swap_email_address
</procedure>
 ... 
<parameterMap id="swap-params">
  <parameter property="email1" column="First_Email" />
  <parameter property="email2" column="Second_Email" />
</parameterMap>

例7背后的想法是,调用存储过程的“swapEmailAddress”将交换两个电子邮件地址在两个列在一个数据库表和还在参数对象。 (在这里,一个地图或HashTable)。 这个参数对象只是修改如果参数映射模式属性设置为一个€œINOUTa€或€œ一€。 否则他们保持不变。 当然,不可变参数对象(例如,String)不能被修改。

注意

对于Java,总是要确保使用标准的JDBC存储过程的语法。 看到JDBC CallableStatement文档了解详细信息。

对。 净,parameterMap属性是必需的。 这个DBType、参数方向和大小都是这里用处不大的框架(通过CommandBuilder)。

第3.2.3。 一个SQL

如果你不使用存储过程,最重要的部分是SQL语句类型的元素。 您可以使用任何SQL语句,为您的数据库系统是有效的。 因为iBATIS SQL传递到标准库(JDBC或者ADO.NET),您可以使用任何声明,您可以使用与iBATIS没有iBATIS。 你可以使用任何数据库系统支持功能,甚至发送多个语句,只要你的驱动或提供者支持他们。

如果标准,静态SQL并不够,iBATIS可以帮助你建立一个动态SQL语句。 参见3.7节了解更多的动态SQL。

3 2 3 1。 一个转义XML符号

因为你是结合SQL和XML在单个文档,会发生冲突。 最常见的冲突是大于和小于号(<)>。 SQL语句使用这些符号作为操作符,但是他们保留符号在XML。 一个简单的解决方案是“逃离”的SQL语句,使用XML保留在一个CDATA元素符号。 示例8演示了。

ExampleA 8。 一个使用CDATA“逃”的SQL代码

<statement
        id="selectPersonsByAge" parameterClass=”int” resultClass="person">
        <![CDATA[ SELECT * FROM PERSON WHERE AGE > #value# ]]>
        </statement>
3 2 3 2。 一个自动生成的键

许多数据库系统支持自动生成的主键字段,如供应商扩展。 有些供应商提前生成密钥(如。甲骨文),一些供应商邮报生成密钥(如服务器和MySQL。sql女士)。 在这两种情况下,您可以获得一个预先生成键使用一个< selectKey >节在一个< insert >元素。 示例9显示了一个< insert >语句要么方法。

ExampleA 9。 一个< insert >语句使用< selectKey >节

<!—Oracle SEQUENCE Example --> 
<insert id="insertProduct-ORACLE"
        parameterClass="product"> <selectKey resultClass="int"
        keyProperty="id" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
        </selectKey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values
        (#id#,#description#) </insert> 

<!— Microsoft SQL Server IDENTITY Column Example --> 
<insert id="insertProduct-MS-SQL"
        parameterClass="product"> insert into PRODUCT (PRD_DESCRIPTION)
        values (#description#) <selectKey resultClass="int"
        keyProperty="id" > SELECT @@IDENTITY AS ID </selectKey>
        </insert>

<!-- MySQL Example -->

[:TODO:]
3 2 3 3。 一个<生成>标记(。 净只有)

您可以使用iBATIS SQL语句执行任何应用程序需要。 当要求很简单、明显的一份声明中,你可能不需要编写一个SQL语句在所有。 <生成>标记可用于创建简单的SQL语句自动,基于一个< parameterMap >元素。 这四个CRUD语句类型(插入、选择、更新和删除)都受支持。 对于一个选择,你可以选择所有或选择由一个键(或键)。 例10显示了一个示例生成的CRUD语句通常的数组。

ExampleA 10。 一个创建“惯常嫌犯”用<生成>标记

<parameterMaps>

  <parameterMap id="insert-generate-params">
    <parameter property="Name" column="Category_Name"/>
    <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/>
      <!--Guid for Oledb, UniqueIdentifier for SqlClient, Odbc -->
  </parameterMap>

  <parameterMap id="update-generate-params" extends="insert-generate-params">
    <parameter property="Id" column="Category_Id" />
  </parameterMap>

  <parameterMap id="delete-generate-params">
   <parameter property="Id" column="Category_Id" />
   <parameter property="Name" column="Category_Name"/>
  </parameterMap>

  <parameterMap id="select-generate-params">
   <parameter property="Id" column="Category_Id" />
   <parameter property="Name" column="Category_Name"/>
   <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/>
  </parameterMap>

</parameterMaps>

<statements>

<update id="UpdateCategoryGenerate" parameterMap="update-generate-params">
 <generate table="Categories" by="Category_Id"/>
</update>

<delete id="DeleteCategoryGenerate" parameterMap="delete-generate-params">
 <generate table="Categories" by="Category_Id, Category_Name"/>
</delete>

<select id="SelectByPKCategoryGenerate" resultClass="Category" parameterClass="Category" parameterMap="select-generate-params">
  <generate table="Categories" by="Category_Id"/> 
</select>

<select id="SelectAllCategoryGenerate" resultClass="Category" parameterMap="select-generate-params">
 <generate table="Categories" /> 
</select>

<insert id="InsertCategoryGenerate" parameterMap="insert-generate-params">
 <selectKey property="Id" type="post" resultClass="int">
  select CAST(@@IDENTITY as int) as value
 </selectKey>
 <generate table="Categories" />
</insert>

</statements>

注意

生成的SQL是当数据映射器实例构建,所以没有性能影响在执行时间。

标记生成ANSI SQL,这应该适用于任何兼容的数据库。 特殊类型,如blob、不受支持,并且特定于供应商的类型也不支持。 但是,生成标记并保持简单的事情变得简单。

重要

的计划使用<生成>标记是拯救开发商麻烦的编码平凡的SQL语句(和只有平凡的语句)。 这并不意味着作为一个对象到关系的映射工具。 有许多框架,提供广泛的对象到关系的映射功能。 <生成>标签并不能代替的。 当<生成>标签并不适合你的需要,使用常规声明相反。

3 2 3 3 1。 一个<生成>标记的属性

生成标记支持两个属性:表和通过。

——所需的表属性指定了表名使用的SQL语句

通过——可选属性指定的列中使用WHERE子句。

第3.2.4章。 一个语句类型元素属性

六个语句类型元素采取各种属性。 看到第3.2.1节表的每个元素类型的列属性接受。 单个属性中描述了部分3 2 4 1通过3 2 4 7。

3 2 4 1一个id

所需的ID属性提供了一个名称为这个语句,它必须是唯一的在这个< SqlMap >。

3 2 4 2 a parameterMap

一个参数映射定义值的有序列表,配合”? “占位符的一个标准,参数化的查询语句。 例10显示了< parameterMap >和一个相应的<声明>。

ExampleA 11。 一个一个parameterMap和相应的语句

<parameterMap id=”insert-product-param” class=”product”>
  <parameter property=”id”/>
  <parameter property=”description”/>
</parameterMap>

<statement id=”insertProduct” parameterMap=”insert-product-param”>
  insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>

在范例11中,参数图描述了两个参数,以匹配,在秩序,两个SQL语句中的占位符。 第一个一个€œ吗? 一个€替换为价值的ID财产。 第二个是取代描述财产。

iBATIS还支持命名,内联参数,大多数开发人员似乎更喜欢。 然而,参数地图是有用,当SQL必须保存在一个标准形式或当需要提供额外的信息。 更多关于参数地图见3.4节。

3 2 4 3 a parameterClass

如果没有指定parameterMap属性(参见节3 2 4 2),您可以指定一个parameterClass相反和使用内联参数(参见部分3.3.3)。 parameterClass属性的值可以是一个类型别名或者一个类的完全限定名。 例12显示了一个语句使用完全限定的名称和一个别名。

ExampleA 12。 一个方法来指定一个parameterClass

<!-- fully qualified classname (Java) -->
<statement id=”statementName” parameterClass=”examples.domain.Product”>
  insert into PRODUCT values (#id#, #description#, #price#)
</statement>

<!-- typeAlias (defined elsewhere) -->
<statement id=”statementName” parameterClass=”product”>
  insert into PRODUCT values (#id#, #description#, #price#)
</statement>
3 2 4 4 a resultMap

结果映射允许您控制如何提取数据从一个查询的结果,以及列映射到对象属性。 例13显示了一个< resultMap >元素和一个相应的<声明>元素。

ExampleA 13。 一个< resultMap >和相应的<声明>

<resultMap id=”select-product-result” class=”product”>
  <result property=”id” column=”PRD_ID”/>
  <result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>

<statement id=”selectProduct” resultMap=”select-product-result”>
  select * from PRODUCT
</statement>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值