進行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是為了提高開發效率和代碼可維護性。SSM是一套非常流行的Java Web開發框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自發揮優勢,形成了一個完整的開發框架。 ...
引言
- 進行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是為了提高開發效率和代碼可維護性。SSM是一套非常流行的Java Web開發框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自發揮優勢,形成了一個完整的開發框架。
- 首先,使用Spring框架可以實現組件的解耦和依賴註入,通過配置文件進行Bean的管理和控制反轉(IoC),從而提供了良好的擴展性和靈活性。Spring提供了事務管理、AOP(面向切麵編程)等功能,使得開發者可以更加方便地進行業務邏輯的編寫和管理。
- 其次,SpringMVC框架是一種基於MVC(Model-View-Controller)模式的Web框架,它通過DispatcherServlet來統一管理請求和響應。SpringMVC提供了請求處理的註解方式,可以簡化開發流程,同時具備良好的可擴展性和靈活性。開發者可以通過配置文件進行路由、參數綁定、數據校驗等操作,從而編寫出結構清晰、易於維護的代碼。
- 最後,MyBatis是一款優秀的持久層框架,它通過XML文件或註解來實現資料庫操作的映射,具有簡單易用、性能高效等特點。MyBatis提供了豐富的CRUD(增刪改查)操作和事務管理功能,開發者可以靈活地編寫資料庫相關的代碼。
綜上所述,SSM集成可以充分發揮各個框架的優勢,提供了一種高效、靈活、易於維護的開發方式,使得Java Web開發更加方便和高效。通過SSM的集成,開發者可以快速搭建起一個穩定可靠的Web應用,並且在後續的開發和維護過程中,能夠更加方便地處理業務需求和資料庫操作。
創建資料庫表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
`gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
在IEDA中創建Maven Web項目
選擇File ---> New ---> Project
選擇Maven模板
填寫項目的基本信息 ---> Next
配置自己的Maven環境 ---> Finish
修改pom.xml配置,添加Maven依賴
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.3.6</spring.version>
</properties>
<dependencies>
<!-- 添加springmvc依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<!-- JSTL 依賴包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--數據校驗依賴包-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
<!--文件上傳依賴包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- 添加jackson配置 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.4</version>
</dependency>
<!-- MyBatis依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 資料庫驅動依賴(根據你使用的資料庫選擇) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 日誌整合 slf4j門面設計模式與 log4j或log4j2一起使用-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 日誌-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
創建IoC 容器 springmvc.xml文件
在src/main/resources文件夾下創建 springmvc.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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--開啟SpringMVC註解驅動-->
<mvc:annotation-driven />
<!-- springmvc容器(也就是一個spring容器)會掃描指定包中的組件,將其註冊到springmvc容器中 -->
<context:component-scan base-package="com.qrj"/>
<!-- 配置允許訪問靜態資源 -->
<mvc:default-servlet-handler />
<!-- 配置全局 CORS -->
<mvc:cors>
<mvc:mapping path="/**" />
</mvc:cors>
</beans>
創建資料庫配置文件database.properties
在src/main/resources文件夾下創建database.properties文件
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/spring_mybatis?useSSL=false
db.username=root
db.password=123456
創建Spring IoC容器spring-config.xml文件
在src/main/resources文件夾下創建spring-config.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:mybatis="http://mybatis.org/schema/mybatis-spring"
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://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<!-- 自動掃描註解 -->
<context:component-scan base-package="com.qrj"/>
<!-- 引入資料庫配置文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 配置數據源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<!-- MyBatis 掃描 mapper -->
<mybatis:scan base-package="com.qrj.dao"/>
<!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--設置entity實體類路徑-->
<property name="typeAliasesPackage" value="com.qrj.entity" />
<!--設置mapper映射文件路徑-->
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>
</beans>
創建logback.xml日誌配置文件
在src/main/resources文件夾下創建logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="F:\\logback.log" />
<!--日誌輸出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 日誌輸出到文件 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!-- 根日誌輸出級別-->
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- 指定包日誌輸出級別-->
<logger name="com.qrj.util" level="info" />
</configuration>
修改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">
<!-- 配置Spring容器載入配置文件路徑 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
<!-- 監聽器(spring文件相關的監聽器)-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation 用來指定springmvc配置文件的位置,文件名稱不一定要叫springmvc,大家可以隨意起名 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- load-on-startup:表示web容器啟動的時,當前對象創建的順序,值越小初始化越早,大於等於0 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 設置 CharacterEncodingFilter 過濾器,這個類會對request和response設置字元集編碼,解決中文亂碼問題(優先順序最高) -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
創建UserEntity實體類
在src/main/java目錄下創建com.qrj.entity包,在包下麵創建UserEntity實體類。
package com.qrj.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: qrj
* @description 用戶實體類
* @Date: 2023/9/19 14:51
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
private Integer id;
private String name;
private Integer age;
private String gender;
}
創建UserDto參數類
在src/main/java目錄下創建com.qrj.dto包,在包下麵創建UserDto參數類。
package com.qrj.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author: qrj
* @description 用戶參數
* @Date: 2023/9/19 14:52
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
private Integer id;
private String name;
private Integer age;
private String gender;
}
創建UserMapper介面
在src/main/java目錄下創建com.qrj.dao包,在包下麵創建UserMapper介面。
package com.qrj.dao;
import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import java.util.List;
/**
* @author: qrj
* @description 用戶映射介面
* @Date: 2023/9/19 14:52
*/
public interface UserMapper {
void insert(UserDto user);
List<UserEntity> getList();
}
創建UserMapper.xml映射文件
註意這裡創建的UserMapper映射文件要和之前創建的UserMapper介面文件相對應。
在src/main/resources文件夾下創建mapper文件夾,併在mapper文件夾下創建UserMapper.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.qrj.dao.UserMapper">
<insert id="insert" parameterType="com.qrj.entity.UserEntity" keyProperty="id" useGeneratedKeys="true">
INSERT INTO USER ( name, age, gender )
VALUE
( #{name}, #{age} , #{gender} )
</insert>
<select id="getList" resultType="com.qrj.entity.UserEntity">
SELECT
*
FROM
USER;
</select>
</mapper>
創建ResultVo工具類
在src/main/java目錄下創建com.qrj.vo包,在包下麵創建ResultVo工具類。
package com.qrj.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @author: qrj
* @description Ajax 請求統一響應工具類
* @Date: 2023/9/19 14:58
*/
@Data
public class ResultVo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//狀態碼
private int code;
//狀態碼描述
private String message;
//數據結果,泛型,可以是列表、單個對象、數字、布爾值等
private T data;
public ResultVo() {
}
public ResultVo(int code, String message) {
this.code = code;
this.message = message;
}
public static <T> ResultVo<T> success(T data) {
ResultVo<T> resultVo = new ResultVo<>();
resultVo.setCode(200);
resultVo.setMessage("ok");
resultVo.setData(data);
return resultVo;
}
}
創建IUserService介面和UserServiceImpl實現類
在src/main/java目錄下創建com.qrj.service包,在包中創建IUserService介面
package com.qrj.service;
import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import java.util.List;
/**
* @author: qrj
* @description 用戶業務介面
* @Date: 2023/9/19 14:54
*/
public interface IUserService {
UserEntity insert(UserDto user);
List<UserEntity> getList();
}
在com.qrj.service包下創建Impl包,並創建UserServiceImpl實現類
package com.qrj.service.Impl;
import com.qrj.dao.UserMapper;
import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import com.qrj.service.IUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: qrj
* @description 用戶業務實現類
* @Date: 2023/9/19 14:57
*/
@Service //控制反轉
public class UserServiceImpl implements IUserService {
@Resource //依賴註入
private UserMapper userMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public UserEntity insert(UserDto user) {
userMapper.insert(user);
UserEntity userEntity = new UserEntity();
//BeanUtils用於拷貝對象 參數1:被拷貝的對象 參數2:拷貝對象
BeanUtils.copyProperties(user,userEntity);
return userEntity;
}
@Transactional
@Override
public List<UserEntity> getList() {
List<UserEntity> list = userMapper.getList();
return list;
}
}
創建UserController頁面控制器
在src/main/java目錄下創建com.qrj.controller包,在包下麵創建UserController頁面控制器。
package com.qrj.controller;
import com.qrj.dto.UserDto;
import com.qrj.entity.UserEntity;
import com.qrj.service.IUserService;
import com.qrj.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: qrj
* @description 用戶頁面控制器
* @Date: 2023/9/19 14:53
*/
@RestController
@Slf4j //lombok提供的日誌註解
public class UserController {
@Resource //使用 @Autowired註解 IDEA不推薦
private IUserService userService;
@PostMapping("/user")
public ResultVo<UserEntity> addUser(@RequestBody UserDto userDto) {
log.debug(userDto.toString()); //列印調試日誌(接收參數)
UserEntity result = userService.insert(userDto);
log.debug(result.toString()); //列印調試日誌(響應數據)
return ResultVo.success(result);
}
@GetMapping("/users")
public ResultVo<List<UserEntity>> getUsers() {
List<UserEntity> list = userService.getList();
return ResultVo.success(list);
}
}
啟動Tomcat,在Postman下進行介面測試
通過Restful API介面("/user")測試添加用戶功能實現
通過Restful API介面("/users")測試查找所有用戶功能實現
以上功能測試完成,至此SSM框架集成成功!