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实体映射文件。其写法示例如下:
<? 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>
4. 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>
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). <statement>元素是个通用的声明,可以用于任何类型的SQL语句,但是通常使用具体的<statement>类型, 如:查询使用<select>,添加使用<insert>,更新使用<update>,删除使 用<delete>。
7. Ibatis的增删改查操作简单例子:
(1).实体类必须遵循JavaBean的规范,提供一个无参数的构造方法,字段必须提供get和set方法。
(2).在Ibatis对应的实体映射文件的<sqlMap>标签元素添加如下:
a.Ibatis添加:
<insert id=”Ibatis添加实体操作Id” parameterClass=”参数类型”>
insert into 实体对应数据库中的表名(实体字段对应的表的列名1, 实体字段对应的表的列名2,……) values(#实体类字段1#,#实体类字段2#......);
</insert>
注意:Ibatis增删改查语句的参数是通过 parameterClass或者parameterMap 传递的。 Ibatis只能传递 一个参数 ,如果又多个参数需要封装在一个对象中。
b. Ibatis删除:
<delete id=”Ibatis删除实体操作Id” parameterClass=”参数类型”>
delete from 实体对应数据库中的表名 where 列名=#列名对应的实体字段名#;
</delete>
注意:删除和查询时,经常需要根据一定条件操作,有时可能需要模糊查询,对于
c. Ibatis 模糊查询
如name like‘%c%’。在Ibatis中有两种写法:
写法1:在java方法中传递参数时写成:”%字段名%”。
写法2:在Ibatis的sql语句中可以写成如:where name=’%$字段名$%’。
d. Ibatis更新:
<update id=”Ibatis更新实体操作Id” parameterClass=”参数类型”>
update 实体对应数据库的表名 set 列名1=#字段1#,列名2=#字段2#,…….where ….;
</update>
e. Ibatis查询
<select id=”Ibatis查询实体操作Id” resultClass=”查询结果类型” >
select * from 实体对应的表名;
</select>
注意:这里演示的是最简单的查询,其结果是一个实体的集合。
8. 在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);
9. 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属性是主键赋值的对象。
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通过<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标准的存储过程语法。
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总配置文件路径”/>
<!--为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对象就可以直接使用。
14. Ibatis优缺点总结:
优势:使用标准的Sql语句,与JDBC相比简单方便,减少了代码量,架构和性能得到增强;与Hibernate等ORM工具相比因为更接近Sql语句,性能可控;sql语句与程序代码分隔,简化了项目分工,大大提高并行开发的可能性。
缺点:还需要写标准的sql语句,不像Hibernate完全屏蔽了底层数据库的差异,程序的 可移植性比Hibernate和JPA要差 ; 输入参数和输出参数都只能有一个 ,程序编写的灵活性不是太高。
iBatis简单介绍的更多相关文章
- iBatis 简单介绍及基础入门
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目.于2010年6月16号被谷歌托管,改名为MyBatis.是一个基 ...
- IBatis.net介绍
IBatis.net介绍 IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2. 官方网站: ...
- Hibernate学习(1)简单介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等 ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- angular1.x的简单介绍(二)
首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
随机推荐
- JS之函数表达式
度过一个愉快短暂的周末,又可以开始学习了!我爱学习,学习使人进步.今天学习函数表达式,着重学习下闭包函数. 函数表达式 可以在定义的函数声明之前调用它,但是不能在定义函数表达式之前调用它 /** * ...
- MySQL安装,启动
一.安装.配置环境变量 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 配置环境变量:把你的安装目录复制下,例如:G:\Do ...
- nginx.conf详解
##定义nginx运行的用户各用户组user nginx nginx; ##nginx进程数,建议设置与cpu核心数一致worker_processes 1; #为每个进程分配CPU的工作内核 wor ...
- 实用的PHP功能详解(一)_php glob()用法
一.使用glob()查找文件 大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来 ...
- eclipse中安装adt插件
对于程序开发的学者来说,eclipse并不陌生,它为我们提供了一个非常广阔的平台来开发程序.同样我们也可以用它来开发android程序.但是在eclipse中并不能直接开发android程序,需要我们 ...
- Daily Scrum 12.16
今日完成任务: 完善了资源界面的UI设计:解决了PDF显示相同的问题:解决了下载时有时找不到文件的问题,因为上届建了upload和resource两个文件夹存文件,写代码时候写乱套了. 明日任务: 黎 ...
- 用ajax动态获取数据显示在highcharts上
html代码(index.html) <html><head> <meta charset="UTF-8" /> <title>Hi ...
- Sql Server 常用操作2
FOR XML PATH应用 stuID学生编号,sName代表学生姓名,hobby列存学生的爱好! SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as ho ...
- js获取单选按钮的值
function a(){ var v=document.getElementsByName("radio"); ;i<v.length;i++){ if(v[i].chec ...
- html5 完整图片上传
<div class="photo" style="display:none;" id="upPhoto"><div cl ...