首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ibatis 使用文档 (下篇)

2012-11-25 
ibatis 使用文档 (上篇)(代码下载地址:http://download.csdn.net/detail/partner4java/4760043)iBATIS一词

ibatis 使用文档 (上篇)

(代码下载地址:http://download.csdn.net/detail/partner4java/4760043)

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
创建于2002年,后很快加入了Apache,但是2010年又易主到google code,并改名为MyBatis。
本篇文章主要是基于iBATIS来进行展示,后面会再发一篇和MyBatis的对比。
(本文大多摘自《iBATIS in action》一书,若有时间学习此书,建议不要看本文--因为书中更详细,且本文可能存在技术点上的错误分析)

==================================================================================================
第1章 iBATIS的理念

(导读:本章主要介绍iBATIS框架的设计理念,可能会随带几个iBATIS的展示,目前不需要关心如何去书写或代码规范,只需要对概念有所了解即可)

SQL(Structured Query Language,结构化查询语言)已经存在很长一段时间了。而且在接下来的很长一段时间内还会继续存在。
iBATIS的建立正是基于这样的思想:关系数据库和SQL仍然很有价值,在整个产业范围内对SQL投资仍然是一个非常好的注意。
我们可能都曾有过这样的经历,应用程序的源代码(即使发展了很多版本)随着时间的流逝最终还是过时了,但他的数据库甚至是SQL本身却仍然很有价值。
在某些情况下我们也会看到一个应用程序已经被其他的语句重写了,但背后的SQL和数据库却基本上保持不变。

正是基于这些原因,iBATIS并不试图去隐藏SQL或者避免使用SQL。
相反,正是iBATIS这个持久层框架广泛使用了SQL,他使得SQL更容易使用、更容易集成到现代的面向对象软件中。

混合型解决方案在IT领域同样被证明是非常有效的。iBATIS就是这样一个混合型的持久层解决方案。

一:探索iBATIS的根源
iBATIS是一个混合型解决方案。他吸取了SQL、老式存储过程(“两层应用程序”)、现代存储过程、内联SQL、动态SQL、ORM这些解决方案中最有价值的思想并将他们融会贯通。

iBATIS提供的与其他解决方案相同的优点:
-------------------------------------------------
方 案相同的优点解决的问题
   存储过程 iBATIS对SQL继续拧了封装和外部化,使SQL从你的应用程序业务逻辑从数据库中分离出来,应用程序更容易
中分离出来。iBATIS具有与存储过程类似的API,但iBATIS的部署与测试,也具有更好的移植性
这些API是面向对象的。iBATIS也完全支持对存储过程的直接
调用

内联SQL iBATIS运行SQL以其自然的的方式书写。没有字符串拼接,没iBATIS对应用程序代码没有任何影响。不需要
有参数“设置”,没有结果“获取”任何预编译器,并且你能完全访问SQL的所有特性
,而不是一个子集

动态SQL iBATIS提供了若干特性以支持基于参数的动态构建查询。不需iBATIS不需要SQL被写成一堆字符串的拼接,中间
要“查询构建工具”这样的API还夹杂着应用程序代码

ORM iBATIS支持许多与ORM工具一样的特性,例如延迟加载、连接iBATIS可用于任意模型和对象模型的组合。他对这
抓取、高速缓存、运行时代码生成以及继承两者中的任何一个设计没有任何约束和要求

iBATIS框架的核心价值:外部化SQL和封装SQL

二:外部化SQL
“总是将一个大系统设计为多个子系统,每个子系统的功能都相对集中”。
应该尽可能的降那些由不同的开发角色处理的任何分离开。
外部化将SQL从应用程序的源代码中分离出来,从而使得两者都更加清晰。
这样就保证了SQL语句与任何特定的语言或平台都想对的独立。
在以前的书写方式中,在代码中拼写SQL,容易引起空格等错误,特别是如果你有一条复杂的SQL语句。
这时iBATIS的一个主要优点就体现出来了:使用iBATIS你就拥有按照最自然的方式写SQL的能力。


问题2:我们无论是否借助框架,或者借助其他ORM框架,对表的查询结果是不是要封装到Java对象中啊?

2.创建JavaBean
bean的构成 -- 本质上而言,JavaBean规范就是一组规则,用于定义Java开发可使用的组件。
这些规则使得工具创建者可以知道如何与我们在应用程序中所使用的组件进行交互。
规范可以看做是框架开发人员和应用程序开发人员的一个中间层公共语言。

问题3:有了存放结果的对象,那么如何查询结果呢?
3.iBATIS API的核心是SqlMapClient接口。

SqlMapClient大致相当于Hibernate的Session或者JPA的EntityManager,用于执行全部的数据访问操作。


核心工具类SqlMapClient接口有很多方法,我们来介绍几个核心方法:

queryForObject()方法 --
queryForObject()方法用于从数据库中获取一条记录,并把它放入到一个Java对象中。
它有以下两种签名:
queryForObject(String id, Object parameter)
queryForObject(String id, Object parameter,Object result)
第一种签名较为常用,只要所返回的对象有默认构造器(default constructor),它就能为你创建它(如果没有,就会抛出运行时异常)。
第二种签名接受一个将被用作返回值的对象 -- 运行已映射语句之后,该方法并不会创建一个新的对象,而是在该语句中设置特性。如果你请求的对象不能被轻易创建,那么这种方式非常有用。
使用queryForObject()方法时需要记住的是,如果查询返回了不止一行,该方法就会抛出异常,因此它总会检查以确保仅返回一行。

queryForList()方法 --
queryForList()方法用于从数据库中返回一行或多行,并把它放入到一个Java对象列表中,和queryForObject一样,该方法也有两个版本
queryForList(String id, Object parameter) throws java.sql.SQLException;
queryForList(String id, Object parameter, int skip, int max) throws java.sql.SQLException;
第一个版本的方法将已映射语句所返回的所有对象全部返回。而第二个版本的方法只返回其中的一部分--它将跳到skip参数所指定的位置上,并返回从查询结果开始的max行。

queryForMap()方法 --
queryForMap()方法用于从数据库中返回一行或多行组成的一个Java Map。
queryForMap(String id, Object parameter, String key) throws java.sql.SQLException;
queryForMap(String id, Object parameter, String key, String value) throws java.sql.SQLException;
第一个版本的方法将执行一个查询,并返回由一组Java对象组成的Map,其中这些对象的键值由key参数所指定的特性来标识,而值对象则为已映射语句返回的对象。
第二个版本的方法将返回一个类型的Map,但是这些对象将会是value参数所标识对象的特性。


二:使用select已映射语句
从数据库中获取数据是一个应用程序中最基本的操作之一。iBATIS框架使得编写大部分的SELEC语句都毫不费力,并且提供了很多特性,使得你几乎可以从数据库中得到任何想要的数据。

问题:我们前面SQL中包含了groupname=#groupname#,这么个东东,可以从结构上猜想这应该是传入参数的固定格式。那么具体如何定义和使用呢?
(两种方式#和$)
1.使用内联参数(用#做占位符)
内联参数(inline parameter)就是一种在已映射语句中添加查询条件的简单方式,你可以使用两个不同的方法来设置内联参数。
第一个方法是使用散列(#)符号。
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);List list = sqlMap.queryForList("getUsersByGroupName4", "%EMPLOYEE%");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}


热点排行