目录
一、SSM简介
1.MVC介绍?
2.整合版本要求。
二、SSM整合实例
1.创建Maven Web项目。
step1:新建模块。
step2:点击下一个,构建坐标。
step3:点击完成,添加web框架的支持。
step4:检查项目结构,是否符合下图:
2.导入依赖。
3.创建数据库表和编写相关查询语句
4.根据这些语句编写实体类代码。
5.编写配置文件及资源文件
6.整合Mybatis与Spring。
7.JUnit测试。
8.整合SpringMVC。
1.配置Spring-mvc.xml
2.配置web.xml文件
3.编写视图层页面。
4.根据视图层编写控制层代码。
5.启动服务器进行测试是否整合成功。
三、SSM总结
如有不足,欢迎指正!
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架。
其中Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
MVC:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不同类型的文件放到不同目录下的一种方法,然后取了个高大上的名字。当然,他带来的好处有很多,比如前后端分离,松耦合等等,就不详细说明了。
模型(model):数据持久层,即我们常用的Dao层,CRUD操作。同时需要配合Service层,处理详细的业务逻辑。
视图(View):前端展示数据,提供链发起Service请求,例如a,form,img...等。
控制器(Controller):接收用户的请求:req-请求参数、Session信息等,并把这些请求数据交给业务层进行处理相应代码,同时控制视图的跳转。
如图所示理解MVC:
导入的依赖一定要满足上图版本要求,不然运行项目时会出现各种报错!
如果存在,那就ok了,开始我们的项目配置工作。
这里需要注意导入的依赖的版本要按照整合版本的要求来,这里我使用的是最新版本要求。
Spring 5.3.3
SpringMVC 5.3.3
Mybatis 3.5.2
4.0.0
com.luo
SSM-Demo
1.0-SNAPSHOT
org.apache.maven.plugins
maven-compiler-plugin
6
src/main/resources
**/*.properties
**/*.xml
false
src/main/java
**/*.properties
**/*.xml
false
junit
junit
4.13
org.projectlombok
lombok
1.18.12
commons-fileupload
commons-fileupload
1.3.1
com.fasterxml.jackson.core
jackson-databind
2.12.1
org.springframework
spring-webmvc
5.3.3
org.springframework
spring-jdbc
5.3.3
org.springframework
spring-context-support
5.3.3
org.springframework
spring-test
5.3.3
javax.annotation
javax.annotation-api
1.3.2
org.apache.geronimo.bundles
aspectjweaver
1.6.8_2
javax.servlet
javax.servlet-api
4.0.1
javax.servlet.jsp
javax.servlet.jsp-api
2.3.3
mysql
mysql-connector-java
8.0.22
org.mybatis
mybatis
3.5.2
org.mybatis
mybatis-spring
2.0.6
org.apache.logging.log4j
log4j-api
2.11.0
org.apache.logging.log4j
log4j-core
2.11.0
org.apache.logging.log4j
log4j-web
2.11.0
javax.mail
mail
1.4.5
com.lmax
disruptor
3.4.2
org.junit.jupiter
junit-jupiter
RELEASE
compile
# 创建一个简单的用户表
CREATE TABLE `user_t` (
`id` int NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
-- 下面语句在Mybatis中使用即可
# 查询所有用户
select * from user_t;
#根据id查询用户
select * from ssm_test.user_t where id=#{userId};
#新增名字不重复的用户,前提表中至少有一条数据
insert into ssm_test.user_t(user_name,password,age)
(select #{user_name},#{password},#{age} from ssm_test.user_t
where not exists(
select * from ssm_test.user_t where user_name=#{user_name}
)
limit 1);
这里推荐一下 IDEA快速实现接口、查找接口的实现、getSet方法快速生成等等常用快捷键这篇文章,方便快速开发。
User.class
package com.luo.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private String user_name;
private String password;
private int age;
}
这里我使用了lombok,它是相当于一个插件,与类里的注解配合使用,简便的省去写set,get啥的实体类的东西。
它的使用步骤如下:
在IDEA中安装Lombok插件
在项目中导入lombok的jar包
在实体类中可使用下面常用的注解:
使用这个插件的优缺点:
优点: 1.能通过注解的形式自动生成构造器、getter/setter. equals、 hashcode. toString等方法, 提高了一定的开发效率 2.让代码变得简洁,不用过多的去关注相应的方法 3.属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点: 1.不支持多种参数构造器的重载 2.虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
首先创建db.properties,这设置了连接数据库的所需参数的资源信息。
username =
password =
url = jdbc:mysql://localhost:3306/ssm_test?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC
driver = com.mysql.cj.jdbc.Driver
#定义初始连接数
initialSize = 0
#定义最大连接数
maxActive = 20
#定义最大空间
maxIdle = 20
#定义最小空间
minIdle = 1
#定义最长等待时间
maxWait = 60000
然后在spring-mybatis.xml中引用,实现JDBC连接,同时此文件设置日志模式及spring与mybatis整合:
LOG4J2
true
由于在此设置了log4j2的日志模式,所以我们需要导入log4j2.xml文件,便于我们每次调试程序生成相关日志文件:
百度百科:为了方便调试,一般都会使用日志来输出信息,Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。为了方便调试,一般都会使用日志来输出信息,Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
关于如果设置了log4j的日志模式,那么我们可以使用这篇文章的配置:http://www.blogjava.net/zJun/archive/2006/06/28/55511.html
log
${logFileName}
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %l - %m%n
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M[%L line] - %m%n
20MB
DEBUG
${basePath}/all.log
${basePath}/%d{yyyy-MM}/all-%d{yyyy-MM-dd-HH}-%i.log.gz
500
12
true
${basePath}/info.log
${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz
100
12
true
${basePath}/warn.log
${basePath}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz
100
12
true
${basePath}/error.log
${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz
100
12
true
DEBUG
applicationContext.xml中导入spring-mybatis.xml文件,创建这个文件的作用目的是为了方便以后的多人开发,同时便于AOP编程:
由于spring-mybatis.xml配置文件中,我们已经设置支持了注解驱动,那么我们可以现在编写如下目录下的几个类了:
由于之前我们已经完成了User.class文件的编写,那么我们现在只需要创建UserDao接口及mappper映射文件了:
UserDao.class:
package com.luo.dao;
import com.luo.pojo.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
//根据主键查找用户
User selectByPrimaryKey(int userId);
//查找所有用户
List selectAllUser();
//增加用户
void addUser(User user);
}
UserMapper.xml:
insert into ssm_test.user_t(user_name,password,age)
(select #{user_name},#{password},#{age} from ssm_test.user_t
where not exists(
select * from ssm_test.user_t where user_name=#{user_name}
)
limit 1);
由于更好的去实现业务,我们需要建立Service接口和实现类,对单元测试的支持,通过单独的一层service实现业务逻辑,那么对于业务逻辑的单元测试会更容易编写,只需要对service来编写就可以了;而web层的单元测试就不需要关注业务本身,只需要关注反馈格式就行了;不然web层就既要考虑业务逻辑的计算,还要考虑web反馈的格式验证,太过复杂。
UserService.class:
package com.luo.service;
import com.luo.pojo.User;
import java.util.List;
public interface UserService {
//根据主键查找用户
User selectByPrimaryKey(int userId);
//查找所有用户
List selectAllUser();
//增加用户
void addUser(User user);
}
UserServiceImp.class:
package com.luo.service;
import com.luo.dao.UserDao;
import com.luo.pojo.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service("UserService")
public class UserServiceImp implements UserService{
@Resource
private UserDao userDao;
@Override
public User selectByPrimaryKey(int userId) {
return this.userDao.selectByPrimaryKey(userId);
}
@Override
public List selectAllUser() {
return this.userDao.selectAllUser();
}
@Override
public void addUser(User user) {
this.userDao.addUser(user);
}
}
测试类在src/test/java中建立,使用注解的方式来引入配置文件和类,然后再将service接口对象注入,就可以进行测试了。如果测试成功,表示Spring和Mybatis已经整合成功了。输出信息使用的是Log4j打印到控制台。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.luo.pojo.User;
import com.luo.service.UserService;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestMyBatis {
@Resource
private UserService userService;
@Test
public void test1() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user = userService.selectByPrimaryKey(1);
System.out.println(mapper.writeValueAsString(user));
}
}
控制台输出如下:
这是生成的日志文件:
至此,完成Spring和Mybatis这两大框架的整合,下面再继续进行SpringMVC的整合。
配置里面的注释很详细,在此就不说了,主要是自动扫描控制器,视图模式,注解的启动这三个。
text/html;charset=UTF-8
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
springmvc
/
contextConfigLocation
classpath:applicationContext.xml
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encoding
/*
org.apache.logging.log4j.web.Log4jServletContextListener
log4jServletFilter
org.apache.logging.log4j.web.Log4jServletFilter
log4jServletFilter
/*
REQUEST
FORWARD
INCLUDE
ERROR
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
在jsp文件夹下:showUser.jsp
<%@ page import="com.luo.pojo.User" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: Luo
Date: 2021/2/23
Time: 16:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
查看用户
Hello World!
用户输入
用户名
年龄
密码
<%
List list = (List)request.getAttribute("users");
for (User user : list) {
%>
<%=user.getUser_name()%>
<%=user.getAge()%>
<%=user.getPassword()%>
<%
}
%>
package com.luo.controller;
import com.luo.pojo.User;
import com.luo.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
@Controller
public class UserShow {
@Resource
private UserService userService;
//根据Restful风格通过地址栏查询用户
@RequestMapping("/user/{id}")
public String test(Model model, @PathVariable int id){
return "showUser";
}
//进入页面查询所有用户
@RequestMapping("/user/login")
public String test1(Model model){
model.addAttribute("users",this.userService.selectAllUser());
System.out.println(model.getAttribute("users"));
return "showUser";
}
//新增用户数据刷新页面
@RequestMapping("/user/add")
public String test2(String username, int age, String password, ModelAndView mv,Model model){
User user = new User(username,password,age);
this.userService.addUser(user);
return test1(model);
}
}
启动成功!!!如果没有启动成功,可能是你Build的时候没有添加所需库。按照如下操作即可:
打开浏览器进入首页,点击跳转:
点击提交,页面刷新,表中数据增加,同时数据库中数据增加,不会出现重复用户:
至此,三大框架的整合就完成了,在此基础上也可以很容易的添加其他功能。
ssm 是 Spring 、SpringMVC 、Mybatis 的结合, Spring 相当于在 SpringMVC 与 Mybatis 之间的桥梁。其中 SpringMVC 相当于传统的 service+model+servlet 。结合注解进行开发,使整个开发高效代码量大大的减少。Mybatis 负责数据库的数据交换,不用自己写 SQL 语句防止了 SQL 注入问题发生,而且相比于 python中的Django框架, 他非常的轻,dao 与 model 直接自动生成大大减少了多表开发的时间,因此 ssm 是非常优秀的后台框架。