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对象。
注意看SqlMapConfig.xml 的最后sqlMap标签,他负责载入每个 映射文件。个人感觉和hibernate最大的不同之一在于这里映射。hibernate是一个表对应一个映射文件。而ibats是一个返回集对应一个。<!-- 根节点 配置数据源的信息,数据映射和其他可选项。例如:线程管理。。--> <!-- 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 >
下面贴上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
这个测试类直接拷的别人的。反正很简单的例子。 数据库的配置都是写在db.properties里面的。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()); } } }