iBatis简单介绍

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

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

2.       Ibatis开发的准备工作:

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

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

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

b.Ibatis的实体映射文件。

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

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

  
<! 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>

4.  Ibatis实体映射文件user.xml的写法示例:

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

  
<! 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=”实体类全路径”/>    <resultMap id=”结果集id” class=”实体类别名”>   <result property=”java实体类中的属性名” column=”数据库表中的列名”/>   ……  resultMap>  …… sqlMap>

5.       读取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){  异常处理…….   } }

6.       Ibatis的SQL Map:

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

(2). 元素是个通用的声明,可以用于任何类型的SQL语句,但是通常使用具体的类型, 如:查询使用的子元素来支持自动生成主键 。对于不同的数据库主键自动生成机制是不同的,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属性是主键赋值的对象。

10.   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。

11.   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>

12.   Ibatis的SQL Map通过标签元素调用存储过程:

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

(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标准的存储过程语法。

13.   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总配置文件路径”/>  <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.xmlvalue> property> bean>

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

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

14.   Ibatis优缺点总结:

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

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

转载于:https://www.cnblogs.com/tyhJava/p/5842594.html

你可能感兴趣的:(iBatis简单介绍)