ibatis入门示例

标签: ibatis | 发表时间:2013-11-23 18:21 | 作者:u012875880
出处:http://blog.csdn.net

一.什么是ibatis:

 iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

二.ibatis和hibernate的对比:

相对hibernate“o/r”而言,ibatis是一种“sql mapping”的orm实现。 

hibernate对数据库结构提供了较为完整的封装,hibernate的o/r mapping实现了pojo 和数据库表之间的映射,以及sql 的自动生成和执行。程序员往往只需定义好了pojo 到数据库表的映射关系,即可通过hibernate 提供的方法完成持久层操作。程序员甚至不需要对sql 的熟练掌握, hibernate/ojb 会根据制定的存储逻辑,自动生成对应的sql 并调用jdbc 接口加以执行。 

而ibatis 的着力点,则在于pojo 与sql之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成sql 执行。具体的sql 需要程序员编写,然后通过映射配置文件,将sql所需的参数,以及返回的结果字段映射到指定pojo。 

使用ibatis 提供的orm机制,对业务逻辑实现人员而言,面对的是纯粹的java对象。

这一层与通过hibernate 实现orm 而言基本一致,而对于具体的数据操作,hibernate会自动生成sql 语句,而ibatis 则要求开发者编写具体的sql 语句。相对hibernate而言,ibatis 以sql开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。 ibatis入门示例

hibernate与ibatis的对比:

(1).ibatis非常简单易学,hibernate相对较复杂,门槛较高。 

(2).二者都是比较优秀的开源产品 

(3).当系统属于二次开发,无法对数据库结构做到控制和修改,那ibatis的灵活性将

比hibernate更适合 

(4).系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高    

度优化的sql语句(或存储过程)才能达到系统性能设计指标。在这种情况下ibatis

会有更好的可控性和表现。 

(5).ibatis需要手写sql语句,也可以生成一部分,hibernate则基本上可以自动生

成,偶尔会写一些hql。同样的需求,ibatis的工作量比hibernate要大很多。类似

的,如果涉及到数据库字段的修改,hibernate修改的地方很少,而ibatis要把那

些sql mapping的地方一一修改。 

(6).以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po

是截然不同的,本质区别在于这种po是扁平化的,不像hibernate映射的po是可

以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的

设计思路。 

(7).hibernate现在已经是主流o/r mapping框架,从文档的丰富性,产品的完善

性,版本的开发速度都要强于ibatis。

三. iBatis框架结构:

1.ibatis主要由以下几部分组成:

 (1).Java实体类:(1-n)个

与数据表对应,用于封装数据表的一行记录。

(2).总配置文件:SqlMapConfig.xml

SqlMapConfig.xml主配置文件主要用于获取数据源(database.properties),设置框架参

数等。具体设置如下:ibatis入门示例

 <? xml version="1.0" encoding="UTF-8" ?>  

2.  <! DOCTYPE sqlMapConfig   

3.  PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"   

4.  "http://www.ibatis.com/dtd/sql-map-config-2.dtd" >  

5.  < sqlMapConfig >  

6.     < settings    

7.      cacheModelsEnabled ="true"  <!--是否启用缓存机制-- >  

8.     lazyLoadingEnabled="true"  <!-- 是否启用延迟加载机制 -->  

9.     enhancementEnabled="true"  <!-- 是否启用字节码增强机制 -->  

10.    errorTracingEnabled="true"  <!-- 是否启用错误处理机制 -->  

11.    maxRequests="32"  <!-- 最大并发请求数 -->  

12.    maxSessions="10"  <!-- 最大Session数 -->  

13.    maxTransactions="5"  <!-- 最大并发事务数 -->  

14.    useStatementNamespaces="true"/>  <!-- 是否启用名称空间 -->  

     <!-- 定义了ibatis的事务管理器有3中(JDBC,JTA,EXTERNAL) -->  

15.    < transactionManager  type ="JDBC" >   

16.    <!-- type属性指定了数据源的链接类型,也有3种类型(SIMPLE,DBCP,JNDI) -->   

 < dataSource  type ="SIMPLE" >  

17.         < property  name ="JDBC.Driver"  value ="${driver}" />  

18.         < property  name ="JDBC.ConnectionURL"  value ="${url} " />  

19.         < property  name ="JDBC.Username"  value ="${username}" />  

20.         < property  name ="JDBC.Password"  value ="${password}" />  

   <!-- 连接池维持的最大容量 -->  

21.         < property  name ="Pool.MaximumActiveConnections"  value ="10"   /> 

<!-- 连接池允许挂起的最大连接 -->  

22.         < property  name ="Pool.MaximumIdleConnections"  value ="5" />   

       <!-- 连接被某个任务所允许占用的最大时间 -->  

23.         < property  name ="Pool.MaximumCheckoutTime"  value ="120000" />

24.         < property  name ="TimeToWait"  value ="500" />   <!-- 线程允许等待的最大时间 -->  

26.     </ dataSource >  

27.   </ transactionManager >  

28.   < sqlMap  resource ="org/zhuxun/ibatisTest/entity/student.xmll"/>  

29. </ sqlMapConfig >  

 

(3). 每个实体类的映射文件(Map 文件):

  映射文件里面定义了实体类和数据库之间的对应关系。Ibatis不像hibernate,映射文件里面要自己手写SQL语句,配置文件也要自己手动写transactionManager即事务管理器和资源文件,即把映射文件加进去。总之,ibatis是介于hibernate和jdbc间的半开放映射。ibatis入门示例

(4). Ibatis API:

   在使用时,需要使用ibatis提供的API,他们将SQL+JDBC操作细节封装起来了。

 2.ibatis主要API:

SqlMapClient

SqlMapClient对象可以进行CRUD操作

三. 搭建iBatis 开发环境:

1.导入相关的jar包,ibatis-2.3.0.677.jar

 如果没有可以去: http://download.csdn.net/detail/u012875880/6596015下载

2.编写配置文件:

  (1).JDBC连接的属性文件:database.properties

      driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/test1

username=root

    password=1234

 (2).编写总配置文件:(SqlMapConfig.xml)

<sqlMapConfig>

<!-- 引用JDBC属性的配置文件 -->

<properties resource="database.properties" />

<!-- 使用JDBC的事务管理 -->

<transactionManager type="JDBC">

<!-- 数据源 -->

<dataSource type="SIMPLE">

<property name="JDBC.Driver" value="${driver}" />

<property name="JDBC.ConnectionURL" value="${url}" />

<property name="JDBC.Username" value="${username}" />

<property name="JDBC.Password" value="${password}" />

</dataSource>

</transactionManager>

<!-- 这里可以写多个实体的映射文件 -->

<sqlMap resource="org/zhuxun/ibatisTest/entity/student.xml" />

</sqlMapConfig>

  (3).编写实体类映射文件:(student.xml)

    <sqlMap>

<!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->

<typeAlias alias="Student" type="org.zhuxun.ibatisTest.entity.Student" />

<!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->

<select id="findAll" resultClass="Student"><!--resultClass表示要返回的数据类型,如

                                                    果为集合,则表示集合中的元素类型 -->

select * from student

</select>

<!-- parameterClass表示参数的内容 -->

<!-- #表示这是一个外部调用的需要传进的参数,可以理解为占位符 -->

<select id="findById" parameterClass="int" resultClass="Student">

select * from student where id=#id#

</select>ibatis入门示例

<!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->

<select id="findByName" parameterClass="String" resultClass="Student">

select * from student where name like '%$name$%'

</select>

<insert id="addStudent" parameterClass="Student">

insert into

     student(name,age,sex) values

(#name#,#age#,#sex#);

<selectKey resultClass="int" keyProperty="id">

  select @@identity as inserted

<!-- 这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->

<!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->

<!-- mssql:select @@IDENTITY as value -->

<!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->

<!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些

          是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。

      有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以

           如果是Oracle数据库,则需要将selectKey写在insert之前 -->

</selectKey>

</insert>

<delete id="deleteById" parameterClass="int">

<!-- #id#里的id可以随意取,但是上面的insert和下面的update则会有影响,因为上面

           的insert和update中的#XXX#会按”XXX”从Student里对应的getter方法中去查找 -->

<!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性

           去赋值 -->

delete from student where id=#id#

</delete>

<update id="update" parameterClass="Student">

update student set

name=#name#,age=#age#,sex=#sex# where id=#id#

</update>

 </sqlMap>

(4).编写DAO实现类:

public class StudentDAOIbatisImpl implements StudentDAO {

private static SqlMapClient sqlMapClient = null;

// 读取配置文件

static {

try {

Reader reader = Resources

.getResourceAsReader("SqlMapConfig.xml");

sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);

reader.close();

} catch (IOException e) {

e.printStackTrace();

}ibatis入门示例

}

//查詢所有的student

public List<Student> findAll() throws Exception {

List<Student> students = null;

try {

students = sqlMapClient.queryForList("findAll");

} catch (SQLException e) {

e.printStackTrace();

}

return students;

}

//按照Id查找

public Student findById(int id) throws Exception {

Student student = null;

try{

student = (Student) sqlMapClient.queryForObject("findById",id);

}catch (SQLException e) {

e.printStackTrace();

}

return student;

}

//添加

public void add(Student student) throws Exception { 

sqlMapClient.insert("addStudent",student);

}

//按照Id進行刪除

public void deleteById(int id) throws Exception {

sqlMapClient.delete("deleteById",id);

}

//更新

public void update(Student student) throws Exception {

sqlMapClient.update("update",student);

}

//按照姓名進行查詢(模糊查詢)

public List<Student> findByName(String name) throws Exception {

List<Student> students = sqlMapClient.queryForList("findByName",name);

return students;

}

}

 

 以上示例是我在初学ibatis的个人总结,今天把他晒出来,希望和大家分享下。

 

作者:u012875880 发表于2013-11-23 10:21:17 原文链接
阅读:85 评论:0 查看评论

相关 [ibatis] 推荐:

ibatis和mybatis区别

- - SQL - 编程语言 - ITeye博客
简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区别,以及从 iBatis 向 MyBatis 移植时需要注意的地方. 通过对本文的学习,读者基本能够了解 MyBatis 有哪些方面的改进,并能够顺利使用 MyBatis 进行开发. 本文更适合有 iBatis 基础的开发人员阅读.

ibatis入门示例

- - CSDN博客架构设计推荐文章
一.什么是ibatis:.  iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快. 如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了. 二.ibatis和hibernate的对比:.

iBatis与MyBatis区别

- - 非技术 - ITeye博客
iBatis 框架的主要优势:. 1、iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL 本身,而不需要花费精力去处理例如注册驱动,创建 Connection,以及确保关闭 Connection 这样繁杂的代码. 2、从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 JDK 的泛型和注解特性进行了简化.

一个Date类型的ibatis查询走不上索引的问题

- - 数据库 - ITeye博客
        实际工作中,发现Date类型作为条件查询走不上索引的问题,由于问题完全和 http://blog.csdn.net/zldeng19840111/article/details/6721589一样,为简便起见,直接采用它的实例说明.         以下为简化后的场景:通过时间范围作一个邮件发送数量的统计.