介绍
iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。
iBATIS不同于一般的OR映射框架。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的参数和结果集映射到类。
所以,iBATIS做的是SQL Mapping的工作。
它把SQL语句看成输入以及输出,结果集就是输出,而where后面的条件参数则是输入。iBATIS能将输入的普通POJO对象、Map、XML等映射到SQL的条件参数上,同时也可以将查询结果映射到普通POJO对象(集合)、Map、XML等上面。
iBATIS使用xml文件来映射这些输入以及输出。
简单示例
基于ibatis-2.3.0.677版本。
1、 创建新的项目,并引入jar包
a) ibatis-2.3.0.677.jar
b) mysql驱动
2、 在类路径中提供ibatis的配置文件:sqlMapConfig.xml
3、创建实体类:User.java
4、创建针对User对象的CRUD的xml映射配置:User.xml
5、创建测试程序测试:
SqlMapClient对象
这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作。这个类是我们使用iBATIS的最主要的类。它是线程安全的。通常,将它定义为单例。(与hibernate中sessionFactory的定义类似)。如:
How To
如何获得刚插入记录的自增长ID值?
parameterClass的使用
insertUser使用了parameterClass,所以必需传入User类型的对象
insertUser2没有使用parameterClass,所以可以传入任意具有相应属性值的对象
parameterMap的使用
parameterMap用于传入参数,以便匹配SQL语句中的?号
利用parameterMap,可以定义参数对象的属性如何映射到SQL查询语句的动态参数上,注意parameterMap中<parameter/>标签的先后顺序不能颠倒!
如何将查询结果映射到不同的对象?(resultClass的使用)
//查找t_user表,将其结果映射到一个属性名不同的对象中!
如何将查询结果集映射到不同的对象?(resultMap的基本使用)
如何将查询结果集映射为xml格式的数据?
如何用Map类型的对象作为传入参数?
如何将查询结果集的元素转换为Map类型的对象?
事务处理
可以使用sqlMapClient的startTransaction/commitTransaction/endTransaction等方法来控制事务的边界。
如果与spring整合(这是iBatis推荐的方式),则我们需要在spring配置文件中指定其事务特性。
与spring集成
Spring通过DAO模式,提供了对iBATIS的良好支持。SqlMapClient对象是iBATIS中的主要对象,我们可以通过配置让spring来管理SqlMapClient对象的创建。
与hibernate类似,Spring 提供了SqlMapClientDaoSupport对象,我们的DAO可以继承这个类,通过它所提供的SqlMapClientTemplate对象来操纵数据库。看起来这些概念都与hibernate类似。
通过SqlMapClientTemplate来操纵数据库的CRUD是没有问题的,这里面关键的问题是事务处理。Spring提供了强大的声明式事务处理的功能,我们已经清楚hibernate中如何配置声明式的事务,那么在iBATIS中如何获得声明式事务的能力呢?
第一,我们需要了解的是spring通过AOP来拦截方法的调用,从而在这些方法上面添加声明式事务处理的能力。典型配置如下:
这些事务都是声明在业务逻辑层的对象上的。
第二,我们需要一个事务管理器,对事务进行管理。
此后,我们需要让spring来管理SqlMapClient对象:
我们的DAO的编写:
继承SqlMapClientDaoSupport,要求我们注入SqlMapClient对象,因此,需要有如下的DAO配置:
这就是所有需要注意的问题了,此后就可以在业务逻辑层调用DAO对象了!