初次實踐:Spring+MyBatis技術搭建框架,采用Bootstrap前端開源框架。
簡介:
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML 或注解用於配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。
工程架構圖:


1、工程架包引入:pom.xml
<properties> <junit.version>3.8.1</junit.version> <spring.version>3.0.7.RELEASE</spring.version> <dbcp.version>1.4</dbcp.version> <fileupload.version>1.2.2</fileupload.version> <commons.io.version>2.4</commons.io.version> <jstl.version>1.2</jstl.version> <asm.version>3.3</asm.version> <aspectj.version>1.7.0</aspectj.version> <cglib.version>2.2</cglib.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- spring 配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 提供事務支持 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- aopalliance --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- dbcp --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp.version}</version> </dependency> <!-- DBCP數據源依賴於commons-pool類包 --> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.5.6</version> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- Aspectj 支持 ,在aop增強織入時,需要使用org.aspectj.weaver支持 --> <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>${asm.version}</version> </dependency> <dependency> <groupId>aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${aspectj.version}</version> </dependency> <!-- 用於創建代理的CGlib包 --> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>${cglib.version}</version> </dependency> <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency> <!-- 打日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies>
2.MyBatis配置
mybatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="User" type="com.crazysnail.domain.User"/> <typeAlias alias="Blog" type="com.crazysnail.domain.Blog"/> <typeAlias alias="Comment" type="com.crazysnail.domain.Comment"/> </typeAliases> <!-- 指定接口的實現映射文件;如果此處未指定,可以在配置SqlSessionFactory時,通過SqlSessionFactory的mapperLocations屬性配置 --> <!-- <mappers> --> <!-- <mapper resource="com/crazysnail/domain/mybatis/User.xml"/> --> <!-- </mappers> --> </configuration>
MyBatis的配置文件中,主要是別名的聲明。
3、Spring容器配置:
為了方便Bean的管理,將Spring的配置文件分為了多個,包括spring-main.xml、spring-datasources.xml、spring-service.xml
spring-main.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <import resource="spring-datasources.xml"/> <import resource="spring-service.xml"/> </beans>
spring-main.xml主要負責引入其他的配置文件,進行整合。
spring-datasources.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" xsi:schemaLocation="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"> <!-- 配置數據源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://127.0.0.1:3306/crazysnailweb?useUnicode=true&characterEncoding=UTF-8" p:username="root" p:password="123456" p:maxIdle="10" p:minIdle="10" /> <!-- 其中p:mapperLocations指定數據庫操作文件的地址 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="classpath:mybatisConfig.xml" p:mapperLocations="classpath:com/crazysnail/domain/mybatisConfig/*.xml" /> <!-- mybatis數據訪問的核心模板 --> <bean class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <!-- 用於將接口映射為具體的實例 ,使得在Service中可以直接注入相關的Dao接口來進行數據訪問--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:sqlSessionFactory-ref="sqlSessionFactory" p:basePackage="com.crazysnail.dao" /> </beans>
spring-datasources.xml主要配置數據源和引入MyBatis的核心Bean來支持數據訪問。
【注:此處說明一下引入的幾個關於mybatis的Bean。
- SqlSessionFactory:MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心。可以從SqlSessionFactory中獲取SqlSession,而SqlSession對象完全包含以數據庫為背景的所有執行SQL操作的方法。可以用 SqlSession 實例來直接執行已映射的 SQL 語句。
- SqlSessionTemplate:實現了SqlSession接口中的所有執行SQL的方法,需要SqlSessionFactory實例來作為構造參數。
- MapperScannerConfigurer:該實例的引入,將映射文件中的數據訪問語句映射到映射文件命名空間所指定的Dao接口中聲明的方法。】
spring-service.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:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <context:component-scan base-package="com.crazysnail.service" /> <!-- 對標注@Transactional注解的Bean進行加工處理,以織入事務管理切面 --> <!-- 默認情況下,<tx:annotation-driven的transaction-manager的值為transactionManager,因而此處可直接簡化為 <tx:annotation-driven/>--> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref = "dataSource"/> <!-- 對服務層的類提供事務支持 --> <aop:config proxy-target-class="true"> <aop:pointcut id="serviceMethod" expression="execution(* com.crazysnail.service..*(..))"/> <!-- 引用事務增強 --> <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" /> </aop:config> <!-- 事務增強 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!--事務屬性定義 --> <tx:attributes> <tx:method name="get*" read-only="false"/> <tx:method name="add*" rollback-for="Exception"/> <tx:method name="update*"/> </tx:attributes> </tx:advice> </beans>
spring-service.xml主要配置掃描service層,並且為service層通過aop添加事務增強。
4、web容器配置:
web.xml:
<?xml version= "1.0" encoding = "UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-main.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 使用Filter進行編碼轉換 --> <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 不要使用/,使用/*代替才能夠真正起作用,還需要配置在ContextLoaderListener后才能起作用 --> </filter-mapping> <!-- 用戶權限控制 --> <filter> <filter-name>authenFilter</filter-name> <filter-class>com.crazysnail.filter.AuthenFilter</filter-class> </filter> <filter-mapping> <filter-name>authenFilter</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> <!-- 配置DispatcherServlet --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
web.xml文件指定了spring容器配置文件的位置、用於啟動Spring容器的監聽器(ContextLoaderListener)、用於對用戶請求轉碼的編碼轉換過濾器和權限驗證過濾器及用於請求分發的DispatcherServlet。
5、對於Servlet的配置:
dispatcher-servlet.xml:
<?xml version= "1.0" encoding ="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 默認的注解映射的支持 --> <mvc:annotation-driven/> <!-- 靜態資源映射 --> <mvc:resources mapping="/js/**" location="./js/" /> <mvc:resources mapping="/user/js/**" location="./js/" /><!-- 設置權限的靜態資源訪問 --> <mvc:resources mapping="/css/**" location="./css/" /> <mvc:resources mapping="/user/css/**" location="./css/" /> <mvc:resources mapping="/fonts/**" location="./fonts/" /> <mvc:resources mapping="/user/fonts/**" location="./fonts/" /> <mvc:resources mapping="/img/**" location="./img/" /> <mvc:resources mapping="/user/img/**" location="./img/" /> <!-- 當上面要訪問的靜態資源不包括在上面的配置中時,則根據此配置來訪問 --> <mvc:default-servlet-handler/> <context:component-scan base-package="com.crazysnail.controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" /> </beans>
servlet配置文件主要指定了URL映射的相關規則,將處理URL的控制器通過掃描controller包放置到Spring容器中,指定了視圖解析器,用於將Controller中返回的邏輯視圖名映射到具體的jsp文件。
【注:由於在web.xml中配置的servlet對應的servlet-mapping匹配的url為"/",表明每個鏈接都會由dispatcher進行分發,而在jsp頁面中引入的js、css、圖片等靜態資源無法通過servlet分發來找到對應資源,此時需要配置靜態資源映射。這是通過mvc:resources來進行配置的,對應的文件位置可參考工程結構圖。】
總結:
MyBatis與Spring的結合點在於配置spring的數據訪問時,
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="classpath:mybatisConfig.xml" p:mapperLocations="classpath:com/crazysnail/domain/mybatisConfig/*.xml" />
通過SqlSessionFactory實例的configLocation屬性指明了MyBatis的配置文件的位置,通過mapperLocations屬性指明了MyBatis映射文件的位置(這也可以在mybatis配置文件mybatisConfig.xml中聲明)。
