快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

手机BET365客户端_酒文化网进入



iBatis 是一个开源的工具关系映射法度榜样,其事情是将工具映射到 SQL 语句。和其它 O/R Mapping 框架不合,iBatis 开拓者必要自己编写和掩护 SQL 语句,这给开拓带来了很多的机动性的同时,也带来了很大年夜的繁杂度与事情量。在一个数据库中,常见的工具关系有:1 对 1,1 对多,多对多,单表映射,多表映射,单主键,多主键以及工具主键等各种环境。在应用 ibatis 处置惩罚数据映射时,必要跟据不合的环境,写出不合的 sql 语句和 sql map 的实现,分外是在繁杂关系跟繁杂主键时必要编写大年夜量的繁杂 sql。本文将具体先容若何应用 ibatis 来处置惩罚数据库中的繁杂数据工具关系,根据数据关系的分类,给出详细的实今世码模板与解释。经由过程本文读者可以懂得 ibatis 处置惩罚繁杂关系时可以应用要领,在详细编写代码历程中手机BET365客户端只必要套用本文中列出的这些模板,这样可以大年夜大年夜简化开拓和加快开拓的速率。本文的读者必要对 ibatis 已经有一些基础的应用履历。

ibatis 基础先容

起源于 2001 年的开放源代码项目 ibatis,是一个基于 Java 的持久层框架。与 Hibernate, Toplink 等持久化框架不合,ibatis 是一个 “半自动化”的 ORM 实现。ibatis 没有对数据库布局供给了较为完备的封装,而是供给了一个从 POJO 到数据库表的全套映射机制。这使得在开拓 ibatis 的时刻,必要手动的编写 sql 来提过数据库与类工具之间的映射,这在给开拓供给了很大年夜的机动性的同时,大年夜大年夜增添了开拓的事情量。Ibatis 主要有以下的这些特点:

1. 简单性

Ibatis 是一个异常简单易用的对象包。这个简单性不仅仅体现在开拓库的轻量小巧上,iBATIS 对付 Java 开拓者来说也异常简单。由于它除了不用编写那么多代码外与 JDBC 的事情机制异常相像,iBATIS 便因此 XML 的形式来描述的 JDBC 代码。iBATIS 对付数据库治理员以及 SQL 法度榜样员来 说也异常轻易理解。iBATIS 设置设置设备摆设摆设文件险些各人都能读懂,只要他有 SQL 编程的履历。

2. 效率与机能

iBATIS 经由过程一种简单的要领来设置设置设备摆设摆设和应用,其机能与 JDBC 相称。经由过程直接编写 SQL 查询,开拓职员可以直接节制 SQL 语句来优化履行效率,以致可以在此中调用存储历程,为开拓职员供给了伟大年夜的 SQL 优化空间。

3. 代码分离

在 iBATIS 中,SQL 语句在很大年夜程度上同利用的源代码是分离 的,SQL 法度榜样员可以按照 SQL 蓝本的要领来编写它,而不必担心有关 SQL 字符串连接的问题。iBATIS 供给了充分的自由,使得任何人都可以开拓、察看并且改动在数据库中履行的 SQL 语句。

4. 可移植性

iBATIS 是可移植的。因为它相对简单的设计,它险些可以用任何一种说话在任何一个平台上实现。iBATIS 支持 3 种最受迎接的开拓平台:Java、Ruby 和微软 .NET 的 C#。

常见的工具映射与实现

因为在应用 ibatis 进行项目开拓中,必要根据数据库的表布局与 Java 类之间的关系写出实现的 SQL 代码,不合的关系会对应不合 SQL 实现。这些 SQL 代码将会和其他 mapping 信息一路放在 ibatis 的 SQL mapping 文件中。下面就对这些每一种映射进行具体阐发并给出实现示例。

单表工具绑定与多表工具绑定

在 ibatis 中最简单的关系便是一个工具对单个表的绑定,这也是最简单的类与数据库的映射关系。在没有任何外键关系的时刻,在 ibatis 中直接将类的字段对应到表的列即可:

清单 1. 单个工具表绑定的实现

SELECT `BANKL`.`BANKID` AS `B_ID`, `BANKL`.`NAME` AS `B_NAME`

FROM `BANKL`

WHERE `BANKID` = #id#

在某些特殊的工具中,有的时刻必要将一个工具映射到多个表中,在这个时刻就必要在映射时加入对两张表的选择。是以,必要对上面的简单的 sql 进行一些篡改,加入一个两张表的 join 操作,以下是示例:

清单 2. 单个工具多表绑定的实现

SELECT

`CUMAS`.`ID` AS `C_ID`, `CUMAS`.`NAME` AS `C_NAME`, `CUMAS`.`BIRTHDAY` AS

`C_BIRTHDAY`, `CUMAS`.`GENDER` AS `C_GENDER`, `CUMAS`.`IDTYPE` AS `C_IDENTITYTYPE`,

`CUMAS`.`IDNO` AS `C_IDENTITYID`, `CUSPT`.`POINT` AS `C_CONSUMEPOINT`, `CUSPT`.`LASTGET`

AS `C_LASTGETDATE`, `CUSPT`.`LASTUSE` AS `C_LASTUSEDATE`

FROM `CUMA手机BET365客户端S`, `CUSPT` WHERE `ID` = #id# AND `CUMAS`.`ID` = `CUSPT`.`CUSID`

在上面这个例子中,Customer 这个工具被映射到 CUMAS 与 CUSPT 两个表中,每个表中包孕了一部分字段,以是在选择的时刻必要将两张表 join 起来。在进行删除,改动等操作时,必要留意的是要创建两条语句并在 java code 中对两条语句都进行调用,否则会导致数据不同等的征象发生:

清单 3. 单个工具多表绑定的删除语句

DELETE FROM `CUMAS` WHERE `ID` = #id#

DELETE FROM `CUSPT` WHERE `CUSID` = #id#

单主键与多主键

在数据库中,一样平常必要对每笔记录定义一个主键,大年夜部分环境下采纳一个自增长的 ID 来实现。这个时刻有两种实现措施,第一种是用数据库自带的 id 增长功能,若何在 ibatis 中实现这种环境已在 iBatis 赞助文档中有具体阐明,这里就不在赘述。第二种措施是采纳类似 Toplink 中的实现要领,在 Java 中节制 ID 的增长,这种措施应用一张 sequence 表来寄放所有的 id 记录,该表有两个字段,第一个为表名,第二个为当前最新的 id 值,表中的每一行对应一个自增长的 id。与该表对应的为一个 Java 的 Sequence 类与 iBatis 映射文件。在查询每个 sequence 时,经由过程 sequence name 将当前 id 值掏出并设置到工具的 id 中。

在获取新的 sequence 时,必要留意的是对并发的节制,在同一光阴只能有一个线程更新 sequence,否则将会导致主键重复。

清单 4. Sequ手机BET365客户端ence 的实现

Sequence 的 Java 类

public class Sequence{

protected String name;

protected String nextId;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getNextId() {

return nextId;

}

public void setNextId(String nextId) {

this.nextId = nextId;

}

}

Sequence 的 SQL 映射

SELECT

`SEQ`.`SEQNAME` AS `S_NAME`, `SEQ`.`SEQVALUE` AS `S_NEXTID` FROM `SEQ`

WHERE `SEQNAME` = #name#

UPDATE `B2手机BET365客户端CSEQ` SET `SEQVALUE`=#nextId# WHERE `SEQNAME` = #name#

经由过程 Sequence 获取 ID手机BET365客户端 的措施

public static synchronized String getNextId(String name) throws SQLException {

SqlMapSession sequenceSession=SessionManager.retrieveSession();

ISequence sequence = (ISequence) sequenceSession.queryForObject(

"getSequenceById", name);

if (sequence == null) {

throw new SQLException("Error: A null sequence was returned from the database" +

" (could not get next "+ name + " sequence).");

}

String id = sequence.getNextId();

sequence.setNextId((new BigDecimal(id).add(new BigDecimal(5))).toString());

sequenceSession.startTransaction();

sequenceSession.update("updateSequence", sequence);

sequenceSession.commitTransaction();

sequenceSession.close();

return String.valueOf(sequence.getNextId());

}

常见的类关系与实现

对付类与类之间的引用关系,最常见的是一对一,一对多与多对多。下面就讲述对这三种关系的实现。

一对一映射

在类与类之间关系中,一对一是最简单的一种。在每个类中有一个对其他类的引用,反之亦然。此时只需在 ibatis 的 result map 中建立对工具的引用关系即可:

清单 5. 一对一的引用

在上面的 mapping 中,A_BELONGEDCATALOG 为查询结果中的一个字段,而 getArticleCatalogById 为一个返回结果为 Catalog 的查询。是以 ibatis 在调用时,将会把 A_BELONGEDCATALOG 作为参数传入 getArticleCatalogById 来天生一个 Catalog 实例的引用 , 并将改引用赋值给 belongedCatalog 属性。

一对多映射

一对多关系与 1 对 1 关系的差别之处在于类中引用的工具为一个列表而非单个工具,是以在 resultmap 中的 mapping 是一样的,独一的差别在于关联的 select 返回的为一个列表而非单个工具(上例中的 getArticleCatalogById 的返回结果为一个工具,而对付一对多关系此措施将返回一个列表)。是以在这里不再给出实现。

多对多

在实现多对多关系时,每个类都可能包孕多个对对方类的引用列表,平日必要建立一张关系表用来存储关系映射,如下所示:

清单 6. 多对多的关系表

CREATE TABLE `ARTICLE_GROUP_RELATION` (

`GROUPID` varchar(10) not null ,

`ARTICLEID` varchar(10) not null );

在这里 Article 与 Group 两个工具之间存在多对多关系,GROUPID 与 ARTICLEID 字段分手对应与 Group 表与 Article 表的主键。若在 Group 工具中有一个对 Article 列表的引用,首先必要在 Group 的 resultmap 中定义一个 List 的属性。这个属性会映射到一条根据 GroupID 查出 Article 的语句 getArticleByArticleGroupId,该查询必要将上面定义的关系表与 Article 表进行连接,返回结果为一个 Article 的列表 :

清单 7. 多对多的关系映射

SELECT

`ARTICLE`.`ID` AS `A_ID`, `ARTICLE`.`NAME` AS `A_NAME`, `ARTICLE`.`INDUSTRY`

AS `A_ISINDUSTRY`, `ARTICLE`.`UPDATEDATE` AS `A_UPDATEDATE`

FROM ` ARTICLE `, ` ARTICLE_GROUP_RELATION `

WHERE `ARTICLE_GROUP_RELATION`.`GROUPID` = #id# AND

`ARTICLE_GROUP_RELATION`.`ARTICLEID` = `ARTICLE`.`ID`

必要留意的是,在对应的增添 / 删除 / 改动操作中,也必要调用一个 SQL 语句来更新关系表,否则会导致表中的数据不同等,以删除为例:

清单 8. 多对多的删除语句

DELETE FROM `ARTICLE_GROUP_RELATION` WHERE `GROUPID` = #id#

复合关系的分类与实现

上一章先容了类之间的关系的实现,本章在上一章的根基上,先容了几种工具主键与承袭类关系的实现。

工具主键

工具主键是一种异常特殊的主键实现,此时不是应用一个自动增长的 ID 作为类的主键,而是将类中所引用到的某个工具作为主键。是以,在建表的时刻就必要将主键工具表中的主键字段作为该表中的主键字段保存,同样在进行 resultmap 的定义时必要建立一个对与其他工具的引用:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: