ibatis学习总结

问题1:什么是Ibatis?

从设计理念和原理那里可以知道ibatis是一个混合型的解决方案,而本质上,ibatis是数据映射器(datamapper),用于在对象和数据库之间搬运数据,同时保证对象,数据库,以及映射器本身都相互独立。Ibatis与O/RM不同,它并不是直接把类直接映射到数据库表,而是把SQL语句的参数与结果(即输入和输出)映射为类。如下图:





Ibatis的映射层其实就是SQL,ibatis让你编写sql语句,然后负责在类的特性和数据库表的列之间映射参数和结果。Ibatis通常将所谓的”数据映射器”称为”sql映射器”

问题2:Ibatis的设计思想和设计原理是什么样的?

       Ibatis是一个结合了所有优秀思想的混合型解决方案。Ibatis的核心是sql。它从目前最流行的关系数据库访问方法中吸收了大量优秀的思想,并找出其中协同增效的作用如下图:




Ibatis从存储过程,内联sql,动态sql,对象关系映射(O/RM)中汲取优秀的思想,形成混合型解决方案。

存储过程是: 指在大型数据库中,一组为了完成特定功能的SQL语句集,经过编译之后,存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程有参数的话)来执行它。优点是能够快速的完成数据库中的数据操作。缺点是存储过程的开发很难符合现代应用程序的架构,难以编写,测试,部署,并且,一般数据库是由数据库小组所拥有控制权,没办法快速变更。


内联SQL : 

示例:

String name;

Date hiredate;

#sql{

SELECT emp_name, hire_date

INTO :name,:hiredate

FROM employee

WHERE emp_num=28959

};

将SQL嵌入到更加通用的语言中去,与存储过程将业务逻辑写入数据库相反,内联SQL是将SQL从数据库移到了应用程序代码中。优点:做到了与语言的紧密结合,本地语言变量传递给SQL做参数,SQL执行结果可直接赋值给类似变量。缺点:1、SQL不标准,存在很多扩展版,而每个版本又都只适用于某个特定的数据库。2、内联sql往往并是不实现为某个语言的特性,而是用一个预编译器将sql翻译成当前语言中对应的代码。


动态SQL:

示例:

String name;

Date hiredate;

String sql="SELECT emp_name,hire_date FROM employee WHERE emp_num=28959";

动态sql通过避免使用预编译来解决内联SQL存在的一些问题,作为替代,sql被表示成一种字符串的数据,可以像现代语言红所有其他的字符数据一样地操纵它。优点:灵活,即sql运行时基于不同的参数或动态的应用程序功能来构建,这就要求sql语句的where自居能够动态改变,使用动态sql就容易做到这一点。缺点:带来了大量的重复性的代码,而且本身比较长,在一行中写不完,就要打散字符串进行拼接,字符拼接导致可读性下降,维护使用都有困难。


对象/关系映射工具(O/RM):被设计来简化对象持久化工作的,sql不是自己编写的,是生成的,一些工具在应用程序构建或者编译的时候静态的生成sql,其他的在运行时动态生成。Sql是根据应用程序中的类和关系数据库中的表之间的映射关系而生成的。优点:它不仅生成sql,而且提供了一套完整的持久化架构,比如事物管理,高速缓存,延迟加载等。缺点:O/RM工具是基于一些假设和规则的,最普遍的就是假设数据库被恰当的规范化(第一范式,第二范式,第三范式那种规范化)了,如果一些数据库没有被很好的规范化,那映射的时候就会出现一些麻烦,甚至需要绕些弯路,或者在设计时对效率做些折衷,任何一个O/RM工具都只是任何一个特定数据库所具有的全部功能的一个子集。

 

Ibatis提供了与其他解决方案相同的优点。

方案

相同的优点

解决的问题

存储过程

Ibatis对sql进行了封装和外部化,使sql从你的应用代码中分离出来,ibatis具有有存储过程相似的API,但这些API是面向对象的,ibatis也完全支持对存储过程的直接调用。

业务逻辑从数据库中分离出来,应用程序更容易部署,也具有更好的可移植性。

内联sql

Ibatis允许有最自然的方式书写,没有字符串拼接,没有参数“设置”,没有结果“获取”

Ibatis对应用程序代码没有任何影响,不需要任何编译器,而且你能够访问sql的所有特性,而不是一个子集

动态sql

Ibatis提供了若干特性以支持基于参数的动态构建查询,不需要“查询构建工具”这样的API

Ibatis不要求sql被写成一堆字符串的拼接,中间还夹杂着应用代码

O/RM

Ibatis支持许多与O/RM工具一样的特性,例如延迟加载,连接抓取,高速缓存,运行时代码生成及继承

Ibatis可用于任意数据模型与任意对象模型的组合,它对这两者中的任何一个都设计没有任何约束要求。

 

 

Ibatis持久层所具有的两个最重要的特性就是外部化的SQL封装化的SQL,

外部化的SQL是将sql语句从源代码中分离出来,放到更自然使用的地方,然后与我们有的软件建立连接。

封装化的SQL是使用xml封装sql,通过定义sql的输入和输出,来封装它。

问题3:为什么要使用Ibatis?(和其他工具对比,突出Ibatis的优势。)

      Ibatis对小型,简单系统来说,1、ibatis本身就很小并且简单,只需要两个jar包和配置几个sql映射文件,其他的都不需要,不需要任何类型的中间件,不需要任何额外的基础设施,不需要第三方依赖。2、ibatis不会对应用程序或者数据库的现有设计强加任何影响。

     Ibatis对于大型,企业级系统,1、ibatis没有对数据库模型或对象模型的设计做任何假设,不论你的应用程序中,这两个模型之间多么的不匹配,ibatis都能适用。2、ibatis支持的行处理器使得他能够批处理超大型记录集,也支持只获取某个范围内的结果。3、ibatis支持你用多种方式建立从对象到数据库的映射关系(如支持白天事务功能,晚上批处理功能,ibatis支持将同一个类进行多种映射)。Ibatis支持多种数据获取策略(比如延迟加载)。

另外ibatis具有以下一些优点:简单性(直接构建与jdbc和sql之上),生产效率(不需要频繁的写jdbc代码了),性能(通过一种简单的方式配置和使用,性能与JDBC相当,另外JDBC API非常复杂,较底层来说不如ibatis),关注点分离(jdbc代码可以分布在任意层,而ibatis专注于持久层,使应用程序的其他部分与持久化相关的资源无关了),明确分工(sql很大程度上与源代码是分离的,人尽其责),可移植(几乎可以用任何语言在任何平台上实现),开源和诚实

且对比于hibernate和apacheOJB等“一站式”ORM解决方案而言,ibatis是一种半自动化的ORM实现。全自动的ORM实现,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全套映射机制。程序员往往只需要定义好POJO到数据库表的映射关系,即可通过Hibernate或者OJB提供的方法完成持久层的操作,程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成SQLBoingo调用JDBC接口加以执行。但很多情况下这种方式是不能胜任的,往往处于安全问题,开发团队不会清楚的看到数据库表,这个时候就需要ibatis的这种半自动化的ORM。

 

问题4:  Ibatis的核心概念?

        Ibatis的核心概念,应该结合上面介绍过的什么ibatis和ibatis的设计原理来说,

Ibatis的着力点在POJO和SQL之间产生映射关系,ibatis并不会为程序员在运行期自动生成SQL执行,具体的sql还是需要程序员编写,然后通过映射配置文件,将sql多需的参数,以及返回的结果字段映射到指定的POJO,ibatis以SQL开发的工作量和数据库移植性上的让步,为系统提供了更大的自由空间。作为全自动的一种有效的补充。

 

问题5:如何使用Ibatis?

首先配置ibatis,ibatis的起点是一个SqlMapConfig.xml文件,负责把所有的SQL映射文件组合在一起,SqlMapConfig.xml

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig PUBLIC"-//iBATIS.com//DTD SQL Map Config 2.0//EN"

       "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

       <transactionManager type=”JDBC”>//配置数据库连接事务

       <dataSource type=”SIMPLE”>

<property name=”JDBC.Driver” value=”XXX”>

</property>

</dataSource>

</ transactionManager>     

   <sqlMap resource="sqlmap.xml"/>//提供你的sqlmap,sqlmap中是定义的sql操作语句

</sqlMapConfig>

 

sqlMap.xml

<?xml version="1.0"encoding="GB2312" ?>

<!DOCTYPE sqlMap PUBLIC"-//iBATIS.com//DTD SQL Map 2.0//EN""http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap >

   <!-- 查询  -->

   <select id="getId" resultMap="hashmap" parameterClass="string">//根据id来使用这个语句,返回的结果是在hashmap中

SELECT * FROMuser where username=#username#

</select>

</sqlMap>

之后将ibatis依赖的包添加到工程中,到此就完成了ibatis配置,相当简单,之后就是在sqlmap中编写数据库的操作语句了。另外额外说明下在java文件夹下的调用。

   String resource="SqlMapConfig.xml";

   Reader reader= Resources.getResourceAdReader(resource);

   SqlMapClient sqlMap=SqlMapClientBuilder。buildSqlMapClient(reader);

   List list=sqlMap.queryForList("getid","admin");//根据加载的sqlMapConfig中的文件,加载sqlMap,根据id找到对应的sql语句,后一个参数是sql中的变量参数。返回的是hashmap,用list获取结果,然后打印。就这么简单。

   System.out.println("Selected"+list.size()+"records.");。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是讲述iBATIS框架的权威著作。书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)提供指导,也可为架构师的项目决策提供参考。项目经理、数据库管理员、质量保证员与测试员以及系统分析师也能从本书中受益。 目录: 第一部分 介绍 第1章 iBATIS的理念 2 1.1 一个结合了所有优秀思想的混合型解决方案 2 1.1.1 探索iBATIS的根源 3 1.1.2 理解iBATIS的优势 7 1.2 iBATIS适合应用在何处 10 1.2.1 业务对象模型 11 1.2.2 表现层 11 1.2.3 业务逻辑层 12 1.2.4 持久层 13 1.2.5 关系数据库 15 1.3 使用不同类型的数据库 17 1.3.1 应用程序数据库 17 1.3.2 企业数据库 18 1.3.3 私有数据库 19 1.3.4 遗留数据库 20 1.4 iBATIS如何解决数据库的常见问题 20 1.4.1 所有权与控制 20 1.4.2 被多个分散的系统访问 21 1.4.3 复杂的键和关系 21 1.4.4 数据模型的去规范化或过度规范化 22 1.4.5 瘦数据模型 23 1.5 小结 24 第2章 iBATIS是什么 26 2.1 映射SQL语句 27 2.2 iBATIS如何工作 29 2.2.1 iBATIS之于小型、简单系统 30 2.2.2 iBATIS之于大型、企业级系统 31 2.3 为何使用iBATIS 31 2.3.1 简单性 32 2.3.2 生产效率 32 2.3.3 性能 32 2.3.4 关注点分离 33 2.3.5 明确分工 33 2.3.6 可移植性:Java、.NET及其他 33 2.3.7 开源和诚实 33 2.4 何时不该使用iBATIS 34 2.4.1 当永远拥有完全控制权时 34 2.4.2 当应用程序需要完全动态的SQL时 34 2.4.3 当没有使用关系数据库时 35 2.4.4 当iBATIS不起作用时 35 2.5 5分钟内用iBATIS创建应用程序 35 2.5.1 安装数据库 36 2.5.2 编写代码 36 2.5.3 配置iBATIS(预览) 37 2.5.4 构建应用程序 38 2.5.5 运行应用程序 39 2.6 iBATIS未来的发展方向 40 2.6.1 Apache软件基金会 40 2.6.2 更简单、更小且依赖性更少 40 2.6.3 更多的扩展点和插件 41 2.6.4 支持更多的平台和语言 41 2.7 小结 41 第二部分 iBATIS基础知识 第3章 安装和配置iBATIS 44 3.1 获得一份iBATIS发布 45 3.1.1 二进制发布 45 3.1.2 从源代码构建 45 3.2 发布中包含的内容 47 3.3 依赖性 48 3.3.1 针对延迟加载的字节码增强 48 3.3.2 Jakarta Commons数据库连接池 49 3.3.3 分布式高速缓存 49 3.4 将iBATIS添加到应用程序中 49 3.4.1 在独立应用程序中使用iBATIS 50 3.4.2 在Web应用程序中使用iBATIS 50 3.5 iBATIS和JDBC 51 3.5.1 释放JDBC资源 51 3.5.2 SQL注入 51 3.5.3 降低复杂度 52 3.6 配置iBATIS(续) 53 3.6.1 SQL Map配置文件 54 3.6.2 properties元素 55 3.6.3 settings元素 56 3.6.4 typeAlias元素 58 3.6.5 transactionManager元素 60 3.6.6 typeHandler元素 61 3.6.7 sqlMap元素 61 3.7 小结 62 第4章 使用已映射语句 63 4.1 从基础开始 63 4.1.1 创建JavaBean 64 4.1.2 SqlMap API 66 4.1.3 已映射语句的类型 67 4.2 使用select已映射语句 70 4.2.1 使用内联参数(用#做占位符) 70 4.2.2 使用内联参数(用$做占位符) 71 4.2.3 SQL注入简介 72 4.2.4 自动结果映射 73 4.2.5 联结相关数据 74 4.3 映射参数 75 4.3.1 外部参数映射 75 4.3.2 再论内联参数映射 76 4.3.3 基本类型参数 78 4.3.4 JavaBean参数和Map参数 78 4.4 使用内联结果映射和显式结果映射 78 4.4.1 基本类型结果 79 4.4.2 JavaBean结果和Map结果 81 4.5 小结 81 第5章 执行非查询语句 82 5.1 更新数据的基本方法 82 5.1.1 用于非查询SQL语句的SqlMap API 82 5.1.2 非查询已映射语句 83 5.2 插入数据 84 5.2.1 使用内联参数映射 84 5.2.2 使用外部参数映射 85 5.2.3 自动生成的键 86 5.3 更新和删除数据 88 5.3.1 处理并发更新 88 5.3.2 更新或删除子记录 89 5.4 运行批量更新 90 5.5 使用存储过程 91 5.5.1 优缺点分析 92 5.5.2 IN、OUT和INOUT参数 93 5.6 小结 95 第6章 使用高级查询技术 96 6.1 在iBATIS中使用XML 96 6.1.1 XML参数 96 6.1.2 XML结果 98 6.2 用已映射语句关联对象 101 6.2.1 复杂集合 101 6.2.2 延迟加载 104 6.2.3 避免N+1查询问题 105 6.3 继承 107 6.4 其他用途 109 6.4.1 使用语句类型和DDL 109 6.4.2 处理超大型数据集 109 6.5 小结 115 第7章 事务 116 7.1 事务是什么 116 7.1.1 一个简单的银行转账示例 116 7.1.2 理解事务的特性 118 7.2 自动事务 120 7.3 局部事务 121 7.4 全局事务 122 7.4.1 使用主动或被动事务 123 7.4.2 开始、提交以及结束事务 124 7.4.3 我是否需要全局事务 124 7.5 定制事务 125 7.6 事务划界 126 7.6.1 将事务在表现层划界 128 7.6.2 将事务在持久层划界 128 7.6.3 将事务在业务逻辑层划界 128 7.7 小结 129 第8章 使用动态SQL 130 8.1 处理动态WHERE子句条件 130 8.2 熟悉动态标签 132 8.2.1 dynamic标签 134 8.2.2 二元标签 135 8.2.3 一元标签 136 8.2.4 参数标签 137 8.2.5 iterate标签 138 8.3 一个简单而完整的示例 139 8.3.1 定义如何检索和显示数据 140 8.3.2 确定将涉及哪些数据库结构 140 8.3.3 以静态格式编写SQL 141 8.3.4 将动态SQL标签应用到静态SQL上 141 8.4 高级动态SQL技术 142 8.4.1 定义结果数据 142 8.4.2 定义所需的输入 143 8.4.3 以静态格式编写SQL 144 8.4.4 将动态SQL标签应用到静态SQL上 145 8.5 动态SQL的其他替代方案 147 8.5.1 使用Java代码 147 8.5.2 使用存储过程 150 8.5.3 同iBATIS相比较 152 8.6 动态SQL的未来 152 8.6.1 简化的条件标签 152 8.6.2 表达式语言 153 8.7 小结 153 第三部分 真实世界中的iBATIS 第9章 使用高速缓存提高性能 156 9.1 一个简单的iBATIS高速缓存示例 156 9.2 iBATIS高速缓存的理念 157 9.3 理解高速缓存模型 158 9.3.1 type属性 158 9.3.2 readOnly属性 159 9.3.3 serialize属性 159 9.3.4 联合使用readOnly属性和serialize属性 159 9.4 如何使用高速缓存模型中的标签 160 9.4.1 高速缓存的清除 160 9.4.2 设置高速缓存模型实现的特性 163 9.5 高速缓存模型的类型 163 9.5.1 MEMORY 163 9.5.2 LRU 164 9.5.3 FIFO 165 9.5.4 OSCACHE 166 9.5.5 你自己的高速缓存模型 166 9.6 确定高速缓存策略 166 9.6.1 高速缓存只读的长效数据 167 9.6.2 高速缓存可读写数据 169 9.6.3 高速缓存旧的静态数据 170 9.7 小结 172 第10章 iBATIS数据访问对象 173 10.1 隐藏实现细节 173 10.1.1 为何要分离 174 10.1.2 一个简单示例 175 10.2 配置DAO 177 10.2.1 properties元素 177 10.2.2 context元素 178 10.2.3 transactionManager元素 178 10.2.4 DAO元素 182 10.3 配置技巧 183 10.3.1 多个服务器 183 10.3.2 多种数据库方言 184 10.3.3 运行时配置更改 185 10.4 基于SQL Map的DAO实现示例 185 10.4.1 配置iBATIS DAO 186 10.4.2 创建DaoManager实例 187 10.4.3 定义事务管理器 187 10.4.4 加载映射 188 10.4.5 DAO实现编码 191 10.5 小结 193 第11章 DAO使用进阶 194 11.1 不是基于SQLMap的DAO实现 194 11.1.1 Hibernate版本的DAO实现 194 11.1.2 JDBC版本的DAO实现 199 11.2 为其他数据源使用DAO模式 203 11.2.1 示例:为LDAP使用DAO 203 11.2.2 示例:为Web服务使用DAO 208 11.3 使用Spring DAO 209 11.3.1 编写代码 209 11.3.2 为什么使用Spring代替iBATIS 211 11.4 创建自己的DAO层 211 11.4.1 从实现中分离出接口 212 11.4.2 创建一个工厂以解耦 212 11.5 小结 214 第12章 扩展iBATIS 215 12.1 理解可插拔组件的设计 215 12.2 使用自定义类型处理器 217 12.2.1 实现自定义类型处理器 217 12.2.2 创建TypeHandlerCallback 218 12.2.3 注册TypeHandlerCallback以供使用 221 12.3 使用CacheController 222 12.3.1 创建CacheController 223 12.3.2 CacheController的放入、获取以及清除操作 223 12.3.3 注册CacheController以供使用 224 12.4 配置iBATIS不支持的DataSource 224 12.5 定制事务管理 225 12.5.1 理解TransactionConfig接口 226 12.5.2 理解Transaction接口 227 12.6 小结 228 第四部分 iBATIS使用秘诀 第13章 iBATIS最佳实践 230 13.1 iBATIS中的单元测试 230 13.1.1 对映射层进行单元测试 231 13.1.2 对DAO进行单元测试 233 13.1.3 对DAO的消费层进行单元测试 235 13.2 管理iBATIS配置文件 237 13.2.1 将其保存在类路径上 237 13.2.2 集中放置文件 238 13.2.3 主要按返回类型来组织映射文件 239 13.3 命名规范 239 13.3.1 语句的命名 239 13.3.2 参数映射的命名 239 13.3.3 结果映射的命名 240 13.3.4 XML文件的命名 240 13.4 Bean、map还是XML 240 13.4.1 JavaBean 241 13.4.2 Map 241 13.4.3 XML 241 13.4.4 基本类型 241 13.5 小结 241 第14章 综合案例研究 243 14.1 设计理念 243 14.1.1 账户 243 14.1.2 目录 244 14.1.3 购物车 244 14.1.4 订单 244 14.2 选择具体的实现技术 244 14.2.1 表现层 244 14.2.2 服务层 244 14.2.3 持久层 245 14.3 调整Struts:使用BeanAction 245 14.3.1 BaseBean 246 14.3.2 BeanAction 246 14.3.3 ActionContext 246 14.4 JGameStore工程结构 247 14.4.1 src文件夹 247 14.4.2 test文件夹 248 14.4.3 web文件夹 248 14.4.4 build文件夹 248 14.4.5 devlib文件夹 248 14.4.6 lib文件夹 249 14.5 配置web.xml文件 249 14.6 设置表现层 251 14.6.1 第一步 251 14.6.2 使用表现层bean 253 14.7 编写服务层代码 257 14.7.1 配置dao.xml文件 258 14.7.2 事务划界 259 14.8 编写DAO 260 14.8.1 SQLMap配置 260 14.8.2 SQLMap文件 261 14.8.3 接口和实现 262 14.9 小结 263 附录A iBATIS.NET快速入门 264 A.1 比较iBATISiBATIS.NET 264 A.1.1 为何Java开发人员应该关心iBATIS.NET 264 A.1.2 为何.NET开发人员应该关心iBATIS.NET 265 A.1.3 主要区别是什么 265 A.1.4 相似之处又在哪里 265 A.2 使用iBATIS.NET 265 A.2.1 DLL和依赖性 265 A.2.2 XML配置文件 266 A.2.3 配置API 267 A.2.4 SQL映射文件 267 A.3 到哪里去查找更多的信息 269

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值