相对于Hibernate提供了全面的数据库封装机制的“全自动化”ORM实现而言,iBATIS则是一种“半自动”的ORM实现。
所谓“全自动化”ORM实现是指实现了POJO(Plain Old Java Object 简单的Java对象)和数据库表之间的映射,以及SQL的自动生成和执行。而IBatis则不会为程序员在运行期间自动生成SQL语句,需要程序员自己编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定的POJO中。
iBatis 与 Hibernate 的区别:
Hibernate功能强大,数据库无关性好,O/R映射能力强,如果对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么整个持久层代码会相当简单,需要写的代码很少,开发速度快。Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。程序员只需要定义好POJO到数据表的映射关系,即可通过Hibernate提供的方法完成持久层的操作。程序员甚至不需要对SQL相当熟练的掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
iBatis入门简单,即学即用,提供了数据库查询的自动绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。当系统数据处理量巨大、性能要求极为苛刻时,这往往意味着我们必须经过高度优化的SQL语句(或存储过程)才能达到性能设计的指标。在这种情况下iBatis会有更好的可控性和表现。
总之:Hibernate比iBatis复杂,学习成本高,iBatis简单容易上手,是基于原生SQL的框架。可以说Hibernate功能强大而复杂,iBatis简单而小巧。
iBATIS的下载与配置:
iBATIS的官方下载地址:http://labs.renren.com/apache-mirror/ibatis/binaries/ibatis.java/
MYBATIS的官方下载地址:http://code.google.com/p/mybatis/downloads/list
注:iBATIS 是 3.0以前的版本的名字,3.0(包括3.0)以后的版本叫MyBatis。MyBatis 和 iBatis有很多的区别,包括包的结构和类名。而我们今天所说的iBatis是指3.0以前的版本。
注:所有的持久类属性的类型都不要声明为基本类型(int、long、float、double),应该声明为对应的封装类型(Integer、Long、Float、Double),因为IBatis是面向对象的解决方案。因此所有的属性、参数和结果必须是对象。
ibatis运行过程:
ibatis框架整体运行模式和Hibernate很像,对于每一个需要操作的实体类我们都必须创建一个类似的映射文件一般名为xxx_SqlMap.xml,在我们配置好所有的实体类的映射文件后还需要配置二个文件,一个是装有数据库连接参数的属性文件SqlMapConfig.properties;另一个是sqlMapConfig.xml文件,数据库的配置文件后面会截图给大家,主要是sqlMapConfig.xml这个文件,这个文件是我们使用ibatis操作数据库前必须要加载的,我找了一些资料上说可以使用单例模式将sqlMapClient参数作为static final类型,但是我赋值有错误,所以自己写了一个静态方法获取sqlMapClient实例。
配置文件样例(sqlMapConfig.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="SqlMapConfig.properties"/>
<settings
enhancementEnabled="true"
useStatementNamespaces="true"
cacheModelsEnabled="true"
lazyLoadingEnabled="true"
/>
<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}"/>
<property name="Pool.MaximumActiveConnections" value="10" /> <!-- 数据库连接池可维持的最大容量 -->
<property name="Pool.MaximumIdleConnections" value="5" /> <!-- 数据库连接池可挂起的连接数 -->
<property name="Pool.MaximumCheckoutTime" value="120000" /> <!-- 连接某个任务占用的最大时间(ms) -->
<property name="Pool.TimeToWait" value="500" /> <!-- 线程等待连接的最大时间(ms) -->
<property name="Pool.PingQuery" value="select 1 from users" /> <!-- 数据库连接状态检测语句 -->
<property name="Pool.PingEnabled" value="false" /> <!-- 是否允许检测连接状态 -->
<property name="Pool.PingConnectionsOlderThan" value="1" /> <!-- 对连接时间超过设定值将进行连接检测 -->
<property name="Pool.PingConnectionsNotUsedFor" value="1" /> <!-- 对空闲超过设定值的连接进行检测 -->
</dataSource>
</transactionManager>
<sqlMap resource="com/ego/vo/users_SqlMap.xml" />
</sqlMapConfig>
数据库属性文件配置:
#MySql数据库连接参数配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/testibatis
username=root
password=111111
users_SqlMap.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="users">
<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<property name="size" value="1000"/>
</cacheModel>
<typeAlias alias="User" type="com.ego.vo.User"/> <!-- 使用别名 -->
<resultMap id="userResult" class="User">
<result property="userId" column="ID" jdbcType="VARCHAR"/>
<result property="username" column="USERNAME" jdbcType="VARCHAR"/>
<result property="password" column="PASSWORD" jdbcType="VARCHAR"/>
<result property="age" column="AGE" jdbcType="VARCHAR"/>
</resultMap>
<select id="getUser" cacheModel="userCache" resultMap="userResult" parameterClass="User">
SELECT * FROM T_USER WHERE ID=#userId:NUMERIC#
</select>
<select id="getUserList" cacheModel="userCache" resultMap="userResult" parameterClass="User">
SELECT * FROM T_USER
</select>
<insert id="insertUser" parameterClass="User">
insert into T_USER(ID,USERNAME,PASSWORD,AGE)
values(#userId:NUMERIC#,#username:VARCHAR#,#password:VARCHAR#,#age:NUMERIC#);
</insert>
<update id="updateUser" parameterClass="User">
update T_USER set USERNAME=#username:VARCHAR#,PASSWORD=#password:VARCHAR#,AGE=#age:NUMERIC#
where ID=#userId:NUMERIC#;
</update>
<delete id="deleteUser" parameterClass="User">
delete from T_USER where ID="userId:NUMERIC";
</delete>
</sqlMap>
测试类:
package com.ego.dao;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.ego.vo.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class UserDao {
/**
* 获取SqlMapClient实例
* @return
*/
public static SqlMapClient getSqlMapClient(){
SqlMapClient sqlMapClient=null;
String resource = "sqlMapConfig.xml";
//加载配置文件和映射文件
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
e.printStackTrace();
}
return sqlMapClient;
}
/**
* 插入对象
* @param sqlMapClient
* @throws Exception
*/
public void insertUser(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
User user = new User();
user.setUserId("1007");
user.setAge("25");
user.setUsername("GYL");
user.setPassword("1234");
sqlMapClient.insert("users.insertUser", user);
sqlMapClient.commitTransaction();
}
/**
* 查询单个对象
* @param sqlMapClient
* @return
* @throws Exception
*/
public User queryForObject(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
User user=new User();
try {
user.setUserId("1007");
//String userId =new String("1007");
user = (User)sqlMapClient.queryForObject("users.getUser",user);
System.out.println("userDao:"+user.toString());
} catch (SQLException e) {
e.printStackTrace();
}
sqlMapClient.commitTransaction();
return user;
}
/**
* 查询集合
* @param sqlMapClient
* @return
* @throws Exception
*/
public List<User> queryForList(SqlMapClient sqlMapClient) throws Exception{
sqlMapClient.startTransaction();
List<User> users = new ArrayList<User>();
users = (List<User>)sqlMapClient.queryForList("users.getUserList",null,0,3);
sqlMapClient.commitTransaction();
return users;
}
/**
* 分页查询
* @param sqlMapClient
* @return
*/
public PaginatedList queryForPaginatedList(SqlMapClient sqlMapClient){
PaginatedList usersByPage=null;
try {
usersByPage = sqlMapClient.queryForPaginatedList("users.getUserList", null,3);
} catch (SQLException e) {
e.printStackTrace();
}
return usersByPage;
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
UserDao userDao = new UserDao();
SqlMapClient sqlMapClient = UserDao.getSqlMapClient();
// try {
// userDao.insertUser(sqlMapClient);
// System.out.println("成功!!!");
// } catch (Exception e) {
// System.out.println(" 失败!!!");
// e.printStackTrace();
// }
// try {
// User user = userDao.queryForObject(sqlMapClient);
// System.out.println("User:"+user.toString());
// } catch (Exception e) {
// e.printStackTrace();
// }
//List<User> users = new ArrayList<User>();
// try {
// users = userDao.queryForList(sqlMapClient);
// } catch (Exception e) {
// e.printStackTrace();
// }
// System.out.println("Size:"+users.size());
//
// for(User user:users){
// System.out.println("user:"+user.toString());
// }
PaginatedList users=null;
users = userDao.queryForPaginatedList(sqlMapClient);
System.out.println("Size:"+users.size());
users.nextPage();
int n = users.getPageIndex();
System.out.println("n"+n);
for(int i=0;i<users.size();i++){
User user = (User)users.get(i);
System.out.println("user:"+user.toString());
}
}
}
实体类User:
package com.ego.vo;
public class User {
private String userId;//用户ID
private String username;//用户名
private String password;//密码
private String age;//
public User(){
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getUserId() {
return userId;
}
public String getUsername() {
return username;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Override
public String toString() {
return "User [age=" + age + ", password=" + password + ", userId="
+ userId + ", username=" + username + "]";
}
}
数据库字段:
见附图 其中ID和AGE是int类型。
本篇有部分参考其他资料,如有侵权行为,请联系我,我会及时删除,谢谢。
相关推荐
在"iBATIS框架源码剖析pdf第二部分"中,我们将深入探讨iBATIS的核心组件、工作原理以及其实现细节。 首先,我们来了解一下iBATIS的基本架构。iBATIS由四大核心部分组成:SqlMapConfig.xml配置文件、SqlMap接口、SQL...
《ibatis框架源码剖析》是一本深入探讨mybatis前身——ibatis的源码解析书籍。通过对源码的深入分析,我们可以理解ibatis的核心机制,掌握数据库操作的底层原理,从而更好地利用和优化这个强大的持久层框架。在这个...
在IT行业中,Spring MVC和iBatis是两个非常流行的开源框架,它们被广泛应用于构建Java Web应用程序。Spring MVC作为Spring框架的一部分,负责处理HTTP请求和响应,而iBatis则是一个轻量级的持久层框架,它简化了...
Ibatis,作为一个轻量级的持久层框架,以其灵活、简单的特点在Java开发领域中广受欢迎。本文将深入解析Ibatis的基本概念、核心功能以及使用方法,帮助开发者更好地理解和应用这一框架。 一、Ibatis概述 Ibatis是由...
在这个自己编写的Ibatis框架实现中,我们可以看到类似的思路和核心功能。 1. **XML配置文件**: XML文件是Ibatis框架的核心,它存储了SQL语句、参数映射以及结果集映射等信息。在`sqlmap`目录下,可能包含了多个...
本文将深入讲解如何搭建Ibatis框架,并介绍所需的jar包,以及一个简单的实例来帮助理解其工作原理。 首先,我们需要准备Ibatis的jar包。在Java项目中,引入Ibatis框架的关键库包括`ibatis-3.x.x.jar`(主要的Ibatis...
"struts1+ibatis框架整合"意味着将这两个框架结合使用,以实现更高效、更灵活的Web应用开发。整合过程中,通常会将iBatis作为Struts1的DAO层,通过Action调用iBatis的SqlSession执行SQL,获取或更新数据库数据。...
iBATIS是一个开源的Java框架,它为数据库访问提供了一个简单而强大的解决方案。这个框架的主要目的是将SQL映射到Java代码中,使得开发者能够避免直接处理JDBC的繁琐过程,从而更加专注于业务逻辑的实现。iBATIS的...
本书籍“iBATIS 框架源码剖析”提供了对iBATIS框架深入理解的机会,通过源代码分析,帮助读者掌握其内部工作原理。源代码带有详尽的注释,使得学习过程更为直观和高效。 iBATIS的核心概念主要有以下几个方面: 1. ...
《深入解析:基于Ibatis框架的示例项目》 Ibatis,作为一个轻量级的Java持久层框架,因其简单易用、灵活性高而备受开发者喜爱。在这个示例项目中,我们将探讨Ibatis的核心概念,包括SQL映射文件、动态SQL、事务管理...
《iBATIS框架源码剖析》这本书,作者任钢深入探讨了iBATIS的核心机制和实现原理,以下是对该框架的一些关键知识点的详细阐述。 1. **动态SQL**:iBATIS的一大亮点是它的动态SQL功能。通过在XML映射文件中使用条件...
本篇文章将深入探讨Ibatis框架的核心概念、配置以及实际应用。 一、Ibatis简介 Ibatis是由Apache基金会维护的一个开源项目,它的设计目标是简化Java与数据库之间的交互,通过XML或注解的方式将SQL语句与Java代码...
Ibatis是一个优秀的持久层框架,Spring是一个全面的后端应用框架,而Struts1则是一个经典的MVC(Model-View-Controller)架构框架。这三者结合可以构建出稳定且功能丰富的Web应用程序。 首先,让我们深入了解一下这...
Hibernate则可以用于更简单的对象关系映射场景,或者与iBATIS配合,共同处理复杂的业务需求。 例如,当需要处理大量定制化的SQL查询时,iBATIS可以弥补Hibernate的不足。同时,通过Struts的Action与iBATIS的...
在本文档中,我们将详细介绍如何通过简单的配置来使用ibatis(现在通常被称为MyBatis),并提供一个具体的示例来帮助理解整个配置过程及其应用场景。 #### 二、ibatis简介 ibatis(现称为MyBatis)是一个优秀的...
《Ibatis应用实例》 iBatis是一个轻量级的持久层框架,它作为O/R Mapping解决方案,与Hibernate等其他框架相比,其最大的优势在于简洁易用。对于不需要复杂功能的项目,iBatis是理想的选择,它允许开发者自由地编写...
Struts、Spring 和 iBatis 是三个非常著名的 Java 开发框架,它们经常被结合使用来构建企业级的 web 应用程序。这个压缩包文件包含了 "query" 和 "login" 两个子目录,可能分别对应着查询功能和登录模块的实现。 **...
"S2SI框架",全称为"Structs2+Spring+Ibatis集成框架",是一种基于Java的Web开发框架,旨在简化企业级应用的开发过程。该框架结合了三个流行的开源组件——Structs2、Spring和Ibatis,以提供一个高效、灵活且易于...