ssm(spring + spring-mvc + mybatis)整合
思路
ssm => spring + spring-mvc + mybatis
其实就是先用spring 代理mybatis对象,然后spring-mvc在整合上面的,这里给出一个小案例,基本上能将大部分内容穿起来,分几个阶段
- 配置mybatis
- 添加spring配置
- 添加spring-mvc配置
1,建库建表
2,基本环境搭建 (搭建mybatis环境)
先创建一个maven的web环境
2.1,pom.xml
<?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>org.example</groupId>
<artifactId>spring001</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 创建web环境 -->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--
MySQL Jar包;
mysql-connector-java
Druid相关Jar包;
druid
MyBatis相关Jar包;
mybatis
mybatis-spring
Spring相关Jar包;
spring-context
spring-test
spring-jdbc
spring-tx
SpringMVC相关Jar包;
spring-web
spring-webmvc
javax.servlet-api
javax.servlet.jsp-api 11111
MyBatis分页插件相关Jar包;
JSON处理相关Jar包;
jackson-core
jackson-databind
jackson-annotations
JSTL相关Jar包。
jstl
其他
junit
commons-logging
slf4j-log4j12
log4j
-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
<!-- 配置java目录下的xml文件为资源文件,让Maven能够识别,从而进行编译-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
2.2 创建包结构
com.edu.user.bean
: 用来存放实体类com.edu.user.mapper
:用来存放mapper接口及接口映射文件 -> dao层com.edu.user.service
:用来存放Service层相关类(com.edu.user.controller
:用来存放SpringMVC中的控制器;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A0I9NVf1-1634195043515)(asset/img/06_ssm/image-20211013215350084.png)]
2.3,创建 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_mybatis?useSSL=false&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
2.4,创建 log4j.properties
#
# Hibernate, Relational Persistence for Idiomatic Java
#
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
#
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
2.5,创建 mybatis-config.xml
使用spring的方式创建
<?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:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据园 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置sqlSessionFactoryBean
配置数据源
配置别名
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.edu.*.bean"/>
</bean>
<!-- 配置包扫描(加载映射文件)-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--
basePackage 属性是让你为 映射器接口文件 设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。
注意:
1、接口与映射文件一定要同名
2、接口与映射文件一定要放在"value=" 其中之一的所在目录下(不一定同一个包下 )
-->
<property name="basePackage" value="com.edu.*.mapper"/>
</bean>
</beans>
2.6,创建 applicationContext.xml
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 导入配置文件 -->
<import resource="classpath:mybatis-config.xml"/>
</beans>
2.7,测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BktRj4RE-1634195043518)(asset/img/06_ssm/image-20211014115504243.png)]
2.7.1 创建实体类
package com.edu.user.bean;
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
private String password;
}
2.7.2 创建接口和映射文件
package com.edu.user.mapper;
import com.edu.user.bean.User;
import java.util.List;
public interface UserMapper {
List<User> all();
}
<?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.edu.user.mapper.UserMapper">
<select id="all" resultType="com.edu.user.bean.User">
select * from user
</select>
</mapper>
2.7.3 创建测试类
第一种测试类写法
public class MyTest1 {
// mybatis常规使用 -> 测试mapper接口
@Test
public void mybatis1() throws IOException {
// 这两行代码的作用是获取Spring IOC容器,如果不写的话,直接会提示空指针异常。对于测试不友好。所以我们一般使用第二种方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
SqlSessionFactory sqlSessionFactory =(SqlSessionFactory) context.getBean("sqlSessionFactory");
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.all();
all.forEach(v -> System.out.println("\033[1;34m" + v + "\033[1;34m \n"));
}
}
第二种测试类写法 -> 注入方式 以后都使用这种方式
/*
@RunWith 就是一个运行器
@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
使用@ContextConfiguration或@SpringJUnitConfig指定配置文件或配置类
*/
@RunWith(SpringJUnit4ClassRunner.class)
//@SpringJUnitConfig(locations = "classpath:applicationContext.xml")
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class MyTest {
@Autowired
private SqlSessionFactory sqlSessionFactory;
/*
使用注入的方法 注意导入相关的jar包
1,使用@Runwith替换原来的运行时
2,使用@ContextConfiguration或@SpringJUnitConfig指定配置文件或配置类
3,使用@Autowired注入需要测试的对象 => (SqlSessionFactory) context.getBean("sqlSessionFactory");
* */
@Test
public void mybatis2() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.all();
all.forEach(v -> System.out.println("\033[1;34m" + v + "\033[1;34m \n"));
}
}
3,将spring配置整合到mybatis
3.1,添加 applicationContext.xml 配置
applicationContext.xml 中添加配置,至此 spring 已经配置完成
<!-- 配置包扫描 -->
<!-- 这个文件中beans根节点下只有一个context:component-scan节点,此节点有两个属性base-package属性告诉spring要扫描的包,多个包逗号隔开。-->
<!-- use-default-filters=”false”表示不要使用默认的过滤器,此处的默认过滤器,会扫描包含@Service,@Component,@Repository,@Controller注解修饰的类,并注册成bean-->
<!--
@Component 使用在类上用于实例化Bean
@Repository 使用在Dao层类上用于实例化Bean
@Service 使用在Service层类上用于实例化Bean
@Controller 使用在Web层类上用于实例化Bean
-->
<!-- 在注解后加上例如@Component(value=”abc”)时,注册的这个类的bean的id就是adc.-->
<context:component-scan base-package="com.edu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<!-- 排除扫描controoler 因为springmvc会扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
3.2,测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvuM96oy-1634195043521)(asset/img/06_ssm/image-20211014142703478.png)]
3.2.1,创建service层类和接口
package com.edu.user.service;
public interface UserService {
List<User> all();
}
package com.edu.user.service.impl;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> all() {
return userMapper.all();
}
}
3.2.2,添加测试类方法
在 2.7.3 第二种方法的基础上进行测试
@Autowired
private UserService userService;
@Test
public void test2() {
List<User> all = userService.all();
System.out.println("\033[1;34m" + all + "\033[1;34m \n");
}
至此,spring配置完成
4,spring-mvc整合
4.1,创建 spring-mvc.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
">
<!-- 包扫描-加载controller注解 -->
<context:component-scan base-package="com.edu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 视图解析- 给视图添加前后缀 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp" />
</bean>
</beans>
4.2,添加 web.xml 配置
配置SpringMVC核心控制器DispatcherServlet
它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求
<?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">
<!-- 配置SpringMVC核心控制器,其本质上就是一个Servlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 配置SpringMVC配置文件使SpringMVC核心控制器能够加载 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- tomcat启动就加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.3,测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTnN7kNp-1634195043525)(asset/img/06_ssm/image-20211014145723768.png)]
4.3.1,创建控制器类
package com.edu.user.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//指定这是一个控制器类
@Controller
//指定这个控制器的地址
@RequestMapping("/user")
public class UserController {
/**
* 在访问时要使用类上的RequestMapping中的路径和方法上的RequestMapping中的路径才能访问到该方法
* 如果在视图解析器中没有配置前缀和后缀,文件的路径和后缀不能省略
* 默认以转发的方式访问视图
* @return 视图的位置
*/
@RequestMapping("/hello")
public String hello() {
return "success";
}
}
4.3.2,创建success.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<p>success</p>
</body>
</html>
4.3.3,测试
直接运行该项目,项目启动后访问
http://localhost:8080/项目名/user/hello
,如果正常显示页面,则说明正常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理