当前位置:网站首页>关于SSM整合,看这一篇就够了~(保姆级手把手教程)
关于SSM整合,看这一篇就够了~(保姆级手把手教程)
2022-06-21 16:03:00 【embelfe_segge】
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架。
目录
4.1.3 配置mapperScannerConfigurer
一、创建基于maven管理的web项目:
1.1 补全项目结构
新建项目(new–file–project–maven),输入合适的项目名称,等待项目加载完成即可,在于main同级目录下添加webapp文件夹,在webapp文件夹下添加WEB-INF文件夹,在WEB-INF文件夹下添加web.xml文件,修改pom.xml文件,添加packing标签为war,刷新,会看到webapp文件夹中有个“小蓝球”即完成
<groupId>com.xgsm</groupId>
<artifactId>Ssm-demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
1.2 添加web项目依赖、配置服务器运行环境
添加web项目依赖就是添加servlet-api和jsp两个jar包,有两种添加方式,第一种是通过project Structure—Modules添加tomcat,添加成功后会自动导入servlet-api和jsp这两个jar包,这种方式会出现一个问题是,当我们移植项目的时候由于环境不同会报错,所以不推荐;另一种是手动添加这两个jar包的依赖到pom.xml文件中,这种添加方式可移植性会更好些。
<!--添加web项目依赖(也可以导入tomcat进行添加)-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
配置服务器运行环境就是添加tomcat服务器,点击Edit Configurations可以添加本地的tomcat服务器,第一部署需要点击Fix,将项目war部署到服务器上

二、部署mybatis:
2.1 添加mybatis依赖、创建配置文件
添加mybatis依赖,lombok依赖;
<!--添加mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--添加mysql-connection-java依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!--添加lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
在ssm整合中,由于数据连接池等信息都是由spring整合配置的,所以mybatis-config.xml文件可有可无,但是不免后期项目开发中,会有其他的配置需求,所以在这里保留mybatis核心配置文件,但不进行任何配置。
<?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>
</configuration>
三、部署spring、springMvc:
3.1 添加依赖
由于所需要的依赖比较多,如果后期需要更改jar包版本,需要一个个更改,严重影响效率不方便。所以在这里我们采用统一版本配置,所需jar包有:spring-context、spring-aspects、spring-jdbc、spring-test、spring-web、spring-webmvc、json-databind
<?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.xgsm</groupId>
<artifactId>Ssm-demo01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--设置同一版本号-->
<properties>
<spring.version>5.2.13.RELEASE</spring.version>
</properties>
<!--添加spring、springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.1</version>
</dependency>
</dependencies>
</project>
3.2 创建Spring配置文件
之前我们写项目的时候可以发现spring的配置文件和springmvc配置文件可以说是“同一个”,但是现在进行ssm整合的时候,如果所有的配置文件都在一个文件里书写,会显得很杂乱,而且不便于维护,所以在进行整合的时候我们采取多配置文件的方式分开配置,具体如下:
1、spring-context.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">
<!--只配置注解声明,以及类的管理-->
<!--声明使用注解配置-->
<Context:annotation-config/>
<!--声明Spring工厂注解的扫描范围-->
<Context:component-scan base-package="com.xgsm"/>
</beans>
2、spring-mvc.xml: 进行mvc相关配置,例如:静态资源、拦截器、视图解析器、日期转换器配置等
<?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:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--声明mvc使用注解配置-->
<mvc:annotation-driven/>
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--释放静态资源-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/imgs/**" location="/imgs/"/>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<!--需要添加jstl依赖-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3、spring-mybatis.xml: 进行spring与mybatis整合的相关配置
<?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: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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
3.3 配置前端控制器
配置前端控制器,在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">
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 采取多配置文件的方式,所以要引入地址的时候使用spring-*-->
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<!--服务器启动就加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
四、整合配置:
4.1 Ioc配置:
4.1.1 配置Druid连接池
需要使用什么连接池都可以,只需要导入相关依赖就可以,如果使用C3P0添加C3P0即可,这里我使用的是Druid连接池,所以需导入Druid依赖
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.9</version>
</dependency>
创建druid.properties外部文件
druid.driver =com.mysql.jdbc.Driver
druid.url = jdbc:mysql://localhost:3306/tanke
druid.userName = root
druid.password = 990501
#初始化连接数
druid.pool.init=3
#高峰期过后,保留连接吃的个数
druid.pool.minIdle = 5
#高峰期,最大能创建连接的个数
druid.pool.MaxActive = 20
#等待的时间
durid.pool.timeout = 3000
在spring-mybatis.xml文件中进行Druid数据源的配置,配置前需要使用<Context:property-placeholder >标签引入druid.properties外部文件,值得注意的是:该标签只能使用一次。
<!-- 引入外部文件只能使用一次-->
<Context:property-placeholder location="classpath:druid.properties"/>
<!--配置数据源-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${druid.driver}"/>
<property name="url" value="${druid.url}"/>
<property name="username" value="${druid.userName}"/>
<property name="password" value="${druid.password}"/>
<property name="initialSize" value="${druid.pool.init}"/>
<property name="minIdle" value="${druid.pool.minIdle}"/>
<property name="maxActive" value="${druid.pool.MaxActive}"/>
<property name="maxWait" value="${durid.pool.timeout}"/>
</bean>
4.1.2 配置sqlsessionFactory
sqlsessionFactory相当于mybatis与数据库的连接工厂,所以在配置的时候需要注入数据源。在配置sqlsessionFactory时可以引入映射文件地址、给实体取别名、引入mybatis配置文件等。具体如下。
<!--配置sqlsessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置数据源-->
<property name="dataSource" ref="druidDataSource"/>
<!--配置mapper的路径-->
<property name="mapperLocations" value="classpath*:mappers/*Mapper.xml"/>
<!--配置需要定义别名的实体类的包-->
<property name="typeAliasesPackage" value="com.xgsm.pojo"/>
<!--配置需要mybatis的主配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
4.1.3 配置mapperScannerConfigurer
mapperScannerConfigurer由spring容器使用,所以不需要id属性,作用是加载所有Dao文件,将Dao创建成对象放到spring容器中,但Dao创建对象是通过getMapper创建的,getMapper是通过sqlsession获取的,sqlsession是通过sqlsessionFactory得到的,所以需要先将sqlsessionFactory配给mapperScannerConfigurer,具体配置如下:
<!--配置mapperScannerConfigurer-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--注入会话工厂-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--声明接口的位置-->
<property name="basePackage" value="com.xgsm.Dao"/>
</bean>
4.2 Aop配置
Aop的配置,也是在spring-mybatis.xml文件中进行的,使用spring提供的基于注解的事务管理完成Dao层操作的事务管理,需要将spring提供的事务管理切面类配置给spring容器。由于事务管理类管理事务是基于数据库的连接完成的,所以要将数据源配置给事务管理类,具体配置如下:
<!--整合aop 基于注解的事务管理策略-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
<!--声明使用注解事务管理策略-->
<tx:annotation-driven transaction-manager="transactionManager"/>
五、单元测试:
5.1 测试前准备
5.1.1 根据数据库属性创建实体类
数据库转储文件代码如下:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tanke` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `tanke`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`userid` int NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(25) NOT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*Data for the table `user` */
insert into `user`(`userid`,`username`,`password`) values (1,'admin','123456');
根据数据库属性使用lombok创建的实体类,如下:
package com.xgsm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private int userId;
private String userName;
private String passWord;
}
5.1.2 在Dao包中定义接口
本示例为登录功能的实现,根据用户姓名查询用户是否存在。将定义好的接口使用spring提供的@Component注解,将接口注入到spring容器化中,接口定义如下:
package com.xgsm.Dao;
import com.xgsm.pojo.User;
import org.springframework.stereotype.Component;
@Component
public interface UserDao {
public User QueryUser(String userName);
}
5.2 基于Service层进行测试
5.2.1 在mappers目录下创建映射文件并配置
mappers映射文件包,要在resources资源包下创建,创建好mapper映射文件后,实现查询操作以及映射。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xgsm.Dao.UserDao">
<resultMap id="userMap" type="user">
<id column="userid" property="userId"/>
<result column="username" property="userName"/>
<result column="password" property="passWord"/>
</resultMap>
<select id="QueryUser" resultMap="userMap">
SELECT userid,username,password
FROM user WHERE username =#{userName}
</select>
</mapper>
5.2.2 创建service层接口
创建Service接口,并实现Service接口,使用@Resource注解实现UserDao的自动注入
package com.xgsm.Service.ServiceImp;
import com.xgsm.Dao.UserDao;
import com.xgsm.Service.UserDaoService;
import com.xgsm.pojo.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserDaoServiceImp implements UserDaoService {
@Resource
private UserDao userDao;
public User QueryUser(String userName) {
return userDao.QueryUser(userName);
}
}
添加junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
然后使用junit实现对Dao层接口进行测试
package com.xgsm.Dao;
import com.xgsm.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context.xml","classpath:spring-mvc.xml","classpath:spring-mybatis.xml"})
public class UserDaoTest {
@Resource
private UserDao userDao;
@Test
public void queryUser() throws Exception {
User user = userDao.QueryUser("admin");
System.out.println(user);
}
}
5.2.4 测试结果
查询到username=‘admin’后打印user,如果查询不到,则打印‘null’

5.3 基于Controller层测试
5.3.1 创建jsp页面
创建index.jsp ,在页面中新建一个表单,表单中有两个输入框,分别是用户和密码。并设置提交地址,以及提交方式,具体如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="user/login" method="post">
<p>用户名<input type="text" name="userName"></p>
<p>密码<input type="text" name="passWord"></p>
<p><input type="submit" ></p>
</form>
</body>
</html>
5.3.2 创建Controller类:
在Controller类中实现对serviceImp的调用,在前端向后端传递参数的时候,如果方法中参数与前端表单中的“name”属性值相同,则可以省略@RequestParam注解,最后并将查询到的user对象使用Model对值进行传递到success.jsp页面,具体代码如下;
package com.xgsm.Controllers;
import com.xgsm.Service.UserDaoService;
import com.xgsm.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private UserDaoService userDaoService;
@RequestMapping("/login")
public String userLogin( String userName, Model model) {
User user = userDaoService.QueryUser(userName);
System.out.println(user);
model.addAttribute("user",user);
return "success";
}
}
5.3.3 基于tomcat服务器测试
SSM-Controller测试
边栏推荐
猜你喜欢

【mysql学习笔记19】多表查询

QT knowledge: using the qgraphicspixmapitem class

exness:美国通货膨胀影响太大,美联储大佬纷纷表态

牛客网:验证IP地址

PowerPoint 教程,如何在 PowerPoint 中更改页面方向、幻灯片大小?

使用PicGo-Core 和 阿里云 实现typora图片自动上传

Nanjing University static program analyses -- Introduction learning notes

Previous installation records

智能制造的下一站:云原生+边缘计算双轮驱动

Exness: the impact of inflation in the United States is too great, and the leaders of the Federal Reserve have expressed their position one after another
随机推荐
Hairui technology completed the pre-A round of financing of tens of millions of yuan to build the first artificial intelligent distribution Internet of things in China
Set up your own website (11)
导数常用公式__不定积分常用公式
Still using xshell? Try this cool SSH terminal tool, which is very powerful!
NLog自定义Target之MQTT
[issue 349] Interviewer: how to gracefully customize the ThreadPoolExecutor thread pool?
Vector data download for mainland and global epidemic data, based on geo JSON to SHP
Pytest-- generate test report
集成底座方案演示说明
Notice on the third national operation research / data, model and decision-making course teaching seminar in 2022
Generating test reports using the unittest framework
Readjustment of move protocol beta to expand the total prize pool
Yaml data driven demo
How to open an account for futures agricultural products? How much is the handling charge?
[SQLite] résoudre le jeton non enregistré: ''
4. construction [LR (1) analysis table (including construction project specification family)]
Week 13 summary blog (week 15 of the school calendar) dynamic planning summary
Niuke.com: large number addition
gp中的decode函数实现
【1108. IP 地址无效化】