SSM框架整合,即Spring---SpringMVC---MyBatis 三個框架整合,在整合框架之前,首先,你得對三個框架都有基礎的瞭解。
Spring
Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。我們可以將創建對象的權限交給IoC,IoC將自動對我們需要的對象進行裝配和初始化。
MyBatis
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis主要工作在Dao層,用於連接數據庫。
SpringMVC
Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊,SpringMVC是廣義的Spring下的一個框架。SpringMVC主要用於Servlet層(Controller層)。
整合原理:
SSM整合,其實就是將MyBatis的管理權交給Spring,然後在Spring中嵌套SpringMVC。由於Spring和SpringMVC都是同一個公司下的框架,因此不存在整合的道理,採用嵌套。整個整合的過程中,Spring是最大的管理者。
首先是 Spring整合MyBatis:在以往的純MyBatis項目中,我們是通過MyBatis創建一個SqlSessionFactory,然後通過SqlSessionFactory創建一個SqlSession,通過SqlSession加載映射的接口文件創建一個StudentMapper對象,然後再進行對學生信息的增刪改查。思路如下:
SqlSessionFactory ---> SqlSession ---> StudentMapper ---> CRUD
所以最重要的就是SqlSessionFactory,Spring整合MyBatis其實就是將MyBatis的SqlSessionFactory交給Spring管理。
其次是Spring嵌套SpringMVC: 在Spring中嵌套SpringMVC,就是在原有基礎上加上web文件,並配置web.xml和dispatcher-servlet.xml文件。
實現步驟:
一,需要的架包:
除了基礎的Spring、SpringMVC、MyBatis架包之外,還需要整合架包。如下:
- mybatis-spring.jar
- commons-logging.jar
- commons-dbcp.jar
- mysql-connector-bin.jar
- log4j.jar
- commons-pool.jar
其中最後一個架包尤其注意,很多情況下tomcat啓動不了就是因爲下載了commons-pool2.jar,因此要尤其注意,能選擇2.x版本的架包。爲了方便我用idea創建一個SpringMVC項目。
我們就不必導入spring和springMVC的包,idea會自動給我們下載好。我們只需要加入MyBatis和整合包即可。
二,配置tomcat,創建Student表、Student類以及映射文件
項目的路徑結構如圖所示:
src下面分了四層,分別爲:
controller層:功能上和之前的servlet層一樣,主要負責和jsp前段頁面交互信息。
entity層:存放POJOs類。
mapper層:存放映射文件和接口文件。
service層:向上和controller層交互信息,向下和mapper層交互信息。
web目錄下有一下文件:
1,WEB-INF下面存放的是配置文件。
2,view下面存放的是響應文件。
3,web文件夾下面的文件。
package com.krt.entity;
public class Student {
private int id;
private String name;
private int age;
public Student() {
}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{ id="+id+", name='"+name+"', age="+age+"}";
}
}
我只定義一個查詢語句,StudentMapper.xml文件代碼如下:
<?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.krt.mapper.StudentMapper">
<!--查詢學生-->
<select id="selectStu" resultType="com.krt.entity.Student" parameterType="int">
select * from student where id = #{id}
</select>
</mapper>
相應的StudentMapper接口映射文件代碼如下:
package com.krt.mapper;
import com.krt.entity.Student;
public interface StudentMapper {
Student selectStu(int id);
}
三,Spring整合MyBatis
1,首先建立一個applicationContext.xml文件用於整合MyBatis
<!--配置數據庫信息,替代mybatis的配置文件conf.xml-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
該代碼用於配置數據庫信息,將MyBatis連接數據庫的信息,放在bean中。
<!--加載db.properties文件-->
<bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<array>
<value>db.properties</value>
</array>
</property>
</bean>
該代碼用於將外部的db.properties文件導入
db.properties文件代碼如下:
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username = root
jdbc.password = root
<!--配置MyBatis需要的核心類,SqlSessionFactory-->
<!--在SpringIoc容器中創建MyBatis的核心類SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--加載mapper.xml路徑-->
<property name="mapperLocations" value="classpath:com/krt/mapper/*.xml" />
</bean>
該代碼用於在Spring容器中創建SqlSessionFactory bean,將MyBatis的SqlSessionFactory控制權交給Spring。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!--指定批量產生哪個包中的mapper對象-->
<property name="basePackage" value="com.krt.mapper" />
<!--
basePackage所在的property的作用
將com.krt.mapper包中,所有的接口產生與之對應的動態代理對象
(對象名就是首字母小寫的接口名)
-->
</bean>
該代碼的作用是將SQL語句的映射文件加載到SqlSessionFactory中。
完整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:context="http://www.springframework.org/schema/context"
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">
<!--依賴注入:給service注入dao-->
<bean id="selectService" class="com.krt.service.Impl.SelectService">
<property name="studentMapper" ref="studentMapper" />
</bean>
<!--給controller注入service-->
<!--<bean id="studenthandler" class="com.krt.controller.Studenthandler">
<property name="selectService" ref="selectService" />
</bean>-->
<!--MyBatis的配置信息(數據源,mapper.xml)控制權交給spring-->
<!--加載db.properties文件-->
<bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<array>
<value>db.properties</value>
</array>
</property>
</bean>
<!--配置數據庫信息,替代mybatis的配置文件conf.xml-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--<context:property-placeholder location="WEB-INF/db.properties"/>-->
<!--配置MyBatis需要的核心類,SqlSessionFactory-->
<!--在SpringIoc容器中創建MyBatis的核心類SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--加載mapper.xml路徑-->
<property name="mapperLocations" value="classpath:com/krt/mapper/*.xml" />
</bean>
<!--將MyBatis的SqlSessionFactory交給Spring-->
<!--Spring整合MyBatis -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!--指定批量產生哪個包中的mapper對象-->
<property name="basePackage" value="com.krt.mapper" />
<!--
basePackage所在的property的作用
將com.krt.mapper包中,所有的接口產生與之對應的動態代理對象
(對象名就是首字母小寫的接口名)
-->
</bean>
</beans>
然後,我們應該將整合後的Sping放入web.xml文件中,
<!--Web項目中引入整合後的spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
至此,Spring整合MyBatis就整合好了,然後就是Spring嵌套SpringMVC。
四,配置SpringMVC文件:
首先配置web.xml文件,將所有的頁面請求,全部發送給DispatcherServlet處理。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_4_0.xsd"
version="4.0">
<!--Web項目中引入整合後的spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--監聽器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--攔截器-->
<!--攔截所有請求,將所有請求交給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>
<!--歡迎頁-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
其次是配置SpringMVC的配置文件,主要就是配置視圖解析器和掃描註解。
diapatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc"
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">
<!--掃描有註解的包文件-->
<context:component-scan base-package="com.krt.controller"/>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/" />
<property name="suffix" value=".jsp" />
</bean>
<!--SpringMVC基礎配置-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
五,實例驗證:
我們寫一個login.jsp用於發出請求,寫一個a標籤。
login.jsp代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SSM整合</title>
</head>
<body>
<a href="selectStudent">---SSM整合---</a>
</body>
</html>
jsp頁面將請求發送給controller層,因此,我們在controller建一個文件接收請求
Studenthandler.java代碼如下:
package com.krt.controller;
import com.krt.entity.Student;
import com.krt.service.Impl.SelectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
public class Studenthandler {
//控制器依賴於service
@Autowired
@Qualifier("selectService")
private SelectService selectService;
public void setSelectService(SelectService selectService) {
this.selectService = selectService;
}
@RequestMapping("selectStudent")
public String selectStudent(Map<String, Object> map){
Student s= selectService.selectStudent(3);
//該map會將數據放入request的作用域中,一共後面調用。
map.put("student", s);
return "result";
}
}
a標籤發出的請求將會被selectStudent方法攔截,
至此,我們的controller層(servlet)寫好了,mapper層(dao)也寫好了,entity層也寫好了,還差一下service層。
然後,我們創建service層,新建一個接口selectStudent,規範繼承類的結構:
代碼如下:
package com.krt.service;
import com.krt.entity.Student;
public interface SelectStudent {
Student selectStudent(int id);
}
其次,我們在service層新建文件夾Impl,用於存放接口的實現類。SelectService.java代碼如下:
package com.krt.service.Impl;
import com.krt.entity.Student;
import com.krt.mapper.StudentMapper;
import com.krt.service.SelectStudent;
public class SelectService implements SelectStudent {
//service依賴於dao(mapper)
private StudentMapper studentMapper;
public void setStudentMapper(StudentMapper studentMapper) {
this.studentMapper = studentMapper;
}
@Override
public Student selectStudent(int id) {
Student s = studentMapper.selectStu(id);
return s;
}
}
我們可以在applicationContext.xml中加入一個bean,這樣我們就不需要初始化studentMapper變量,Spring會給我們自動注入。
<!--依賴注入:給service注入dao-->
<bean id="selectService" class="com.krt.service.Impl.SelectService">
<property name="studentMapper" ref="studentMapper" />
</bean>
這和controller層中的Studenthandler.java中的 @Autowired 註解的功能是一樣,只是,加上該註解,Spring會給我們自動去獲取和該類下面的變量名相同的id的bean,給我們注入。
最後我們創建result.jsp文件
<%--
Created by IntelliJ IDEA.
User: krt
Date: 2019/3/19
Time: 12:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${student.id}--
${student.name} --
${student.age} --
</body>
</html>
該文件用到了C標籤,需要導入C標籤的架包:
然後,我們啓動tomcat,
SSM項目就搭建好了。
參看這篇博客在測試的過程中,總會遇到各種問題:
要靜下心,耐住性
--------致程序員