Posted on 2007-04-11 16:08
冰浪 閱讀(1517)
評論(2) 編輯 收藏 所屬分類:
Frameworks
iBatis是又一個O/R Mapping解決方案,j2ee的O/R方案真是多,和Hibernate相比,iBatis最大的特點就是小巧,上手很快。如果你不需要太多復(fù)雜的功能,iBatis是能滿足你的要求又足夠靈活的最簡單的解決方案。
第一步:
package com.ibatis;
public class Author {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二步:author.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"<sqlMap namespace="Author">
<!--模塊配置-->
<!--設(shè)置本映射文件中的別名-->
<typeAlias alias="author" type="com.ibatis.Author" />
<!--
<cacheModel type="LRU" id="authorCache">
設(shè)置緩存有效期,如果超出這個時間,則會清空緩存
<flushInterval hours="24"></flushInterval>
指定執(zhí)行特定的statement時,清空緩存
<flushOnExecute statement="updateAuthor"/>
SIZE:本cacheModel最大容納數(shù)據(jù)對象的數(shù)量
<property value="1000" name="size"/>
</cacheModel>
需要使用模塊配置,如:<select id="getAllAuthor" resultClass="author" cacheModel="authorCache">
把記錄使用cacheModel“authorCache”進行緩存,以后程序再使用statement進行數(shù)據(jù)查詢,就直接
去緩存中取數(shù)據(jù),而不是去數(shù)據(jù)庫中取數(shù)據(jù)
-->
<!--Statement配置-->
<!--修改-->
<update id="updateAuthor" parameterClass="author">
<![CDATA[UPDATE author SET name=#name# WHERE id=#id#]]>
</update>
<!--刪除-->
<delete id="deleteAuthor" parameterClass="author">
delete from author WHERE id = #id#
</delete>
<!--查詢所有的記錄-->
<select id="getAllAuthor" resultClass="author">
<![CDATA[SELECT * FROM author]]>
</select>
<!--添加-->
<insert id="insertAuthor" parameterClass="author">
<![CDATA[INSERT INTO author(id,name) VALUES(#id#,#name#)]]>
</insert>
</sqlMap>
第三步:SqlMapConfig.properties
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=ibatis
username=sa
password=
第四步:SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"<!-- Ibatis配置文件-->
<sqlMapConfig>
<!-- 加載連接數(shù)據(jù)庫屬性文件 -->
<properties resource="com/ibatis/SqlMapConfig.properties" />
<!--
cacheModelsEnabled:是否啟動SqlMapClient的緩存機制。
enhancementEnabled:是否針對POJO啟用字節(jié)碼增加機制以提升geter/seter的調(diào)用效用,為延遲
加載帶來了及大的性能提升。
lazyLoadingEnabled:是否啟用延遲加載機制。
maxRequests:最大并大請求數(shù)。
maxSessions:最大Session數(shù),即當(dāng)前最大允許的開發(fā)SqlMapClient數(shù)
maxTransactions:最大并發(fā)事務(wù)數(shù)。
-->
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>
<!-- datasource -->
<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<!--JDBC驅(qū)動-->
<property name="JDBC.Driver" value="${driver}"/>
<!--數(shù)據(jù)庫URL-->
<property name="JDBC.ConnectionURL" value="${url}"/>
<!--數(shù)據(jù)庫用戶名-->
<property name="JDBC.Username" value="${username}"/>
<!--數(shù)據(jù)庫密碼-->
<property name="JDBC.Password" value="${password}"/>
<!--不知道,在網(wǎng)站上查不出來,有時間再研究-->
<property name="JDBC.DefaultAutoCommit" value="true" />
<!--數(shù)據(jù)庫連接池可維持的最大容量-->
<property name="Pool.MaximumActiveConnections" value="10"/>
<!--數(shù)據(jù)庫連接池中允許的可掛起連接數(shù)-->
<property name="Pool.MaximumIdleConnections" value="5"/>
<!--數(shù)據(jù)庫連接池中,連接被某個任務(wù)所占用的最大時間-->
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<!--當(dāng)線程想從連接池中獲取連接時,連接池中無可用連接,該參數(shù)設(shè)置線程所允許等待的最長時間-->
<property name="Pool.TimeToWait" value="500"/>
<!--數(shù)據(jù)庫連接狀態(tài)檢查語句-->
<property name="Pool.PingQuery" value="select 1 from author"/>
<!--是否允許檢查連接狀態(tài)-->
<property name="Pool.PingEnabled" value="false"/>
<!--對持續(xù)連接超過設(shè)定值的連接進行檢查-->
<property name="Pool.PingConnectionsOlderThan" value="1"/>
<!--對空閑超過設(shè)定值的連接進行檢查-->
<property name="Pool.PingConnectionsNotUsedFor" value="1"/>
</dataSource>
</transactionManager>
<!--加載SqlMap文件-->
<sqlMap resource="com/ibatis/author.xml" />
</sqlMapConfig>
第五步:
package com.ibatis;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class SqlMapConf {
//初始化SqlMapClient
private static SqlMapClient sqlmapclient;
static{
//定義ibatis配置文件的路徑
String resource="com/ibatis/SqlMapConfig.xml";
try {
//讀取ibatis配置文件
Reader reader=Resources.getResourceAsReader(resource);
//通過SqlMapClientBuilder創(chuàng)建SqlMapClient
sqlmapclient=SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("找不到SqlMapConfig.xml文件~~");
}
}
public static SqlMapClient getInstance(){
//返回sqlmapclient,SqlMapClient是ibatis的核心主建,提供數(shù)據(jù)操作的基礎(chǔ)平臺
return sqlmapclient;
}
/**
* SqlMapClient的另一種創(chuàng)建方式
* XmlSqlMapClientBuilder xmlbuilder=new XmlSqlMapClientBuilder();
* SqlMapClient sqlmapclient=xmlbuilder.builderSqlMap(reader);
* XmlSqlMapClientBuilder是ibatis2.0之后版本新引入的組件,用以取代1.X版本中的
* XmlSqlMapBuilder,其作用就是創(chuàng)建SqlMapClient。
*/
}
第六步:
package com.ibatis;
import java.sql.SQLException;
import java.util.List;
import java.util.*;
import com.ibatis.sqlmap.client.SqlMapClient;
/**
* ibatis的事務(wù)管理器,目前只支持三種:JDBC,JTA,EXTERNAL
* JDBC:通過傳統(tǒng)的JDBC CONNECTION.COMIT/rollback實現(xiàn)事務(wù)支持
* JTA:使用容器提供的JTA服務(wù)實現(xiàn)全局事務(wù)管理
* EXTERNAL:外部事務(wù)管理,如EJB中使用IBATIS,通過EJB的部署配置即可實現(xiàn)自動的事務(wù)管理機制
* 。此時IBATIS將把所有的事務(wù)委托給外部容器進行管理
*/
public class IbatisClient {
private static SqlMapClient sqlmapclient=SqlMapConf.getInstance();
//根據(jù)主健ID修改NAME
public static void updateAuthor(int id,String name){
Author author=new Author();
author.setId(id);
author.setName(name);
try {
//事務(wù)開始,用的是JDBC的事務(wù)管理
sqlmapclient.startTransaction();
sqlmapclient.update("updateAuthor",author);
sqlmapclient.commitTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("修改錯誤~~");
}
finally{
try {
sqlmapclient.endTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//查詢所有的記錄,返回一個集合
public static List findAll(){
List list=null;
try {
sqlmapclient.startTransaction();
//0:設(shè)置從第幾條記錄開始
//1:設(shè)置顯示記錄記錄
//list=sqlmapclient.queryForList("getAllAuthor",null,0,1);
list=sqlmapclient.queryForList("getAllAuthor",null);
sqlmapclient.commitTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("查詢錯誤~~");
}
finally{
try {
sqlmapclient.endTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
//添加操作
public static boolean insert(int id,String name){
boolean bool=false;
Author author=new Author();
author.setId(id);
author.setName(name);
try {
sqlmapclient.startTransaction();
sqlmapclient.insert("insertAuthor",author);
bool=true;
sqlmapclient.commitTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
bool=false;
e.printStackTrace();
System.out.println("添加錯誤~~");
}
finally{
try {
sqlmapclient.endTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bool;
}
//刪除操作
public static boolean delete(int id){
boolean bool=false;
Author author=new Author();
author.setId(id);
try {
sqlmapclient.commitTransaction();
sqlmapclient.delete("deleteAuthor",author);
bool=true;
sqlmapclient.startTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
bool=false;
e.printStackTrace();
System.out.println("刪除錯誤~~");
}
finally{
try {
sqlmapclient.endTransaction();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bool;
}
public static void main(String str[]){
//刪除
//boolean bool=IbatisClient.delete(3);
//添加
//boolean bool=IbatisClient.insert(3,"wanwu");
//修改
//IbatisClient.updateAuthor(3,"jj");
//查詢所有的記錄
List list=IbatisClient.findAll();
Iterator iterator=list.iterator();
while(iterator.hasNext()){
Author author=(Author)iterator.next();
System.out.println("ID ="+author.getId());
System.out.println("NAME ="+author.getName());
}
}
}
以上是一個簡單的Ibatis的增,刪,改查的例子