【0】README
1)本文部分内容转自 “ibatis in action”,旨在 review “ibatis的理念” 的相关知识;
【1】结合所有优秀思想的混合型解决方案
在现实世界中,混合型解决方案随处可见。将两个看上去相悖的思想在中间处巧妙结合,被证明是一种有效的方法,它往往能够恰到好处地解决问题,在某些case下甚至会导致一些新兴行业的诞生;
汽车工业就是一个最典型的荔枝: 运输工具大部分的设计革新都来自于对不同思想的混合。将小轿车与大蓬货车结合最终形成了我们现在的家用房车。把卡车和越野车相结合,于是就有了现代城市人身份的象征——运动型多功能车(sport utility vehicle,SUV);将高速汽车与旅行汽车相结合,于是就有了驾驶起来很舒服的家用轿车。在汽油引擎旁边安装一个电力引擎,于是目前北美很多环境问题就都可以迎刃而解了;
ibatis 就是这样一种混合型解决方案;
【1.1】探索ibatis的根源
1)ibatis从目前最流行的关系数据库访问方法中吸收了大量的优秀idea,并找出其中的协同增效作用;
【1.2】理解 ibatis的优势
1)下表总结了 ibatis 所吸取的idea;
Attention)ibatis持久层所具有的两个最重要的特性: 外部化sql 和 封装 sql;(干货——ibatis最重要的两个特性——外部化sql 和 封装 sql;)
【1.2.1】外部化的SQL
1)problem+solution:
1.1)problem: 看如下sql,SELECT PRODUCTID, NAME, DESCRIPTION, CATEGORY FROM PRODUCT WHERE CATEGORY = ? -- 再看 sql 的字符串拼接,使得原本很简单的sql 变得难以管理; String s = "SELECT" + " PRODUCTID," + " NAME," + " DESCRIPTION," + " CATEGORY" + " FROM PRODUCT" + " WHERE CATEGORY = ?";
1.2)solution:使用ibatis你就可以按照最自然的方式书写sql,如下:SELECTPRODUCTID,NAME,DESCRIPTION,CATEGORY FROM PRODUCT WHERE CATEGORY = #categoryId#
【1.2.2】封装SQL
1)intro:ibatis 使用 XML 来封装 SQL,选择XML 是因为它有很好的跨平台性,得到行业内广泛使用;
2)ibatis 允许你将输入输出参数映射为某些对象的特性,如下所示:
<select id="categoryById"parameterClass="string" resultClass="category">SELECT CATEGORYID, NAME, DESCRIPTIONFROM CATEGORYWHERE CATEGORYID = #categoryId#
</select>
Attention)注意包围在 SQL 语句周围的xml 元素这就是对 SQL 的封装;
【2】ibatis 适合用在何处
1)下图给出了一个典型的分层策略的高级视图:(箭头读作依赖或使用)
对上图的分析(Analysis):
A1)这种分层设计:来源于 德米特法则,该法则的另一种表达方式是:每一层都应该只对那些与自己紧密相关的层有优先的了解;A2)每一层都与自己 的直接下层打交道:这就保证了依赖流只有一个方向,从而避免了 那种在没有分层设计的应用程序中非常普遍的 意大利面 式的代码;
【2.4】持久层
1)intro:持久层是 使用ibatis的地方;
2)持久层要关注: 对象的存取 + 抽象;
3)持久层分为三层:抽象层, 持久化框架, 驱动程序/接口层, 如下图所示;
3.1)抽象层:目的在于为持久层提供一致且有意义的接口;
3.2)持久化框架:负责与数据库驱动程序(或接口)的交互;且持久化框架通常只针对一类存储设施,如你可能会找到专用于处理 XML 文件的数据存储的持久化 API;3.3)驱动程序/接口层: 在底层与 存储设施通信以交互数据;数据库驱动程序总是非常 complicated,所以就需要由持久化框架来与 这些驱动程序通信,从而将它们之间的不同简化并降低到最低点;
Attention)ibatis 支持将关系数据映射为 java 基本类型,map 实例,xml 还有用户定义类;