为了方便与安全,需要用Spring+iBATIS进行DAO操作。看代码很容易理解,自己的实验却始终不能运行,不是出现创建bean时stackflow错误,就是can not create connection,莫名其妙。人和机器同时~~~~崩溃~~~~~。今天又莫名其妙的搞好了~~~~赶紧写个小例子把装配过程记下来。(例子内容:实现读取本机mysql test库中的state表)
(一)首先,先配置好jndi数据源:在{server.dir}\deploy目录下创建dataSource的配置文件。我使用的是mysql文件名必须是mysql-ds.xml,内容大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/StateDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
</local-tx-datasource>
</datasources>
说明:jndi-name指定数据源的名字,剩下的数据源配置和平时差不多。
(二)配置web.xml和jboss-web.xml:
需要在web.xml下添加如下元素用于指定对dataSource的引用:
<resource-ref>
<res-ref-name>jdbc/StateDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
相应的需要在jboss-web.xml下添加如下内容:
<resource-ref>
<res-ref-name>jdbc/StateDS</res-ref-name>
<jndi-name>java:jdbc/StateDS</jndi-name>
</resource-ref>
(三)现在开始写一个试验用的javabean(对应表结构)并配置和它相对应sqlmap文件:
/*state.java*/
package state.beans;
public class state {
private int id;
private String name;
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
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;
}
}
然后写一个位于state/maps/目录下的sqlmap文件:state.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="state">
<resultMap id="state" class="state.beans.state">
<result property="id" column="ID"/>
<result property="name" column="NAME"/>
<result property="code" column="CODE"/>
</resultMap>
<select id="getAllState" resultMap="state">
select * from state
</select>
</sqlMap>
(四)在/WEB-INF/下编写sqlmapconfig配置文件: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>
<settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" errorTracingEnabled="false" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<transactionManager type="JDBC">
<dataSource type="JNDI">
<property name="dataSource" value="java:jdbc/StateDS"/>
</dataSource>
</transactionManager>
<sqlMap resource="state/maps/state.xml" />
</sqlMapConfig>
(五)编写数据库操作的模版类:stateDAO.java
package state.dao;
import java.util.List;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
public class stateDAO extends SqlMapClientDaoSupport{
public List getAllState(){
return getSqlMapClientTemplate().queryForList("getAllState","0");
}
}
关键说明:这个类继承自org.springframework.orm.ibatis.support.SqlMapClientDaoSupport。这是Spring为iBATIS的操作提供的操作支持。它有一个方法getSqlMapClientTemplate()用于获取操作模版(Spring 为各种数据库操作提供了模版类,用这些模版类处理数据操作更方便更明了也更安全)。queryForList这个方法是由SqlMapClientTemplate类提供的处理ibatis sqlmap映射的方法。
(六)设置SpringSpring配置,进行bean映射,实现bean的自动处理:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:jdbc/StateDS</value>
</property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
<property name="configLocation">
<value>/WEB-INF/sqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<bean id="stateDAO" class="state.dao.stateDAO">
<property name="sqlMapClient">
<ref local="sqlMapClient" />
</property>
</bean>
</beans>
关键说明:bean dataSource部分用于初始化dataSource作为数据源bean。
bean SqlMapClient用于初始化SqlMapClient作为iBATIS的操作对象,需要指定configLocation和dataSource属性。
Bean stateDAO就是我们的数据库操作bean,它需要设置sqlMapClient属性(这个属性是由他的超类SqlMapClientDaoSupport指定的)。
OK!到现在为止工作就基本完成了。Deloy一下,运行,祈祷~~~~~Bingo~~~~~!!!
(在我的机器上还有一个小问题:第一次访问应用的时候总是出错(在访问就没问题了),显示不能创建连接,到现在也不知道为什么,不知道是不是因为机器太烂,难道是人品问题?!)