IBATIS最新最全開發指南 - 通俗易懂IBATIS教程(2)

OSCache 來自第三方組織Opensymphony 。可以通過以
下網址獲得OSCache 的最新版本(http://www.opensymphony.com/oscache/)。
在生產部署時,建議採用OSCache,OSCache 是得到了廣泛使用的開源Cache 實現
(Hibernate 中也提供了對OSCache 的支持),它基於更加可靠高效的設計,更重要的是,
最新版本的OSCache 已經支持Cache 集羣。如果系統需要部署在集羣中,或者需要部署在
多機負載均衡模式的環境中以獲得性能上的優勢,那麼OSCache 在這裏則是不二之選。
Ibatis 中對於OSCache 的配置相當簡單:
<cacheModel id="userCache" type="OSCACHE">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel>
之所以配置簡單,原因在於,OSCache 擁有自己的配置文件(oscache.properties)J。
下面是一個典型的OSCache 配置文件:
#是否使用內存作爲緩存空間
cache.memory=true
#緩存管理事件監聽器,通過這個監聽器可以獲知當前Cache 的運行情況
cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroa
dcastingListener
#如果使用磁盤緩存(cache.memory=false),則需要指定磁盤存儲接口實現
#cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.Disk
PersistenceListener
# 磁盤緩存所使用的文件存儲路徑
# cache.path=c:myappcache
# 緩存調度算法,可選的有LRU,FIFO 和無限緩存(UnlimitedCache)

# cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache
# cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache
cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache
#內存緩存的最大容量
cache.capacity=1000
# 是否限制磁盤緩存的容量
# cache.unlimited.disk=false
# 基於JMS 的集羣緩存同步配置
#cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory
#cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic
#cache.cluster.jms.node.name=node1
# 基於JAVAGROUP 的集羣緩存同步配置
#cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_
ttl=32;mcast_send_buf_size=150000;mcast_recv_buf_size=80000):PING(timeout
=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000
):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.NAKACK(gc_lag=50;retransm
it_timeout=300,600,1200,2400,4800):pbcast.STABLE(desired_avg_gossip=20000):
UNICAST(timeout=5000):FRAG(frag_size=8096;down_thread=false;up_thread=fal
se):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_loc
al_addr=true)
#cache.cluster.multicast.ip=231.12.21.132
配置好之後,將此文件放在CLASSPATH 中,OSCache 在初始化時會自動找到此
文件並根據其中的配置創建緩存實例。

ibatis in Spring
這裏我們重點探討Spring 框架下的ibatis 應用,特別是在容器事務管理模式下的ibatis
應用開發。
關於Spring Framework ,請參見筆者另一篇文檔:
《Spring 開發指南》http://www.xiaxin.net/Spring_Dev_Guide.rar
針對ibatis,Spring 配置文件如下:
Ibatis-Context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
">
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://127.0.0.1:1433/Sample</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>changeit</value>
</property>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactio
nManager">
"http://www.springframework.org/dtd/spring-beans.dtd

 

 

<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<bean id="userDAO" class="net.xiaxin.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="sqlMapClient">
<ref local="sqlMapClient" />
</property>
</bean>
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.TransactionPro
xyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>


<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
可以看到:
1. sqlMapClient 節點
sqlMapClient 節點實際上配置了一個sqlMapClient 的創建工廠類。
configLocation 屬性配置了ibatis 映射文件的名稱。
2. transactionManager 節點
transactionManager 採用了Spring 中的DataSourceTransactionManager 。
3. userDAO 節點

 

對應的,UserDAO 需要配置兩個屬性,sqlMapClient 和DataSource,
sqlMapClient 將從指定的DataSource 中獲取數據庫連接。
本例中Ibatis 映射文件非常簡單:
sqlMapConfig.xml:
<sqlMapConfig>
<sqlMap resource="net/xiaxin/dao/entity/user.xml"/>
</sqlMapConfig>
net/xiaxin/dao/entity/user.xml
<sqlMap namespace="User">
<typeAlias alias="user" type="net.xiaxin.dao.entity.User" />
<insert id="insertUser" parameterClass="user">
INSERT INTO users ( username, password) VALUES ( #username#,
#password# )
</insert>
</sqlMap>
UserDAO.java:
public class UserDAO extends SqlMapClientDaoSupport implements
IUserDAO {
public void insertUser(User user) {
getSqlMapClientTemplate().update("insertUser", user);
}
}
SqlMapClientDaoSupport(如果使用ibatis 1.x 版本,對應支持類是
SqlMapDaoSupport)是Spring 中面向ibatis 的輔助類,它負責調度DataSource 、

 


SqlMapClientTemplate(對應ibatis 1.x 版本是SqlMapTemplate)完成ibatis 操作,
而DAO 則通過對此類進行擴展獲得上述功能。上面配置文件中針對UserDAO 的屬性設
置部分,其中的屬性也是繼承自於這個基類。
SqlMapClientTemplate 對傳統SqlMapClient 調用模式進行了封裝,簡化了上層訪問
代碼。
User.java:
public class User {
public Integer id;
public String username;

 

 

public String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
測試代碼:
InputStream is = new FileInputStream("Ibatis-Context.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
IUserDAO userdao = (IUserDAO)factory.getBean("userDAOProxy");
User user = new User();
user.setUsername("Sofia");
user.setPassword("mypass");
userdao.insertUser(user);
對比前面ibatis 程序代碼,我們可以發現UserDAO.java 變得異常簡潔,這也正是
Spring Framework 爲我們帶來的巨大幫助。
Spring 以及其他IOC 框架對傳統的應用框架進行了顛覆性的革新,也許這樣的評價有

 


點過於煽情,但是這確是筆者第一次跑通Spring HelloWorld 時的切身感受。有興趣的
讀者可以研究一下Spring framework,enjoy it!   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章