從無到有整合SpringMVC-MyBatis專案(3):整合SpringMVC+Mybatis
本篇部落格來講解如何整合SSM(SpringMVC+Spring+Mybatis),程式碼已上傳至GIT在正式整合之前,有幾個概念需要提前瞭解下:
1、Spring框架,也有人稱呼為容器框架,程式設計領域的容器指的是有一種或多種手段將第三方框架、元件等納入到容器中,進行生命週期等的管理,從而使得我們可以在容器中直接通過某個類來使用或操作某個組成或功能,不需要在單獨使用對應框架API;
2、Mybatis框架有三個需要注意的地方,所以如何正確地處理這三點是整合的重點:
- mybatis-config.xml:mybatis的配置檔案,裡面包含框架的配置屬性、型別處理、外掛、資料來源等資訊,在整合SpringMVC時,如有必要,可以執行該檔案位置
- Mapper介面:由於java是面向介面的程式設計,所有我們在實際使用中,需要有一些java介面檔案來直接使用Mybatis提供的功能;
- *Mapper.xml:在這裡面直接定義了具體的sql,不解釋;
下面開始整合:
1、首先展示下專案結構目錄,請大家一定按照這個結構進行構建,否則能產生因為路徑不一致而報錯,程式不是智慧地,只有正確地指定,程式才可能正確地執行出結果,謹記!
2、修改pom.xml檔案依賴,本次需要引入如下依賴,引入完成後具體pom.xml內容如下:
- 引入spring-jdbc依賴,用以提供事務管理器
- 引入mysql的驅動jar依賴,用以提供連線mysql資料庫
- 引入阿里巴巴的德魯伊資料來源依賴,使用德魯伊資料來源
- 引入mybatis-spring依賴,用以整合springmvc和mybatis的關鍵依賴
- 引入mybatis框架依賴,用以使用mybatis框架
- 引入lombok依賴,用以簡化實體類中構造方法、Seter/Getter方法等
- 引入切面jar包依賴,對spring-aop提供支援
<?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dongnao</groupId> <artifactId>SpringMVC-Sample</artifactId> <version>1.0.0</version> <packaging>war</packaging> <name>SpringMVC-Sample</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- 引入SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <!-- 引入Spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <!-- 引入mybatis-spring,整合ssm的核心檔案 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!-- 引入mybatis框架 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- 引入mysql驅動器 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- 引入德魯伊資料來源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.8</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency> <!-- 引入切面依賴 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <!-- 引入Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- 引入JSP --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!-- 引入JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>
3、開啟mysql資料庫,找到預設提供的test庫,新建一個簡單的user表,內容如下:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(36) DEFAULT NULL,
`mobile` char(11) DEFAULT NULL,
`email` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '張三', '17712345678', '[email protected]');
4、接下來在com.dongnao.entity包下面建立User實體類,在com.dongnao.dao包下面建立UserMapper,在resources/mappers目錄下建立UserMapper.xml,三個檔案內容由於比較簡單,如下:
package com.dongnao.entity;
import lombok.Data;
import java.io.Serializable;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:46
**/
@Data
public class User implements Serializable {
private Integer id;
private String name;
private String mobile;
private String email;
}
package com.dongnao.dao;
import com.dongnao.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
User getById(Integer id);
}
<?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.dongnao.dao.UserMapper">
<select id="getById" resultType="com.dongnao.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
5、新增一個com.dongnao.controller.UserController,com.dongnao.service.UserService,內容如下,不解釋:
package com.dongnao.controller;
import com.dongnao.entity.User;
import com.dongnao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.servlet.ModelAndView;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:51
**/
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public ModelAndView getUser(@PathVariable("id") Integer id){
// 獲取使用者資訊
User user = userService.getUserById(id);
ModelAndView mv = new ModelAndView("userDetail");
mv.addObject("user",user);
return mv;
}
}
package com.dongnao.service;
import com.dongnao.dao.UserMapper;
import com.dongnao.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:51
**/
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Integer userId){
return userMapper.getById(userId);
}
}
6、在resources目錄下,增加一個mybatis-config.xml檔案,這個檔案為mybatis的配置檔案,學過mybatis的肯定都會有印象,特別說明的是在通spring整合時,這個檔案有無都沒有什麼影響,並不是mybatis不需要配置了,而是我們可以直接在下面用到的SqlSessionFactoryBean中直接通過注入的方式進行屬性配置,我之所以保留它的原因在於相比於前者,它讀起來直觀,當然也是為了演示,具體內容如下,裡面的屬性值大家可以查閱官方配置資料自行學習:
<?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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
</configuration>
7、接下來進行至關重要的下面四個檔案的配置如下:
web.xml的作用不用說了,這裡解釋下另外三個檔案的作用:
- SpringMVC-servlet.xml:controller配置檔案,該檔案的主要作用是配置Controller來接收請求、將邏輯檢視轉換為物理檢視、處理靜態資源;
- applicationContext.xml:業務類配置檔案,掃描業務類,開啟aop支援等業務相關配置;
- applicationContext-mybatis.xml:DB相關配置檔案,配置資料來源、整合mybatis、配置事務等所有涉及DB層面的配置都在此配置檔案中;
後期如果使用快取啦、訊息服務、第三方外掛等,都可按照這個格式自行擴充套件,好了,上內容:
SpringMVC-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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 配置自動掃描controller包下面帶有@Controller註解的類 -->
<context:component-scan base-package="com.dongnao.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 開啟MVC註解驅動,請求分發必須 -->
<mvc:annotation-driven />
<!-- 配置靜態資源處理 -->
<mvc:resources mapping="/static/**" location="/resources/" />
<!-- 配置檢視解析器 將邏輯檢視名對映為物理檢視名 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value="/WEB-INF/views/"></property>
<property name = "suffix" value = ".jsp"></property>
</bean>
</beans>
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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 掃描業務程式碼 -->
<context:component-scan base-package="com.dongnao">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service"></context:include-filter>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
<!-- 開啟aop支援 -->
<aop:aspectj-autoproxy />
</beans>
applicationContext-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:mvc="http://www.springframework.org/schema/mvc"
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-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 引入外部的資料來源配置屬性 -->
<context:property-placeholder location="classpath:datasource.properties"/>
<!-- 配置Druid資料來源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${database.driverClass}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
<property name="validationQuery" value="SELECT 1" /> <!-- 驗證連線是否成功, SQL SELECT 指令至少要返回一行 (測試/驗證連線池連線的SQL語句也因資料庫而異)-->
<property name="testOnBorrow" value="false" /> <!-- 申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能。 -->
<property name="testOnReturn" value="false" /> <!-- 歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能 -->
<property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<!-- 建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。 -->
<property name="testWhileIdle" value="true" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="maxOpenPreparedStatements" value="20" /><!-- 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。 -->
<!-- 是否快取preparedStatement,也就是PSCache。PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。在mysql5.5以下的版本中沒有PSCache功能,建議關閉掉。5.5及以上版本有PSCache,建議開啟。 -->
<property name="poolPreparedStatements" value="true" />
<!-- 指定每個PSCache連線上PSCache的大小 -->
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置監控統計攔截的filters 去掉後監控介面sql無法統計
開啟web監控、開啟sql防火牆 -->
<property name="filters" value="stat,wall"></property>
</bean>
<!-- 在整合時,SqlSessionFactoryBean提供了mybatis框架中SqlSessionFactory的功能 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 為mybatis提供資料來源,無需在mybatis-config檔案中指定 -->
<property name="dataSource" ref="dataSource" />
<!-- 引入mybatis配置檔案,所有關於mybatis屬性配置的內容都可以在該檔案中配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 引入*Mapper.xml的掃描,配置此屬性後,Spring框架自動載入掃描匹配以下路徑的所有Mapper.xml檔案 -->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml" />
</bean>
<!-- 同mybatis中的SqlSession同等作用,用的時候直接注入即可 ,如果專案裡面不需要,可不寫,此處註釋掉
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>-->
<!-- 用來掃描com.dongnao.dao包下面,所有被@Repository所修飾的Mapper介面 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dongnao.dao" />
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 開啟事務註解驅動 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 建立事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
在上面配置檔案中,引入了一個resources/datasource.properties檔案,內容如下:
database.driverClass=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
database.username=root
database.password=root
8、在WEB-INF/views資料夾下面新建userDetail.jsp檔案,內容如下,請忽略樣式^_^
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>使用者詳情</title>
</head>
<body>
使用者姓名:${user.name}<br />
手機號碼:${user.mobile}<br />
使用者郵箱:${user.email}
</body>
</html>
本次配置,用到的各種依賴都屬於比較新,可以直接在專案中使用,配置並不難,關鍵在於怎麼去理解配置過程中的衝突點,只有理解了這個衝突點,才能更輕鬆的配置出來!