下面將介紹使用spring+mybatis的開發樣例:
首先,筆者創建的是一個maven工程,在開發先先導入相關的依賴jar:
pom.xml:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- spring3 相關依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- mysql jdbc driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.13</version> </dependency> <!-- log 日誌 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> <!-- mybatis-spring 插件 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.1</version> </dependency> <!-- mybatis依賴 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 數據庫連接池 --> <dependency> <groupId>proxool</groupId> <artifactId>proxool</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>proxool</groupId> <artifactId>proxool-cglib</artifactId> <version>0.9.1</version> </dependency> <!-- servlet-jsp 依賴,爲編譯jsp時使用 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> </dependencies>
web.xml中對spring和數據庫連接池的配置:
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- The front controller of this Spring Web application, responsible for handling all application requests --> <servlet> <servlet-name>spring3</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet for handling --> <servlet-mapping> <servlet-name>spring3</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- database proxool config --> <servlet> <servlet-name>ServletConfigurator</servlet-name> <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class> <init-param> <param-name>xmlFile</param-name> <param-value>WEB-INF/proxool.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
在這裏要注意,因爲我使用了數據庫連接池proxool,雖然已經設置servlet的啓動級別是1,但是由於在servlet啓動之前,spring(ContextLoaderListener)監聽器已啓動了,所以在spring監聽啓動時它會報一個找不到對應的數據源的SQLException。對於這個問題,本可以通過更改spring爲servlet啓動,並將啓動級別設置爲proxool配置加載之後解決:
<servlet> <servlet-name>contextConfigLocation</servlet-name> <servlet-class> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet>
但是因爲spring3以後就不支持使用servlet啓動了,官方推薦使用listener啓動applicationContext。所以這個方法在新版本不適合了,不過這個異常可以忽略,因爲proxool在整個項目加載完成的時候的確以及完成了加載,所以在項目運行起來以後是不會報錯的,開始報錯是spring做的一個檢查。
爲了解決亂碼問題最好在web.xml中加上這個配置:
<!-- character filter. use UTF8 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
下面是對spring3-servlet.xml的配置,它裏面申明的bean都存放在webApplicationContext中:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" default-lazy-init="false" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.pinche.statistic.web"></context:component-scan> <!-- 啓用spring mvc註解 --> <mvc:annotation-driven /> <!-- 靜態資源訪問問題 --> <mvc:default-servlet-handler /> <!-- Default ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/page/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 對拋給spring的異常的處理 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error</prop> </props> </property> </bean> </beans>
下面對applicationContext.xml進行配置(這裏使用了兩個數據源):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 數據源配置:這裏配置了兩個數據源dataSource_statistic和dataSource_pinche, 分別注入到_sqlSessionFactory_statistic和_sqlSessionFactory_pinche --> <bean id="dataSource_statistic" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 數據庫連接 --> <property name="url" value="proxool.statistic" /> <!-- 這是不使用數據庫連接池的配置方式,由於proxool只有在啓動web應用的時候才能加載, 所以如果在初期開發階段可以用這種簡單的數據庫連接方式,在通過 new FileSystemXmlApplicationContext("src/main/webapp/WEB-INF/applicationContext.xml") 獲取到context,並進行測試。 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.1.168:3306/statistic"/> <property name="username" value="statistic"></property> <property name="password" value="statistic"></property> --> </bean> <bean id="dataSource_pinche" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 數據庫連接 --> <property name="url" value="proxool.pinche" /> </bean> <!-- 爲mybatis-spring注入數據源 --> <bean name="_sqlSessionFactory_statistic" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入數據源 --> <property name="dataSource" ref="dataSource_statistic"></property> <!-- 注入別名的包名前綴,這樣就可以在mybatis的文件中直接寫類名不用寫全名了 --> <property name="typeAliasesPackage" value="com.pinche.statistic.domain" /> </bean> <bean name="_sqlSessionFactory_pinche" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入數據源 --> <property name="dataSource" ref="dataSource_pinche"></property> <!-- 注入別名的包名前綴,這樣就可以在mybatis的文件中直接寫類名不用寫全名了 --> <property name="typeAliasesPackage" value="com.pinche.statistic.domain" /> <!-- 該配置文件用來指定Mapper映射文件的位置 ,如果映射文件與相應的接口同名,且在同一路徑下,那麼可以不配置該選項--> <!--<property name="mapperLocations" value="src/UserMapper.xml"/>--> <!-- 該屬性用來指定MyBatis的XML配置文件路徑,跟Spring整合時, 編寫MyBatis映射文件的目的無非是配置一下typeAlias、setting之類的 元素。不用在其中指定數據源,或者事務處理方式。就算配置了也會被忽略。 因爲這些都是使用Spring中的配置。當然如果你不打算添加typeAlias 之 類的設置的話,你連MyBatis的配置文件都不用寫,更不用配置這個屬性了 --> <!-- <property name="configLocation" value=""/> --> </bean> <!-- 註冊Mapper方式一 <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.pinche.statistic.mapper.ApplicationsMapper"/> <property name="sqlSessionFactory" ref="_sqlSessionFactory_statistic"/> </bean> --> <!-- 註冊Mapper方式二:也可不指定特定mapper,而使用自動掃描包的方式來註冊各種Mapper ,配置如下:--> <!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pinche.statistic.mapper"></property> </bean> --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pinche.statistic.dialstatistic.mapper"></property> <property name="sqlSessionFactoryBeanName" value="_sqlSessionFactory_pinche"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.pinche.statistic.mapper"></property> <property name="sqlSessionFactoryBeanName" value="_sqlSessionFactory_statistic"></property> </bean> <!-- 事務 --> <!-- 雖然mybatis也有自己的事務配置,但是配置了也沒用,事務最終會交由spring控制, 由於項目沒有用到可以注掉。 --> <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource_statistic" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> --> <!-- 啓用註解 --> <context:annotation-config /> <!-- 自動掃描注入 --> <context:component-scan base-package="com.pinche.statistic.dao, com.pinche.statistic.service" /> </beans>
通過以上的工作環境的配置完成,下一章繼續介紹spring-mybatis集成開發的剩餘內容。