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.");。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值