一、媒介
上次讲了Struts团结Spring并利用Spring的JdbcTemplate来搭建工程框架后我们面对着jar库无法打点,工程宣布不利便,jar包在工程内太占空间,jar包斗嘴,打点,甚至漏包都问题。于是我们在讲“万能框架spring(二)”前,教授了一篇番外篇,即讲操作maven来打点我们的jar库。
从本日开始我们将团结“万能框架spring(一)”与番外篇maven来更进一步富厚我们的ssx框架,那么本日讲的是利用iBatis3团结SS来构建我们的ssi框架,我们把这个框架定名为beta吧。
二、SSI框架
还记得我们在第十八天中讲到的我们的框架的架构图吗?上面这张是我们本日的架构图,除了Struts,昆山软件公司,Spring层,我们需要调动的是DAO层即把本来的SQL这部门换成iBatis,我们在次利用的是iBatis版本3。
由于我们在第十八天中已经说了这样的一个框架的长处个中就有:
层中相关技能的替换不影响到其它层面
所以对付我们来说我们需要窜改的代码只有datasource.xml与dao层的2个接口两个类,那我们就一起来看看这个基于全注解的SSi框架是怎么样搭起来的吧。
三、搭建SSI框架
3.1成立工程
我们照旧利用maven来成立我们的工程
建完后照着翻外篇《第十九天》中的“四、如何让Maven构建的工程在eclipse里跑起来”对工程举办配置。
3.2 增加iBatis3的jar相关包
打开pom.xml
第一步
找到“slf4j”,将它在pom中的描写改成如下内容:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.10</version> </dependency>
第二步
增加两个jar包
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.10</version> </dependency> <dependency> <groupId>org.apache.ibatis</groupId> <artifactId>ibatis-core</artifactId> <version>3.0</version> </dependency>
3.3 开始设置ibatis与spring团结
打开/src/main/resources/spring/datasource下的datasource.xml,增加如下几行
<bean id="iBatisSessionFactory" class="org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean" scope="singleton"> <property name="configLocation" value="sqlmap.xml"></property> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="iBatisDAOSupport" class="org.sky.ssi.ibatis.IBatisDAOSupport"> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
此处,我们需要4个类,它们是:
org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean类
package org.sky.ssi.ibatis; import java.io.IOException; import java.io.Reader; import javax.sql.DataSource; import org.apache.ibatis.builder.xml.XMLConfigBuilder; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; /** * * IBatis3SQLSessionFactoryBean is responsible for integrating iBatis 3 <p> * with spring 3. Since all environment configurations have been moved to <p> * spring, this class takes the responsibility to get environment information<p> * from spring configuration to generate SqlSessionFactory. * @author lifetragedy * */ public class IBatis3SQLSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean{ rivate String configLocation; private DataSource dataSource; private SqlSessionFactory sqlSessionFactory; private boolean useTransactionAwareDataSource = true; private String environmentId = "development"; public String getConfigLocation() { return configLocation; } public void setConfigLocation(String configLocation) { this.configLocation = configLocation; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public boolean isUseTransactionAwareDataSource() { return useTransactionAwareDataSource; } public void setUseTransactionAwareDataSource( boolean useTransactionAwareDataSource) { this.useTransactionAwareDataSource = useTransactionAwareDataSource; } public String getEnvironmentId() { return environmentId; } public void setEnvironmentId(String environmentId) { this.environmentId = environmentId; } public SqlSessionFactory getObject() throws Exception { return this.sqlSessionFactory; } public Class<SqlSessionFactory> getObjectType() { return SqlSessionFactory.class; } public boolean isSingleton() { return true; } public void afterPropertiesSet() throws Exception { this.sqlSessionFactory = this.buildSqlSessionFactory(configLocation); } protected SqlSessionFactory buildSqlSessionFactory(String configLocation) throws IOException { if (configLocation == null) { throw new IllegalArgumentException( "configLocation entry is required"); } DataSource dataSourceToUse = this.dataSource; if (this.useTransactionAwareDataSource && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) { dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource); } Environment environment = new Environment(environmentId, new IBatisTransactionFactory(dataSourceToUse), dataSourceToUse); Reader reader = Resources.getResourceAsReader(configLocation); XMLConfigBuilder parser = new XMLConfigBuilder(reader, null, null); Configuration config = parser.parse(); config.setEnvironment(environment); return new DefaultSqlSessionFactory(config); } }