频道栏目
首页 > 资讯 > 其他综合 > 正文

ibatis入门示例

13-11-27        来源:[db:作者]  
收藏   我要投稿
一.什么是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;
 
}
 
}
 
 
相关TAG标签
上一篇:台积电:绝大多数7nm客户都会转向6nm_IT新闻_博客园
下一篇:最后一页
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站