SSM系列6 Spring SpringMVC Mybatis 整合乾貨

前面學習了很多在SSM中要使用的東西,Mybatis,Freemarker等,今天終於到了要整合一整個可用框架的時候了
項目源碼:源碼下載
~~
這篇東西有點多,不過如果你看了前面的幾篇文章的話,這篇文章應該很簡單,沒有看也沒有關係,只要按照這篇文章裏的做絕對可以搭出來併成功運行,前提我代碼裏的註釋很重要,一定要看註釋
~~

Spring SpringMVC 整合

創建項目與整體目錄與所需文件

  • src/main下創建目錄webapp
  • webapp下創建目錄WEB-INF
  • WEB-INF下創建文件web.xml
  • WEB-INF下創建文件夾ftl,用於存放網頁靜態資源
  • resources下創建應用上下文applicationContext.xml
  • 創建java類文件夾,用於存放java類
  • 最終項目目錄結構如下
    在這裏插入圖片描述

pom.xml配置

打包方式改爲war

<packaging>war</packaging>

增加jetty插件

<build>
	<plugins>
		<!--引入jetty插件-->
		<plugin>
			<groupId>org.eclipse.jetty</groupId>
			<artifactId>jetty-maven-plugin</artifactId>
			<version>9.4.14.v20181114</version>
			<configuration>
				<!--增加配置去讀取jetty自定義配置,讓其生效-->
				<webApp>
					<!--防止無法熱部署異常,此文件180行改爲false-->
					<defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
				</webApp>
				<!--配置應用啓動後加載webapp的網頁與資源-->
				<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
				<!--設置http連接器相關屬性-->
				<httpConnector>
					<!--啓動端口,不寫默認與tomcat一致,爲8080-->
					<port>80</port>
				</httpConnector>
			</configuration>
		</plugin>
	</plugins>
</build>

導入jetty的webdefault.xml

此文件不導入的話,修改頁面後可能會報錯,此文件一般在.m2裏的如下目錄,直接複製到項目的resources下
修改其中的180行,值改爲false,如果版本不同也可能不是180行,那就找useFileMappedBuffer
在這裏插入圖片描述
光導入此文件還不行,還需要在pom.xml中進行引用纔可以,上面引入jetty插件的時候已經引用好了

增加SpringMVC配置

<dependency>
	<groupId>org.springframework</groupId>
	<!--SpringMVC 最核心的依賴-->
	<artifactId>spring-webmvc</artifactId>
	<version>5.2.4.RELEASE</version>
</dependency>

加入json序列化支持包

<!--json start-->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-core</artifactId>
	<version>2.9.8</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<!--自動與springmvc框架結合-->
	<artifactId>jackson-annotations</artifactId>
	<version>2.9.8</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<!--自動與springmvc的數據綁定-->
	<artifactId>jackson-databind</artifactId>
	<version>2.9.8</version>
</dependency>
<!--json end-->

加入Freemarker支持包

<!--Freemarker核心jar包-->
<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.28</version>
</dependency>
<!--SpringFreemarker整合第三方組件的支持包-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>5.1.6.RELEASE</version>
</dependency>

阿里雲倉庫設置

如果有下載不下來的包可以設置阿里雲倉庫,也可以不設置

<!--阿里雲中央倉庫--> 
<repositories>
	<repository>
		<id>aliyun</id>
		<name>aliyun</name>
		<!--maven.aliyun.com-->
		<url>https://maven.aliyun.com/repository/public</url>
	</repository>
</repositories>

web.xml配置

頭文件聲明

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
		http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"	
		version="3.1">
</web-app>

Servlet相關配置

<!--SpringMVC最核心的servlet:DispatcherServlet-->
<servlet>
	<servlet-name>ssm</servlet-name>
	<!--攔截請求,創建對應的Controller進行處理-->
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<!--指明DispatcherServlet初始化時加載的配置文件-->
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</init-param>
<!--啓動程序時對Servlet進行加載 0:優先級最高-->
<load-on-startup>0</load-on-startup>
</servlet>
<!--spring mvc 影射 ,啓用上面的Servlet需要作以下配置-->
<servlet-mapping>
	<servlet-name>ssm</servlet-name>
	<!-- / :攔截所有請求-->
	<url-pattern>/</url-pattern>
</servlet-mapping>

如果上面的有關Servlet的東西都設置好後,還有紅線的話,有可能是沒有引入Servlet相關包引起的,pom.xml中引入相關包

<!--攔截器所用java servlet-->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>3.1.0</version>
	<scope>compile</scope>
</dependency>

亂碼處理

<!--此項配置爲POST提交參數亂碼處理配置,使用TOMCAT時必須配置,使用jetty時無須配置,jetty自帶了亂碼配置-->
<filter>
	<filter-name>characterFilter</filter-name>
	<!--CharacterEncodeingFilter 將Post請求中的參數字符集設置爲UTF-8-->
	<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>characterFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

應用上下文相關

頭聲明

<?xml version="1.0" encoding="UTF-8" ?>
<!--
//mvc命名空間,用於對mvc進行控制和配置
xmlns:mvc="http://www.springframework.org/schema/mvc"
//引入context命名空間,用於啓用註解
xmlns:context="http://www.springframework.org/schema/context"
-->
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:mvc="http://www.springframework.org/schema/mvc"
		xmlns:context="http://www.springframework.org/schema/context"
		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.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>

啓用SpringMVC註解掃描

<!--啓用Spring註解形式掃描對象-->
<context:component-scan base-package="com.zhangyx"></context:component-scan>
<!--啓用SpringMVC的註解模式-->
<mvc:annotation-driven>
<mvc:message-converters>
<!--StirngHttpMessageConverter 用於設置文本類型http響應的設置-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
	<!--配置支持的媒體類型(MIME)-->
	<property name="supportedMediaTypes">
		<list>
			<!--響應輸出的文本被瀏覽器作爲html進行解釋,使用字符集爲UTF-8-->
			<value>text/html;charset=utf-8</value>
		</list>
	</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--將靜態資源排隊在外,用於提高執行效率【img,js,css等】-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>

FreeMarker相關

<!--freemarker配置
FreemarkerViewResolver是Spring-Context-Support提供的整合類,
在IOC容器初始化時通知SpringMVC默認使用Freemarker進行數據展現-->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
	<!--設置響應輸出並解決中文亂碼問題-->
	<property name="contentType" value="text/html;charset=utf-8"></property>
	<!--指定Freemarker文件擴展名-->
	<property name="suffix" value=".ftl"></property>
</bean>
<!--Freemarker設置類-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<!--設置模板保存目錄,後端跳轉時不用再寫這個目錄-->
	<property name="templateLoaderPath" value="/WEB-INF/ftl"></property>
	<!--模板引擎其他設置-->
	<property name="freemarkerSettings">
		<props>
			<!--設置Freemarker腳本與數據渲染時使用的字符集-->
			<prop key="defaultEncoding">UTF-8</prop>
		</props>
	</property>
</bean>

到這裏Spring與SpringMVC的框架算是搭建完成了,下面繼續Spring 與Mybatis框架

Spring 與Mybatis整合

大概四步

  • pom.xml依賴spring-jdbc、mybatis、mybatis-spring、druid
  • applicationContext.xml配置數據源
  • applicationContext.xml配置會話工廠sqlSessionFactory
  • applicationContext.xml配置MapperScannerConfigurer

<!--SM整合 start-->
<!--spring爲jdbc做的擴展組件,簡化jdbc底層操作-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<!--Mybatis核心組件-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.0</version>
</dependency>
<!--最主要的,Spring與Mybatis整合全領先Mybatis機構的這個包
springframework並沒有對mybatis進行支持-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
<!--Druid連接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.13</version>
</dependency>
<!--jdbc驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!--SM整合 end-->
<!--mybatis整合配置-數據源
Mybatis與Spring整合是指SessionFactory對象不再由我們程序自己創建
而改爲使用配置方式由SpringIOC容器創建與管理
這樣做的好處是,配置方便,並在此基礎上爲Mybatis擴展很多額外的功能
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;characterEncodeing=utf-8"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>
<!--定義sqlSessionFactory連接工廠-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--關聯數據源,value指向上面的數據源-->
    <property name="dataSource" ref="dataSource"/>
    <!--mybatis配置文件地址-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!--mapper XML文件保存目錄
    之前是在mybatis-config.xml 裏寫的 <mapper resource="goods.xml">-->
    <property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean>
<!--Spring爲Mybatis提供了一種新的開發方式“Mapper接口”
這個配置用於掃描com.zhangyx.ssm包下所有有效的Mapper接口類-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.zhangyx.ssm"/>
</bean>

resources下創建對應文件與文件夾
mappers文件夾
mybatis-config.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">
<!--頭文件以及下面的配置,都可以在官網上找到
地址:https://mybatis.org/mybatis-3/zh/getting-started.html
-->
<configuration>
</configuration>	

測試

測試時發現,這是因爲mappers文件夾是空的,下面必須有文件纔行,我這裏隨便創建了一個README.text,運行成功
在這裏插入圖片描述

@Controller
public class HelloController {
    @GetMapping("/hello")
    public ModelAndView hello(){
        ModelAndView mv = new ModelAndView("/hello");
        return mv;
    }
}

在這裏插入圖片描述
其中遇到的坑 1.driverClassName不要寫錯了 2.引入數據源dataSource時要用ref,不要用value

Mapper接口開發

mapper接口開發要素

  • Mapper.xml裏的namespace指向接口,不能隨意書寫了
  • Mapper.xml Sql方法 ID要與接口方法名一致
  • 接口方法參數會直接傳入到SQL中,多參時參數前加@Param
  • 方法返回值可以是List對象,也可以是單個對象,Mybatis會自動判斷

相應包創建

實體類包:com.zhangyx.ssm.entity-存放與數據庫對應的實體類
接口類包:com.zhangyx.ssm.mapper-存放與SQL xml 文件對應的接口類
mybatis-config.xml設置
駝峯命名轉換

<settings>
	<!--駝峯命名轉換-->
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

mapper接口類-一般命名標準ClassMapper.java

注意:看註釋,此代碼裏的註釋與下面的SQL.xml裏的註釋結合來看

public interface GoodsMapper {
	/*SQL.xml中的SQL ID 要與此方法名保持一致
	SQL.xml中的取值key也要與這裏的參數名保持一致
	*/
    Goods findById(Integer goodsId);
}

SQL.xml-跟之前有很大區別

mappers下創建goods_mapper.xml
注意:看註釋,此代碼裏的註釋與上面的mapper接口裏的註釋結合來看

<?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">

<!--spring整合了Mybatis後,此處的namespace要指向我們的接口類-->
<mapper namespace="com.zhangyx.ssm.mapper.GoodsMapper">
    <!--id:跟上面的namespace一樣,要與接口中的方法名保持一致,指向接口中的findById方法名
    參數類型也要與接口方法中的保持一致,返回數據類型一樣
    上層(service)調用時會直接調用到這裏去請求數據庫
    此xml可以看作是我們之前的dao的實現類,我是這樣理解的-->
    <select id="findById" parameterType="Integer" resultType="com.zhangyx.ssm.entity.Goods">
        select * from t_goods where goods_id = #{value }
    </select>
</mapper>

測試 service層省略

    @Resource
    private GoodsService goodsService;

    @GetMapping("/goods")
    public ModelAndView goodsInfo(){
        ModelAndView mv = new ModelAndView("/goods");
        Goods goods = goodsService.findById(739);
        mv.addObject("goods",goods);
        return mv;
    }

在這裏插入圖片描述

多參數(條件),多數據返回

多參數多條件查詢時,有兩種方式

  • 利用Map傳參
  • 利用@Param

Map 形式

sql.xml
注意parameterType,resultType

<select id="list" parameterType="java.util.Map" resultType="com.zhangyx.ssm.entity.Goods">
	select * from t_goods where category_id = #{categoryId} and current_price &lt; #{currentPrice}
</select>

mapper 接口

List<Goods> list(Map params);

controller

@GetMapping("/list")
public ModelAndView list(){
    ModelAndView mv = new ModelAndView("/list");
    /*利用Map傳參*/
    Map param = new HashMap();
    param.put("categoryId",40);
    param.put("currentPrice",800);
    List<Goods> goodsList = goodsService.list(param);
    mv.addObject("goodsList",goodsList);
    return mv;
}

@Param形式

SQL.xml不變
mapper接口如下

/*@Param("參數名"),將參數封裝到Map裏,參數名作爲Map裏的key,後面的參數值category作爲對應map的值*/
List<Goods> list(@Param("categoryId") Integer category,@Param("currentPrice") Float currentPrice);

controller類

@GetMapping("/list")
public ModelAndView list(){
    ModelAndView mv = new ModelAndView("/list");
    /*利用Map傳參*/
//        Map param = new HashMap();
//        param.put("categoryId",40);
//        param.put("currentPrice",800);
    /*直接傳*/
    List<Goods> goodsList = goodsService.list(40,800f);
    mv.addObject("goodsList",goodsList);
    return mv;
}

測試

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章