Springside 中在orm这一层提供了ibatis的实现,可惜在例子中没有demo具体的用法。所以在这里简单demo一下在springside中使用ibatis的方法,运行效果如下:
(可能有人注意到这个列表不是使用ss中默认集成的extremetable,呵呵,没错,我用的是fins提供的ecside控件,关于在ss中使用ecside另外文章介绍)
<o:p> </o:p>
1. 创建新项目
关于从ss中创建一个项目,请参看ss的wiki: wiki.springside.org.cn,记得选择控件的时候选择orm/ibatis。
2. POJO
一个简单的叫做User的pojo,只包含一个id和一个username。
- public class User {
- private Integer id;
- private String username;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- }
3.Service层
一个继承自IBatisEntityDao的Manager,已经具有了list,save…等方法:
- public class UserManager extends IBatisEntityDao<user></user> {
- }
4.Web层
同样是一个继承自的Action类,也没什么好说的:
- public class UserAction extends StrutsEntityAction {
- private UserManager userManager;
- public void setUserManager(UserManager userManager) {
- this.userManager = userManager;
- }
- }
5.配置啊配置
重头戏来了,下面介绍ibatis需要的配置文件,以及这几个文件之间的关系。
(1) applicationContext-ibatis.xml
类似ss中演示hibernate时的配置文件dataAccessContext-hibernate.xml,配置数据源、sqlMapClient以及transactionManager。<o:p></o:p>
注意在sqlMapClient的配置中configLocation属性指明了SQL Map XML配置文件的位置信息,“SQL Map使用XML配置文件统一配置不同的属性,包括DataSource的详细配置信息,SQL Map和其他可选属性,如线程管理等。”(摘自《iBATIS SQL Maps开发指南》)。不过在本文中只配置了映射文件。
- xml version="1.0" encoding="UTF-8"?>
- >
- <beans default-autowire="byName" default-lazy-init="true">
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- bean>
- <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <property name="configLocation" value="/WEB-INF/sql-map.xml" />
- <property name="dataSource" ref="dataSource"/>
- bean>
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource"><ref local="dataSource"/>property>
- bean>
- beans>
(2) sql-map.xml
正如在(1)中所说,本文件中只是说明了映射文件的位置,关于更多配置选项,请参考《iBATIS SQL Maps开发指南》。其中resource="ibatis/user.xml"中中的路径信息是相对classpath的。
- xml version="1.0" encoding="UTF-8" ?>
- >
- <sqlMapConfig>
- <sql-map resource="ibatis/user.xml" />
- sqlMapConfig>
(3) user.xml
终于到了最后一个配置文件了,这个文件就相当于hibernate的映射文件了,如下所示:
- xml version="1.0" encoding="UTF-8" ?>
- >
- <sqlMap namespace="user">
- <resultMap id="result" class="com.gpcgd.model.User">
- <result property="id" column="id" columnIndex="1"/>
- <result property="username" column="username" columnIndex="2"/>
- resultMap>
- <select id="com.gpcgd.model.User.select" resultMap="result">
- select t.id,t.username, from t_user t
- select>
- sqlMap>
resultMap指明了数据库和对象之间的映射关系,至于下面这段,需要解释一下
<o:p></o:p>
- <select id="com.gpcgd.model.User.select" resultMap="result">
- select t.id,t.username, from t_user t
- select>
首先是这个id,对应了dao接口中的调用参数,而返回值resultMap的值(resultMap="result")又对应了对象-数据库映射的resultMap的id(resultMap id="result")。
关于这个id="com.gpcgd.model.User.select",有必要说明一下。
我们知道,ss中Action类的list方法是调用Manager类的getAll()方法的。
在/ss2/core/src/java/org/springside/core/dao/IBatisGenericDao.java的源码中我们可以看到:
- /**
- * 获取全部对象
- */
- public <t></t> List<t></t> getAll(Class<t></t> entityClass) {
- return getSqlMapClientTemplate().queryForList(entityClass.getName() + POSTFIX_SELECT, null);
- }
其中entityClass.getName()=“com.gpcgd.model.User”,而POSTFIX_SELECT=“.select”。所以select的id要设置为:“com.gpcgd.model.User.select”。<o:p></o:p>
不知道能不能对“com.gpcgd.model.User.select”这种写法进行简化,如果哪位知道,请留言指正,谢谢!<o:p></o:p>