ibatis入门示例

一.什么是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的个人总结,今天把他晒出来,希望和大家分享下。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个用iBator生成iBatis有关代码的例子。 特别说明: Eclipse应该是3.4.1以上版本, 并且安装了iBator插件。否则可用iBator的命令行版本或ant工具。 测试用数据是: CREATE TABLE PERSON( id INTEGER NOT NULL, firstName VARCHAR (40) NOT NULL, lastName VARCHAR (40) NOT NULL, PRIMARY KEY (ID) ); insert into PERSON values (1,'ng','Huang'); insert into PERSON values (2,'zh','Ni'); insert into PERSON values (3,'zy','Huang'); src下有三个目录: ibator/config:配置文件,其中: ibatorConfig.xml:iBaotr的配置文件,指示iBator如何生成代码,其中classPathEntry要指向一个 jdbc 驱动程序。 sqlMapConfig.properties:数据库配置,配置数据库密码等 AppSqlConfig.java:应用程序配置,如果目录结构相同,不必修改 SqlMapConfig.xml:SqlMap配置,在最后应该加上每个表的Map文件,特别注意useStatementNamespaces="true"不能为false org:生成的代码,分为三个目录,目录名在ibatorConfig.xml中指定 注意:其中生成的person_SqlMap.xml中的: <select id="ibatorgenerated_selectByPrimaryKey" resultMap="ibatorgenerated_BaseResultMap" > 经过修改了, 删除了parameterClass="org....的内容 test:一个测试主程序。运行它能得到数据库中的数据。 如何使用这个例子: 1、下载后解压缩 2、导入到Eclipse中 3、运行test/Test.java,看看结果 4、删除org及其下的三个目录及文件 5、在ibator/config/ibatorConfig.xml中的右键菜单,选择Generate iBATIS Artifacts 5、将自动生成org中的所有代码,研究一下这些代码 6、修改中的person_SqlMap.xml中的: <select id="ibatorgenerated_selectByPrimaryKey" resultMap="ibatorgenerated_BaseResultMap" > 7、再次执行test/Test.java,看看结果 8、研究ibator/config中的各个文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值