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