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