ibatis持久化框架使用2007-08-25 10:26最近很火,所以我也下了一个用了一下。看看它与hibernate的异同。
在执行大量数据库操作时,我们的SQL语句必然要得到优化后才能使用。
而Hibernate给我们的条件实在是太局限,在做大型数据操作时候,难免会觉得不是那么快。
ibatis给我的感觉就是短而精悍,可以让我们自定义过程,相当一个半自动的框架。给于程序
员的控制性比较大,使用起来也是比较方便。
-------------------------------------------------------------------------------------
ibatis最主要需要3个jar包:
ibatis-sqlmap-2.jar 主要包
ibatis-common-2.jar 提供的命令
ibatis-dao-2.jar 简单DAO
我的工程结构是这样:
首先要编写一个读取配置文件的类:
我编写了一个IbatisFactory的工厂类,用于读取sqlmap-config.xml里面的配置
--------------------------------
package org.ibatis.model.config;
import java.io.IOException;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class IbatisFactory {
/*使用单例模式,让整个程序中只有一个实例*/
private final static SqlMapClient sqlMapper;
/*其中最主要就是获得SqlMapClient这个类,他相当hibernate中的session用来完成数据库操作*/
public static SqlMapClient newInstence(){
return sqlMapper;
}
/*使用静态块来加载读取配置文件的过程*/
static {
try {
java.io.Reader reader = Resources.getResourceAsReader("org/ibatis/model/config/sqlmap-config.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// Fail fast.
System.out.println("读出XML文件时异常");
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
}
-------------------------------------
sqlmap-config.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">
<!--
cacheModelsEnabled - 高速缓冲存储器
enhancementEnabled - 字节码增强
lazyLoadingEnabled - 延迟加载
maxRequests - 最大请求
maxSessions - 最大会话
maxTransactions - 最大事务数
useStatementNamespaces - 使用statement命名空间
-->
<sqlMapConfig>
<settings cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" maxRequests="32" maxSessions="10"
maxTransactions="5" useStatementNamespaces="false" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://127.0.0.1:3306/ibatis?characterEncoding=utf-8" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="" />
<property name="JDBC.DefaultAutoCommit" value="false" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from ibatis" />
<property name="Pool.PingEnabled" value="false" />
<property name="Pool.PingConnectionsOlderThan" value="1" />
<property name="Pool.PingConnectionsNotUsedFor" value="1" />
</dataSource>
</transactionManager>
<!-- 指定POJO的配置文件的存放的地址 -->
<sqlMap resource="org/ibatis/model/entity/User.xml" />
</sqlMapConfig>
----------------------------------------
然后,我们通过数据库的表设计一个POJO:User.java
package org.ibatis.model.entity;
/**
* iBatis - User.java ----------------------------------------------
*
* @version 0.1 2007-8-24
* @author banseon ---------------------------------------------- 说明:
* 实体Bean 数据库映射表为T_USER
*/
public class User implements Entity {
private long id;
private String username;
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
String str = "Username:" + username + "\n";
str += "Address:" + address;
return str;
}
}
--------------------------------------
上面只是一个普通的POJO,最主要还是下面的配置文件User.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="User">
<!-- 为了简化这里将类在配置文件中指定一个别名,方便调用 -->
<typeAlias alias="User" type="org.ibatis.model.entity.User"/>
<resultMap id="UserResult" class="User">
<result property="username" column="USERNAME"/>
<result property="address" column="ADDRESS"/>
</resultMap>
<select id="getUserbyUsername" resultMap="UserResult">
select * from T_USER WHERE USERNAME = #username#
</select>
<!--
这里提供了增删改查4种配置,里面都有id,这里的id主要起到一个唯一性。
给DAO中的方法调用,你可以编写多个insert配置,但id都要不同。
parameterClass 指的是调用的参数类 后面的名称是这个类的别名
每个操作的中间都带有SQL语句,其中代"#"的表示是参数。系统自动填充。
-->
<!-- Insert example, using the User parameter class -->
<insert id="insert" parameterClass="User">
insert into T_USER (ID,USERNAME,ADDRESS)
values (#id#,#username#,#address#)
</insert>
<!-- Update example, using the User parameter class -->
<update id="update" parameterClass="User">
update T_USER set
USERNAME = #username#,
ADDRESS = #address#
where
ID = #id#
</update>
<!-- Delete example, using an integer as the parameter class -->
<delete id="delete" parameterClass="int">
delete from T_USER where ID = #id#
</delete>
</sqlMap>
-------------------------------------
最后我们来编写一个DAO来测试一下:
-------------------------------------
package org.ibatis.model.dao;
import java.sql.SQLException;
import org.ibatis.model.config.IbatisFactory;
import org.ibatis.model.entity.User;
import com.ibatis.sqlmap.client.SqlMapClient;
public class UserDAO {
//通过工厂得到sqlMapClient实例
protected SqlMapClient sqlMapClient = IbatisFactory.newInstence();
/**
* 插入方法
*/
public void insert(User entity) {
try {
sqlMapClient.startTransaction();//开始事务
sqlMapClient.insert("insert", entity);//这里很总要,第一个参数是指定调用的哪个插入方法
sqlMapClient.commitTransaction();//提交事务
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
sqlMapClient.endTransaction();//关闭事务
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}//插入方法结束
}
public static void main(String[] args) {
UserDAO _dao = new UserDAO();
org.ibatis.model.entity.User user = new org.ibatis.model.entity.User();
user.setId(0);
user.setAddress("123123123123");
user.setUsername("banseon123");
_dao.insert(user);
}
--------------------------------------
最后直接插入到数据库当中。