Ibatis 框架的基本介绍及基础操作

《一》、iBatis框架的基本介绍:

      Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate、Toplink等在java编程的对象持久化方面深受开发人员欢迎。

对象关系映射(ORM):简单原理是通过面向对象方式操作关系型数据库,目前存储数据最常用最流行的工具是关系型数据库,其操作方式是通过 SQL语句操作数据库的表,但是对于Java面向对象编程语言中,所有的操作对象都是对象,因此对象关系映射就是把数据库表和java编程语言中的对象对 应起来,把表的列同java对象中的字段对应起来,程序员在程序开发过程中不再是使用原始SQL语句去直接操作数据库,而是通过ORM提供的查询语句操作 普通的java对象,ORM将其提供的对普通java对象的查询语句翻译成SQL语句来操作数据库,从而屏蔽了不同数据库SQL语句的差别,简化了程序开 发工作,提高了程序的可移植性。

     

一、为啥使用iBatis?
    在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案盛行之前,iBaits 基本是持久层框架的不二选择。即使在持久层框架层出不穷的今天,iBatis 凭借着易学易用、轻巧灵活等特点,也仍然拥有一席之地。尤其对于擅长 SQL 的开发人员来说,iBatis 对 SQL 和存储过程的直接支持能够让他们在获得 iBatis 封装优势的同时而不丧失 SQL 调优的手段,这是 Hibernate/JPA 所无法比拟的。具体而言,使用 iBatis 框架的主要优势主要体现在如下几个方面:
 首先,iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL 本身,而不需要花费精力去处理例如注册驱动,创建 Connection,以及确保关闭 Connection 这样繁杂的代码。
 其次,iBatis 可以算是在所有主流的持久层框架中学习成本最低,最容易上手和掌握的框架。虽说其他持久层框架也号称门槛低,容易上手,但是等到你真正使用时会发现,要想掌握并用好它是一件非常困难的事。在工作中我需要经常参与面试,我曾听到过很多位应聘者描述,他们所在的项目在技术选型时选择 Hibernate,后来发现难以驾驭,不得不将代码用 JDBC 或者 iBatis 改写。

二、iBATIS 是什么?

   iBatis是一个持久层框架,它能够自动在java、.NET和Ruby on Rails中与SQL数据库和对象之间的映射。映射是从应用程序逻辑封装在XML配置文件中的SQL语句脱钩。

    iBatis是一个轻量级的框架和持久性API适合持久化的POJO(普通Java对象)。

    iBatis是被称为一个数据映射和映射需要的类的属性和数据库中的表的列之间的参数和结果。

    iBatis和其他持久化框架,如Hibernate之间的显著区别在于,iBATIS强调使用SQL,而其他的框架通常使用一个自定义的查询语言,具有Hibernate查询语言(HQL)或Enterprise JavaBeans的查询语言(EJB QL)。

三.iBatis的设计理念:

        iBatis提供了以下的设计理念:
    1、简单: iBATIS的被广泛认为是可用的最简单的持久化框架之一。
    2、快速开发:iBATIS的理念是尽一切可能,以方便超快速开发。
    3、可移植性: iBATIS可用于几乎任何语言或平台,如Java,Ruby和C#,微软.NET实现。
    4、独立的接口:iBATIS提供独立于数据库的接口和API,帮助应用程序的其余部分保持独立的任何持久性相关的资源。
    5、开源:iBATIS是自由和开放源码软件。

四.iBatis的优点

         使用iBATIS的一些优势:
     1、支持存储过程:iBATIS的SQL封装以存储过程的形式,使业务逻辑保持在数据库之外,应用程序更易于部署和测试,更便于移植。
     2、支持内嵌的SQL:预编译器不是必需的,并有完全访问所有的SQL语句的特性。
     3、支持动态SQL: iBATIS特性提供基于参数动态生成SQL查询。
     4、支持O / RM:iBATIS支持许多相同的功能作为一个O / RM工具,如延迟加载,连接抓取,缓存,运行时代码生成和继承。
 Ibatis优缺点总结:

优势:使用标准的Sql语句,与JDBC相比简单方便,减少了代码量,架构和性能得到增强;与Hibernate等ORM工具相比因为更接近Sql语句,性能可控;sql语句与程序代码分隔,简化了项目分工,大大提高并行开发的可能性。

缺点:还需要写标准的sql语句,不像Hibernate完全屏蔽了底层数据库的差异,程序的 可移植性比Hibernate和JPA要差 ; 输入参数和输出参数都只能有一个 ,程序编写的灵活性不是太高。


    

五、iBatis到MyBatis

     iBatis 自从在 Apache 软件基金会网站上发布至今,和他的明星兄弟们(Http Server,Tomcat,Struts,Maven,Ant 等等)一起接受者万千 Java 开发者的敬仰。在 Apache 寄居六年之后,iBatis 将代码托管到 Google Code。在声明中给出的主要理由是,和 Apache 相比,Google Code 更有利于开发者的协同工作,也更能适应快速发布。于此同时,iBatis 更名为 MyBatis。

    从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 JDK 的泛型和注解特性进行了简化。iBatis 确实该退休了,因为一个更为出色的继任者经过 10 个 Beta 版本的蜕变已然出现在我们的面前。

《二》、 Ibatis的基本操作
1、Ibatis开发的准备工作:

(1).将Ibaits相关的jar包添加到工程的类路径下。

(2).Ibatis工程的主要配置文件为:

a.Ibatis的总配置文件SqlMapConfig.xml。

b.Ibatis的实体映射文件。

2、Ibatis总配置文件sql-map-config.xml:

Ibatis的总配置文件主要是配置数据库连接相关信息,和Ibatis实体映射文件。其写法示例如下:

<? xml version=”1.0” encoding=”UTF-8” ?>  
<! DOCTYPE sqlMapConfig public “-//ibatis.apache.org//DTD SQL Map Config 2.0//EN” “http://ibatis.apache.org//dtd//sql-map-config-2.dtd”> <sqlMapConfig>  <transactionManager type=”JDBC” commitRequired=”false”>   <dataSource type=”SIMPLE”>    <property name= “JDBC.Driver” value=”数据库的jdbc驱动”/>    <property name=”JDBC.ConnectionURL” value=”数据库的url”/>    <property name=”JDBC.Username” value=”数据库用户名”/>    <property name=”JDBC.Password” value=”数据库的密码”/>    ……   </dataSource>  </transactionManager>  <sqlMap resource=”Ibatis的实体映射文件”/>  …… </sqlMapConfig>
3、 Ibatis实体映射文件user.xml的写法示例:

Ibatis的实体映射文件是Ibatis框架的核心,起作用是将Java的持久化实体对象和关系型数据库映射起来,其内容主要是包括java实体各种增删改查操作对应的数据库语句。其写法示例如下:

<? xml version=”1.0” encoding=”UTF-8” ?>  
<! DOCTYPE sqlMap public “-//ibatis.apache.org//DTD SQL Map 2.0//EN” “http://ibatis.apache.org//dtd//sql-map-2.dtd”> <sqlMap namespace=”Ibatis命名空间”>  <typeAlias alias=”实体类类别名” type=”实体类全路径”/>  <!--restultMap主要是用于Ibatis对数据增删改查操作的返回值结果对于java对象的映射,一般用于所返回的对象可能包含的是一个以上java对象的字段,如果是一个java对象中的字段一般使用resultClass-->  <resultMap id=”结果集id” class=”实体类别名”>   <result property=”java实体类中的属性名” column=”数据库表中的列名”/>   ……  </resultMap>  …… </sqlMap>
   4、   读取Ibatis的总配置文件得到SqlMapClient:
private static SqlMapClient sqlMapClient = null;  
static{  
  try{  
 Reader reader = com.ibatis.common.resource.Resources.getResourceAsReader(“Ibatis总配置文件路径”);  sqlMapClient = com.ibatis.sqlMap.client.SqlMapClientBuilder.builderSqlMapClient(reader);  reader.close();   }catch(IOException e){  异常处理…….   } }
  5、   Ibatis的SQL Map:

(1).Ibatis的SQL Map的核心概念是Mapped Statement。Mapped Statement可以使用任意的SQL语句,并拥有 parameterMap/parameterClass(输入参数)和resultMap/resultClass(输出结果)。

(2). <statement>元素是个通用的声明,可以用于任何类型的SQL语句,但是通常使用具体的<statement>类型, 如:查询使用<select>,添加使用<insert>,更新使用<update>,删除使 用<delete>。

   6、  Ibatis的增删改查操作简单例子:

(1).实体类必须遵循JavaBean的规范,提供一个无参数的构造方法,字段必须提供get和set方法。

(2).在Ibatis对应的实体映射文件的<sqlMap>标签元素添加如下:

7、Ibatis添加:
<insert id=”Ibatis添加实体操作Id” parameterClass=”参数类型”> insert into 实体对应数据库中的表名(实体字段对应的表的列名1, 实体字段对应的表的列名2,……) values(#实体类字段1#,#实体类字段2#......); </insert>

注意:Ibatis增删改查语句的参数是通过 parameterClass或者parameterMap 传递的。 Ibatis只能传递 一个参数 ,如果又多个参数需要封装在一个对象中。

 8、Ibatis删除:
<delete id=”Ibatis删除实体操作Id” parameterClass=”参数类型”> delete from 实体对应数据库中的表名 where 列名=#列名对应的实体字段名#; </delete>

注意:删除和查询时,经常需要根据一定条件操作,有时可能需要模糊查询,对于

c. Ibatis 模糊查询

如name like‘%c%’。在Ibatis中有两种写法:

写法1:在java方法中传递参数时写成:”%字段名%”。

写法2:在Ibatis的sql语句中可以写成如:where name=’%$字段名$%’。

 9、 Ibatis更新:
<update id=”Ibatis更新实体操作Id” parameterClass=”参数类型”> update 实体对应数据库的表名 set 列名1=#字段1#,列名2=#字段2#,…….where ….; </update> 
 10、  Ibatis查询
<select id=”Ibatis查询实体操作Id” resultClass=”查询结果类型” > select * from 实体对应的表名; </select>

注意:这里演示的是最简单的查询,其结果是一个实体的集合。

 11、  在java对象中使用Ibatis的statement操作:

(1).根据Ibatis总配置文件得到SqlMapClient对象,具体方法参见“5. 读取Ibatis的总配置文件得到SqlMapClient”。

(2).使用SqlMapClient对象的 queryForObject(),queryForList(),insert(),delete(),update()方法 。这些方法都需要一个传递一个参数: 在实体映射文件中定义的操作statementId ,如果这些定义的操作还需要输入参数,则还需要传递输入参数对象。简单用法如下:

实体对象类型 对象= sqlMapClient.queryForObject(“实体映射文件命名空间.statementId”, “查询条件参数”); 
例如:
user = (User) sqlMapClient.queryForObject("querybyid",id);
list = sqlMapClient.queryForList("queryAll",user);
sqlMapClient.update("update", user);
sqlMapClient.delete("delete",id); sqlMapClient.insert("insert", user); user = (User)sqlMapClient.queryForObject("login", u);
  12、  Ibatis主键自动生成:

通过使用 <select>的子元素<selectkey>来支持自动生成主键 。对于不同的数据库主键自动生成机制是不同的,Oracle是通过自增序列欲生成的,MS-SQL Server是通过Identity后生成的。这里以Oracle数据库为例简单讲述一下主键自动生成的方法:

(1).首先在Oracle数据库中创建一个自增的序列:
create Sequence 序列名
start with 1 increment 1;
(2).在insert标签中插入selectkey子标签:
<insert id=”添加实体操作Id” parameterClass=”输入参数类型”> <selectkey resultClass=”int” keyProperty=”自定义主键名称”> select 序列名.nextval from dual; </selectkey> insert into 表名(主键,列名1,列名2,……) values(#自定义主键名称#,#字段1#,#字段2#,…….); </insert>

注意:selectkey标签中的keyProperty属性是主键赋值的对象。

13、 Ibatis的内嵌参数:

所谓内嵌参数是指,使用Ibatis时,当没有给定参数传递值时,Ibatis会使用默认的值代替。

语法为:#参数值:数据库中数据类型:内嵌参数#

一个简单的例子如下:

<statement id=”insertProduct” parameterClass=”Product”> Insert into Product(PRD_ID,PRD_DESC) values(#id:Number:-999999#,#desc:varchar:noEntry#); </statement>

当id没有给定值是数据库中默认为0,当desc没有给定值是数据库默认给定noEntry。

  14、 Ibatis对象之间的关系:

Ibatis的输入参数和输出参数只能是一个,因此,当输入参数在一个实体对象时,使用 parameterClass ,当输入对象也只在一个实体对象中时,使用 resultClass 。

但是有很多时候输入参数和输出参数可能包含在几个实体对象中,我们不能为了只传递一个参数而专门为这些输入和输出参数组合专门创建类,因此就需要使用 parameterMap和resultMap 来组合多个实体对象中的字段。

以resultMap为例,使用方法如下:

<resultMap id=”resultMapId”>  
       <result property=”……” column=”…….” select=”实体映射文件中的StatementId”/> …… </resultMap> 
<sqlMap>
  <typeAlias alias="User" type="com.pojo.User" /> <resultMap id="UserResult" class="User"> <result property="id" column="ID" />  <result property="username" column="USERNAME" />  <result property="password" column="PASSWORD" />  </resultMap>   <select id="login" resultMap="UserResult" parameterClass="User">   select * from USER where USERNAME=#username# and PASSWORD=#password#  </select>   <insert id="insert" parameterClass="User">   insert into USER(ID,USERNAME,PASSWORD)values(#id#,#username#,#password#)  </insert>   <delete id="delete" parameterClass="int"> delete from USER where ID = #id# </delete>   <update id="update" parameterClass="User"> update USER set USERNAME=#username#,PASSWORD=#password# where ID = #id# </update>   <select id="querybyid" parameterClass="int" resultClass="User"> select * from USER where ID = #id# </select> <select id="queryAll" parameterClass="User" resultClass="User"> select * from USER </select> </sqlMap>
15、  Ibatis的SQL Map通过<procedure>标签元素调用存储过程:

存储过程是数据库将一组完成特定功能的Sql语句进行编译,每次调用时不必重新编译,因此执行速度和效率都比直接使用Sql语句有很大优势。在 Ibatis中通过<procedure>标签元素 可以直接调用数据库的存储过程,其过程如下:

(1).定义存储过程所需输入/输出参数,如:
<parameterMap id=”存储过程参数” class=”map”> <parameter property=”email1” jdbcType=”varchar” javaType=”java.lang.String” mode=”INOUT”/> <parameter property=”email2” jdbcType=”varchar” javaType=”java.lang.String” mode=”INOUT”/> </parameterMap> 
(2).调用存储过程,如:
<procedure id=”Ibatis调用存储过程” parameterMap=” 存储过程参数”> {call 存储过程名(?,?)} </procedure> 

注意:Ibatis调用存储过程时,要确保始终只使用JDBC标准的存储过程语法。

 16、  Ibatis与Spring集成:

现在Java Web开发中,SSH(Spring,Sturts,Hibernate)三个开源框架组合非常流行,对于一些对Hibernate不熟悉或者怀疑 Hibernate性能的人,也可以使用Ibatis代替Hibernate框架,即SSI(Spring,Struts,Ibatis)。Spring 和Struts的集成这里不多说了,具体说一下Spring和Ibatis的集成。

(1).对Ibatis工程引入Spring支持,即将Spring相关的jar包加入到类路径中,在/src目录下创建spring配置文件,在web.xml文件中指定spring配置文件并添加spring的WebContext启动监听器。

(2).将对数据库的连接信息放交由spring管理,在spring配置文件中添加数据库连接信息:

<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”> <property name=”driverClassName” value=”数据库驱动类”/> <property name=”url” value=”数据库连接URL”/> <property name=”username” value=”数据库连接用户名”/> <property name=”password” value=”数据库连接密码”/> </bean> 
(3).在spring配置文件中添加对Ibatis的支持:
<bean id=”sqlMapClient” class=”org.springframework.orm.ibatis.SqlMapClientFactoryBean”> <property name=”configLocation” value=”Ibatis总配置文件路径”/> <!--为Spring创建的SqlMapClient对象指定数据源--> <property name=”dataSource” ref=”dataSource”/> </bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="configLocation"> <value>/WEB-INF/sql-map-config.xml</value> </property> </bean>

(4).在Ibatis总配置文件中移除关于数据库连接的信息,只需在Ibatis总配置文件中配置实体映射文件即可。

至此,Spring和Ibatis就无缝集成起来,在使用时Spring会读取创建SqlMapClient对象,并为其注入数据源,直接通过spring获得SqlMapClient对象就可以直接使用。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值