ibatis就是现在的mybatis。是一个持久层的框架。 和hibernate的不同就是 ibatis跟灵活。
先看一个简单的例子
核心的
SqlMapConfig.xml 实际上名字可以自己起
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="db.properties"/>
<settings cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<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" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from sample" />
<property name="Pool.PingEnabled" value="false" />
<property name="Pool.PingConnectionsOlderThan" value="1" />
<property name="Pool.PingConnectionsNotUsedFor" value="1" />
</dataSource>
</transactionManager>
<!--每个具体的关系对象映射-->
<sqlMap resource="xzj/test/map/User.xml" />
</sqlMapConfig>
然后我们好好看看这个配置文件。看看他的dtd定义可以帮助理解一下。注释中详细的解释了一些属性和标签。 没写的我也不清楚。。。以后看到补上。
这个就是最核心的配置了。我们将根据这个文件创建SqlMapClient对象。
<!-- 根节点 配置数据源的信息,数据映射和其他可选项。例如:线程管理。。-->
<!--
properties : 这个是配置外部应用配置文件的。属性有2个:resource 本地文件 url 外部
settings :全局的配置:
classInfoCacheEnabled (true | false) #IMPLIED
lazyLoadingEnabled (true | false) #IMPLIED 延迟加载 默认是true 不是必须的
statementCachingEnabled (true | false) #IMPLIED 引用sql时 是否使用限定名字。 默认是false
cacheModelsEnabled (true | false) #IMPLIED 高速缓存 默认是true 不是必须的
enhancementEnabled (true | false) #IMPLIED 是否使用 cblib中的优化类来提高延迟加载的性能 默认是true
errorTracingEnabled (true | false) #IMPLIED
useStatementNamespaces (true | false) #IMPLIED
useColumnLabel (true | false) #IMPLIED
forceMultipleResultSetSupport (true | false) #IMPLIED
maxSessions CDATA #IMPLIED 已废弃
maxTransactions CDATA #IMPLIED 已废弃
maxRequests CDATA #IMPLIED 已废弃
defaultStatementTimeout CDATA #IMPLIED
resultObjectFactory:
typeAlias:别名
alias CDATA #REQUIRED 别名
type CDATA #REQUIRED 原名
typeHandler:类型处理器 一般情况下不要处理。
<!ELEMENT typeHandler EMPTY>
<!ATTLIST typeHandler
javaType CDATA #REQUIRED
jdbcType CDATA #IMPLIED
callback CDATA #REQUIRED
>
transactionManager:事务管理
<!ELEMENT transactionManager (property*,dataSource)>
property:定义各种属性。。。。
dataSource:必须项 定义dataSourceFactory。 就是用哪个工厂来创建 dataSource 主要有以下3种
SIMPLE:简单的数据源工厂。jdbc不需要你额外的操作了。 ibaties包里都包含了所有的东西。
DBCP:DBCP数据源工厂。用于使用jakata Commons数据库连接池实现。
JNDI:jndi数据源工厂。允许使用 iBaties 共享通过JNDI定位的基于容器的数据源
<!ATTLIST transactionManager
type CDATA #REQUIRED 类型 主要有 JDBC 提供简单的基于jdbc的事务管理(一般就用这个) JTA 在应用程序中基于容器的事务管理 EXTERNAL 用于提供非事务管理,并假定管理事物的是应用程序。而非ibaties
commitRequired (true | false) #IMPLIED 用于要求释放某个链接前 必须提交或者回滚。 默认为false
>
sqlMap :映射。。
resource CDATA #IMPLIED 就是映射的xml的路径
url CDATA #IMPLIED
-->
<!ELEMENT sqlMapConfig (properties?, settings?, resultObjectFactory?, typeAlias*, typeHandler*, transactionManager?, sqlMap*)+>
<!ATTLIST sqlMapConfig
xmlns:fo CDATA #IMPLIED
>
注意看SqlMapConfig.xml 的最后sqlMap标签,他负责载入每个 映射文件。个人感觉和hibernate最大的不同之一在于这里映射。hibernate是一个表对应一个映射文件。而ibats是一个返回集对应一个。
下面贴上User.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="xzj.test.bean.User" />
<select id="getUser" parameterClass="java.lang.String"
resultClass="user">
<![CDATA[ select name, sex from t_user where name = #name# ]]>
</select>
<select id="getAllUser" resultClass="user">
<![CDATA[ select name, sex from t_user ]]>
</select>
<update id="updateUser" parameterClass="user">
<![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id = #id# ]]>
</update>
<insert id="insertUser" parameterClass="user">
INSERT INTO t_user ( name, sex) VALUES ( #name#, #sex# )</insert>
<delete id="deleteUser" parameterClass="java.lang.String">
delete from t_user where id=#value#
</delete>
</sqlMap>
这是一个简单的例子。这里不详细讨论User.xml。后面单独讨论。 因为这个是最重要的部分了。
下面贴上对象类
User.java
public class User implements Serializable {
private Integer id;
private String name;
private Integer sex;
public User() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSex() {
return this.sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
}
测试类
Test1.java
public class Test1 {
public static void update() {
//首先初始化iBatis获得一个SqlMapClient对象。路径就是你自己写的核心配置文件。 我这里特意写成SqlMapConfig1.xml是为了说明可以自定义命名。
String resource = "xzj/test/map/SqlMapConfig1.xml";
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap系统初始化完毕,开始执行update操作
try {
sqlMap.startTransaction();
User user = new User();
user.setId(new Integer(1));
user.setName("dsb");
user.setSex(new Integer(1));
sqlMap.update("updateUser", user);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static List getUser() {
// 首先初始化iBatis获得一个SqlMapClient对象
String resource = "xzj/test/map/SqlMapConfig1.xml";
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
List user=null;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap系统初始化完毕,开始执行getAllUser操作
try {
sqlMap.startTransaction();
user=sqlMap.queryForList("getAllUser", null,1,2);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
public static void main(String[] args) {
update();
List user=getUser();
for(int i=0;i<user.size();i++)
{
System.out.println(((User)user.get(i)).getName());
}
}
}
这个测试类直接拷的别人的。反正很简单的例子。 数据库的配置都是写在db.properties里面的。