簡介
Spring+SpringMVC+MyBatis框架(SSM)是比較熱門的中小型企業級項目開發的框架,對於新手來說也是比較容易學習入門的。雖說容易,但在框架搭建過程中仍然遇到了許多問題,因此用實例記錄下來吧。

實踐部署
一丶創建一個基礎的Spring+Spring-MVC項目:
⑴:File>New Project,由於使用maven管理項目所以創建時我們直接選擇創建Maven工程,並勾選“Createe from archetype” 表示使用於模板進行創建。並找到maven-archetype-webapp這個選項並選中在點擊下一步(Next);

⑵:配置項目工程名字版本信息等...
GroupId:輸入是項目組織唯一的標識符,實際對應JAVA的包的結構,是main目錄里java的目錄結構。命名規則一般是以公司名字或項目名字的縮寫來命名的,但是由於有的時候一個公司不止一個項目,所以就有多種命名規則了。一般來說有兩種寫法。兩級和三級的。兩級的就是com.公司名字/項目名字, 三級就是com.公司名字.項目名字縮寫。
ArtifactID:就是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱
Version:對應的就是工程的版本信息,沒有過多要求可以保持默認的。
三個屬性都填寫后直接下一步(Next)

⑶:配置Maven的引用和本地倉庫信息
Maven home directory:對應的就是你計算機上的maven根目錄
User settings file:對應的是本地計算機上的maven中的settings.xml配置文件,切記:記得修改為maven根目錄里面的\conf文件夾下面的settings.xml,並同時修改settings.xml的本地倉庫引用的配置文件。
<localRepository>E:\project\mavenrepository</localRepository>內容對應的就是Local repository中的本地倉庫根目錄。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>E:\project\mavenrepository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
</settings>
Local repository:本地倉庫根目錄
所有內容修改完畢直接下一步(Next)
⑷填寫項目文件夾名字以及保存路徑:

以上內容全部操作完畢后直接點擊完成(Finish)。點擊完成后IDEA會自動創建工程。由於這里使用了模板創建,所以創建過程會略慢一丟丟。
⑸創建完成后的項目結構圖:

我們可以先將項目結構完善下:

注意下:默認創建的項目是沒有“java”這個文件夾的,所以我們手動創建文件夾后還需要對文件夾進行一個標記注明,如果不進行權限標注標明的話后面配置你會發現找不到java目錄下面的內容的:
點擊這個小圖標進行項目管理


⑹添加Spring核心XML文件 找到項目根目錄點擊 “Add Framework Support” 看單詞就知道顧名思義說的是添加框架的支持

這里選中Spring 這個選項並選中子項Spring MVC 默認進來會選中“Download”這個單選框,選中這里的話默認就會下載Spring所有的相關架包。但是注意這里是下載架包到並自動創建一個lib的文件夾。這就不是maven托管了好吧。所以這里有幾種方法添加Spring支持。
1丶使用默認的“Download”選項 然后點擊OK。窗口會彈出一個下載jar支持的過程,這個時候立即取消下載所有選項。但是Spring-config.xml文件還是會生成並自動引用。
2丶使用“Use library”頁也是同意的方法,取消下載架包然后自動創建核心文件。
以上兩種方法只是解決了自動為項目引用Spring-config.xml核心支撐並生成文件。但是maven中和Spring-config.xml的文件還是沒有配置對應的bean。這里注意下:建議創建一個文件夾將配置文件進行歸類放置。因為一個項目下來肯定不止一個xml文件


添加完成后可以通過項目管理里面查看配置:

⑺修改項目工程的web.xml配置文件
默認創建后的項目“web.xml”配置文件如下,可能每個IDEA版本不一致創建的默認模板會有小差異
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> </web-app>
具體配置內容如下:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app 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_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!--添加log4的日志配置文件-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<!-- 編碼過濾器 -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring監聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止spring內存溢出監聽器,比如quartz -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- spring mvc servlet-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此處也可以配置成 *.do 形式 -->
<url-pattern>*.video</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- session配置 -->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
可能出現的報錯情況:提示async-supported報錯,這個原因是這個標簽是web.xml 3.0的新特性,但是沒有引用新特性的支持。

然后再將xsd加入到web.xml中就搞定了。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app 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_3_0.xsd"
version="3.0">
⑻添加對應的maven支持,修改pom.xml文件
注意:這里添加了一些log4,mybatis的支持,只是方便后面編寫數據持久化的。如果不需要可以不引用添加。就添加<!-- 添加spring核心依賴 -->這塊代碼注釋就好了。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.david.mvc</groupId>
<artifactId>testMVC</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>testMVC Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--便於后期管理同步版本信息,所以這里架包版本信息使用公共參數,也可以在在架包的引用version寫死版本信息,但是不推薦這樣使用-->
<!-- spring版本號 -->
<spring.version>3.1.1.RELEASE</spring.version>
<!-- mybatis版本號 -->
<mybatis.version>3.2.8</mybatis.version>
<!-- mysql驅動版本號 -->
<mysql-driver.version>5.1.29</mysql-driver.version>
<!-- log4j日志包版本號 -->
<slf4j.version>1.7.18</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<!-- 添加jstl依賴 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 添加junit4依賴 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 指定范圍,在測試時才會加載 -->
<scope>test</scope>
</dependency>
<!-- 添加spring核心依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-oxm</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-jdbc</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-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</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-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 添加mybatis依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 添加mybatis/spring整合包依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 添加mysql驅動依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-driver.version}</version>
</dependency>
<!-- 添加數據庫連接池依賴 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 添加fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<!-- 添加日志相關jar包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<!--創建項目時自動生成的單元測試框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>testMVC</finalName>
</build>
</project>
⑼配置Spring核心文件的bean標簽內容
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自動掃描 @Controller 配置的就是寫action方法的文件夾。如果前面沒有為java目錄標注的話這里會發現找不到子級目錄的,返回前面去配置吧-->
<context:component-scan base-package="com.david.action"/>
<!--避免IE執行AJAX時,返回JSON出現下載文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/json</value>
<value>text/html;charset=UTF-8</value>
<!--兼容在IE10以上的瀏覽器正常回傳解析json-->
</list>
</property>
</bean>
<!-- 啟動SpringMVC的注解功能,完成請求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
<!-- JSON轉換器 -->
</list>
</property>
</bean>
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>
<!--在攔截器中將handler對象強轉成HandlerMethod類型需要配置如下三個bean 否則會初始化報錯-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
<ref bean="stringHttpMessageConverter"/>
</list>
</property>
</bean>
<!-- 定義跳轉的文件的前后綴 ,視圖模式配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/content/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 文件上傳配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默認編碼 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 上傳文件大小限制為31M,31*1024*1024 -->
<property name="maxUploadSize" value="32505856"/>
<!-- 內存中的最大值 -->
<property name="maxInMemorySize" value="4096"/>
</bean>
</beans>
二丶基礎項目配置完成,使用Tomcat服務器進行運行吧
1、點擊最右上角的倒三角按鈕,並點擊“Edit Configurations...”這個選項,進行編輯配置信息

2、選擇對應的啟動容器,這里使用Tomcat做例子

3、選擇對應的war項目包

4、配置Tomcat相關啟動端口 默認8080 其中這里的On ‘Update’ action 和On frame deactivation 這兩個地方由於我安裝了熱部署啟動,所以選項不一樣。

5、啟動Tomcat查看項目

三丶在基礎框架上進行添加新的模塊
1、添加Spring攔截器
1.1 為什么使用攔截器
攔截器?顧名思義就知道是進行攔截請求的。攔截器的用途有哪些呢?比如你登錄銀行系統進行查看賬戶余額,不登錄可以直接查看余額和轉賬操作嘛。當然不行。所以這里就需要用到攔截器,進行登錄攔截,看你是不是已登錄的用戶。還有比如異常攔截,做開發的都知道程序如果報錯肯定是會反饋異常的,那這個時候我們如果把異常拋出到前台是可取的嘛。當然也是不行的。所以就還有異常攔截器。那這里為什么要使用spring進行配置攔截器呢。沒有使用spring框架時肯定很多攔截我們都是使用if去手動判斷,這樣的話每一個需要做攔截的方法都要加上一段攔截的相關代碼。這樣是不是很費時和精力。還不便於代碼的后期維護升級。一旦改動攔截規則那所有的地方都需要一一修改。同樣是銀行系統。我們登錄成功后,要進行轉賬操作。這個時候是不是也是需要進行驗證看是否已經登錄啊。那難道銀行的每一步涉及到用戶信息的操作都在每一個方法體中手動加一個if判斷驗證嘛。這當然不可能的了。
1.2 如何實現攔截器
SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現了Spring 的HandlerInterceptor 接口,或者是這個類繼承實現了HandlerInterceptor 接口的類,比如Spring 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;第二種方式是實現Spring的WebRequestInterceptor接口,或者是繼承實現了WebRequestInterceptor的類。更多SpringMVC攔截器相關的內容請點傳送門:SpringMVC攔截器傳送門
1.3 配置攔截器 登錄攔截器/異常攔截器
1.3.1 登錄攔截器
一·在spring-config.xml配置中添加bean
<!-- 登陸攔截器-->
<mvc:interceptors>
<bean class="com.david.utils.interceptors.LoginInterceptor"/>
</mvc:interceptors>
二·自定義一個注解類,用來區分哪些請求方法是需要做攔截器的,哪些是不需要的。
package com.david.utils.interceptors; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 訪問注解: 在方法上加 @Access(true) 表示不做登錄攔截 * Created by Administrator on 2015/6/8. */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Access { boolean login() default false; }
三·建一個Class(類)並繼承“HandlerInterceptorAdapter”類實現其“preHandle”方法
package com.david.utils.interceptors;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session=request.getSession();
HandlerMethod handlerMethod=(HandlerMethod)handler;
Method method = handlerMethod.getMethod();
if(session.getAttribute("globalUser") == null){
if(method != null){
Access access =method.getAnnotation(Access.class);
if(access != null){
boolean login = access.login();
if(login){
return true;
}
}
}
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
return true;
}
}
注意:在搭建基礎框架時已經在spring-config.xml中配置了幾個bean,這個幾個bean是為了支持這里的攔截器的。如果沒有配置請加上以下內容,否則會啟動異常。
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/> <!--在攔截器中將handler對象強轉成HandlerMethod類型需要配置如下三個bean 否則會初始化報錯--> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"/> <ref bean="stringHttpMessageConverter"/> </list> </property> </bean>
1.3.2 異常攔截器
一·在spring-config.xml配置中添加bean
<!-- 異常攔截 -->
<bean id="exceptionResolver" class="com.david.utils.exception.ExceptionForWeb"/>
二.定義一個異常攔截的Class(類)
package com.david.utils.exception; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; import java.io.StringWriter; public class ExceptionForWeb implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); //將錯誤棧輸出到頁面中供開發查看 request.setAttribute("errorStackTrace",sw.toString()); return new ModelAndView("error"); } }
三.新建一個jsp,用來攔截異常后溫柔的顯示給用戶看
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>500頁面</title> <div class="hide error-info">${errorStackTrace}</div> <script> console.log("系統錯誤信息!"); console.log($(".error-info").html()); </script> </body> </html>
2、添加Spring對MyBatis的數據持久化操作
2.1 使用maven添加對應的jar依賴支持,配置基礎框架時已在pom添加對應的引用可以跳過次步驟
<!-- 添加mybatis依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 添加mybatis/spring整合包依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 添加mysql驅動依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-driver.version}</version>
</dependency>
<!-- 添加數據庫連接池依賴 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
2.2新建一個jdbc.properties后綴的屬性文件並配置對應的屬性key與value
#連接驅動 driverClasss=com.mysql.jdbc.Driver #數據庫鏈接地址 jdbcUrl=jdbc:mysql://192.168.3.5:3306/testDB?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull #數據庫連接賬號 username=root #數據庫連接密碼 password=newpwd #定義初始連接數 initialSize=0 #定義最大連接數 maxActive=20 #定義最大空閑 maxIdle=20 #定義最小空閑 minIdle=1 #定義最長等待時間 maxWait=60000
2.3新建一個mybatis.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: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.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 自動掃描 --> <context:component-scan base-package="com.david.action"/> <!-- 第一種方式:加載一個properties文件 value的內容就是剛剛2.2步驟新建一個jdbc.properties文件引用,如出現引用不成功請注意路徑是否正確。最好新建一個文件夾,相關配置文件放置一個文件夾下 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean> <!-- 第二種方式:加載多個properties文件 <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:common.properties</value> </list> </property> <property name="fileEncoding" value="UTF-8"/> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties"/> </bean> --> <!-- 配置數據源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverClasss}"/> <property name="url" value="${jdbcUrl}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!-- 初始化連接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 連接池最大數量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 連接池最大空閑 --> <property name="maxIdle" value="${maxIdle}"></property> <!-- 連接池最小空閑 --> <property name="minIdle" value="${minIdle}"></property> <!-- 獲取連接最大等待時間 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- mybatis和spring完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 自動掃描mapping.xml文件 value的內容就是你的dao層下的sql xml文件 --> <property name="mapperLocations" value="classpath:mapping/*.xml"></property> </bean> <!-- DAO接口所在包名,Spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.david.action.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
2.4 在項目web.xml中配置引用spring-mybatis.xml文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
框架基本上搭建完畢,后面步驟是寫三層並實現
四丶編寫三層進行數據持久化操作 手寫容易出錯並無法提高工作效率,推薦使用:mybatis generaotr工具進行生成三層
1新建一個user.class實體類
Userpackage com.david.model; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private String id; private String name; private Date termValidity; private String userType; private Integer status; private String qqNum; private String account; private String pwd; private String lineCode; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Date getTermValidity() { return termValidity; } public void setTermValidity(Date termValidity) { this.termValidity = termValidity; } public String getUserType() { return userType; } public void setUserType(String userType) { this.userType = userType == null ? null : userType.trim(); } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getQqNum() { return qqNum; } public void setQqNum(String qqNum) { this.qqNum = qqNum == null ? null : qqNum.trim(); } public String getAccount() { return account; } public void setAccount(String account) { this.account = account == null ? null : account.trim(); } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd == null ? null : pwd.trim(); } public String getLineCode() { return lineCode; } public void setLineCode(String lineCode) { this.lineCode = lineCode == null ? null : lineCode.trim(); } }
2在resources文件夾下新建一個mapping文件夾用來存放sql相關的xml。比如UserMapper.xml的sql文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.david.dao.UserDao"> <resultMap id="BaseResultMap" type="com.david.model.User" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="name" property="name" jdbcType="VARCHAR" /> <result column="term_validity" property="termValidity" jdbcType="TIMESTAMP" /> <result column="user_type" property="userType" jdbcType="VARCHAR" /> <result column="status" property="status" jdbcType="INTEGER" /> <result column="qq_num" property="qqNum" jdbcType="VARCHAR" /> <result column="account" property="account" jdbcType="VARCHAR" /> <result column="pwd" property="pwd" jdbcType="VARCHAR" /> <result column="line_code" property="lineCode" jdbcType="VARCHAR" /> </resultMap> <sql id="Base_Column_List" > id, name, term_validity, user_type, status, qq_num, account, pwd, line_code </sql> <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" > select <include refid="Base_Column_List" /> from u_user where id = #{id,jdbcType=VARCHAR} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.String" > delete from u_user where id = #{id,jdbcType=VARCHAR} </delete> <insert id="insert" parameterType="com.david.model.User" > insert into u_user (id, name, term_validity, user_type, status, qq_num, account, pwd, line_code ) values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{termValidity,jdbcType=TIMESTAMP}, #{userType,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, #{qqNum,jdbcType=VARCHAR}, #{account,jdbcType=VARCHAR}, #{pwd,jdbcType=VARCHAR}, #{lineCode,jdbcType=VARCHAR} ) </insert> <insert id="insertSelective" parameterType="com.david.model.User" > insert into u_user <trim prefix="(" suffix=")" suffixOverrides="," > <if test="id != null" > id, </if> <if test="name != null" > name, </if> <if test="termValidity != null" > term_validity, </if> <if test="userType != null" > user_type, </if> <if test="status != null" > status, </if> <if test="qqNum != null" > qq_num, </if> <if test="account != null" > account, </if> <if test="pwd != null" > pwd, </if> <if test="lineCode != null" > line_code, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=VARCHAR}, </if> <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="termValidity != null" > #{termValidity,jdbcType=TIMESTAMP}, </if> <if test="userType != null" > #{userType,jdbcType=VARCHAR}, </if> <if test="status != null" > #{status,jdbcType=INTEGER}, </if> <if test="qqNum != null" > #{qqNum,jdbcType=VARCHAR}, </if> <if test="account != null" > #{account,jdbcType=VARCHAR}, </if> <if test="pwd != null" > #{pwd,jdbcType=VARCHAR}, </if> <if test="lineCode != null" > #{lineCode,jdbcType=VARCHAR}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.david.model.User" > update u_user <set > <if test="name != null" > name = #{name,jdbcType=VARCHAR}, </if> <if test="termValidity != null" > term_validity = #{termValidity,jdbcType=TIMESTAMP}, </if> <if test="userType != null" > user_type = #{userType,jdbcType=VARCHAR}, </if> <if test="status != null" > status = #{status,jdbcType=INTEGER}, </if> <if test="qqNum != null" > qq_num = #{qqNum,jdbcType=VARCHAR}, </if> <if test="account != null" > account = #{account,jdbcType=VARCHAR}, </if> <if test="pwd != null" > pwd = #{pwd,jdbcType=VARCHAR}, </if> <if test="lineCode != null" > line_code = #{lineCode,jdbcType=VARCHAR}, </if> </set> where id = #{id,jdbcType=VARCHAR} </update> <update id="updateByPrimaryKey" parameterType="com.david.model.User" > update u_user set name = #{name,jdbcType=VARCHAR}, term_validity = #{termValidity,jdbcType=TIMESTAMP}, user_type = #{userType,jdbcType=VARCHAR}, status = #{status,jdbcType=INTEGER}, qq_num = #{qqNum,jdbcType=VARCHAR}, account = #{account,jdbcType=VARCHAR}, pwd = #{pwd,jdbcType=VARCHAR}, line_code = #{lineCode,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} </update> <select id="getUserByParm" parameterType="map" resultType="map"> SELECT <include refid="Base_Column_List"/> from u_user s where 1=1 <if test="qqNum != null"> and s.qq_num=#{qqNum} </if> <if test="account != null"> and s.account=#{account} </if> <if test="pwd != null"> and s.pwd=#{pwd} </if> <if test="status != null"> and s.status=#{status} </if> <if test="qqandaccount != null"> and( s.qq_num=#{qqandaccount} or s.account=#{qqandaccount}) </if> </select> <select id="loginUser" parameterType="map" resultType="com.david.model.User"> SELECT <include refid="Base_Column_List"/> from u_user s where 1=1 <if test="qqNum != null"> and s.qq_num=#{qqNum} </if> <if test="account != null"> and s.account=#{account} </if> <if test="pwd != null"> and s.pwd=#{pwd} </if> <if test="status != null"> and s.status=#{status} </if> <if test="qqandaccount != null"> and( s.qq_num=#{qqandaccount} or s.account=#{qqandaccount}) </if> </select> </mapper>
3新建一個server文件夾並新建 UserService接口 這里例子使用了抽象類AbstractService來實現自動生成的inser/update/select/delete等幾個默認方法.可以不繼承。
package com.david.service; import com.david.model.User; import com.david.utils.abs.AbstractService; import java.util.List; import java.util.Map; /** * Created by Administrator on 2017/11/16. */ public interface UserService extends AbstractService<User> { /** * 查詢相關用戶信息 * @param params * @return */ public List<Map<String,String>>getUserByParm(Map<String,String>params); /** * 登錄賬號 * @param params * @return */ public User loginUser(Map<String,String>params); }
4在server下新建一個imp文件夾來標識是用來實現服務層的接口並新建一個UserServiceImp類並實現接口UserService
package com.david.service.impl; import com.david.dao.LineDao; import com.david.dao.UserDao; import com.david.model.User; import com.david.service.UserService; import com.david.utils.abs.AbstractDao; import com.david.utils.abs.AbstractServiceImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * Created by Administrator on 2017/11/16. */ @Service @Transactional(rollbackFor = Exception.class) public class UserServiceImpl extends AbstractServiceImpl<User> implements UserService{ @Resource UserDao userDao; @Override protected AbstractDao<User> getAbstractDao() { return userDao; } @Override public List<Map<String,String>> getUserByParm(Map<String, String> params) { return userDao.getUserByParm(params); } @Override public User loginUser(Map<String, String> params) { return userDao.loginUser(params); } }
5新建一個dao層用來實現數據持久化UserDao
package com.david.dao; import com.david.model.User; import com.david.utils.abs.AbstractDao; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Map; /** * Created by Administrator on 2017/11/16. */ @Repository public interface UserDao extends AbstractDao<User> { /** * 查詢相關用戶信息 * @param params * @return */ public List<Map<String,String>> getUserByParm(Map<String,String> params); /** * 登錄賬號 * @param params * @return */ public User loginUser(Map<String,String>params); }
以上就是Spring+SpringMVC+MyBatis的數據持久化基本框架內容

