一、SSM是什么?
ssm全称Spring+SpringMVC+MyBatis,是目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。ssm还可指“软系统方法论”,是一项运用系统思考解决非系统问题的定性研究技术。
二、SSM三个框架介绍
Spring简介
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
spring的优点:
A、通过Spring的IOC特性,将对象之间的依赖关系交给了Spring控制,方便解耦,简化了开发。
B、通过Spring的AOP特性,很容易实现事务,日志,权限的控制。
C、提供了对其他优秀开源框架的集成支持。
D、低侵入式。
Spring MVC简介
Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
SpringMVC的优点
A、springMVC是使用了MVC设计思想的轻量级web框架,对web层进行解耦,是的我们开发更简洁。
B、与Spring无缝衔接。
C、灵活的数据验证,格式化,数据绑定机制。
MyBatis简介
MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。可以这么理解,MyBatis是一个用来帮你管理数据增删改查的框架。
优点:
a、sql写在xml文件中,便于统一管理和优化,解除sql和程序代码的耦合。
b、提供映射标签,支持对象和和数据库orm字段关系的映射,支持对象关系映射标签,支持对象关系的组建
c、提供xml标签,支持编写动态sql。
缺点:
a、工作量较大,特别是在表的字段多,关联表多的情况下
b、sql语句的编写依赖于数据库,移植性差。
c、不支持级联删除,级联更新,需要自己对表进行删除。
整合分析
A、spring MVC + spring +mybatis,是标准的MVC设计模式,将整个系统划分为显示层,Controller层,Service层,DAO层四层
使用Spring MVC负责请求的转发和视图管理
spring实现业务对象管理,mybatis作为数据对象的持久化引擎。
B、Spring是一个开源框架,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,还能更好的让其他框架整合。
C、Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。
D、MyBatis 是一个基于Java的持久层框架
三、数据库设计
二、具体实现步骤
① 创建项目
② 导入我们需要用到的依赖
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
</dependencies>
③ 配置MyBatis文件 myBatis-config.xml
<?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>
<!--设置 mapper 映射文件的别名-->
<typeAliases>
<package name="com.cskt.pojo"/>
</typeAliases>
<mappers>
<mapper resource="mapper/RainQualityMapper.xml"></mapper>
</mappers>
</configuration>
④ mapper 的配置(这里需要注意的是namespace里填写的一定是mapper接口的路径)
<?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.cskt.mapper.RainQualityMapper">
</mapper>
⑤ 建立spring配置文件
(1)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: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:database.properties"></context:property-placeholder>
<!-- 配置环境 -->
<bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource">
<!--3.使用属性占位符${}读取properties文件的属性-->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- 配置扫描包 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper"></property>
</bean>
<!-- 扫描包 -->
<context:component-scan base-package="com.cskt.mapper,com.cskt.service"></context:component-scan>
<!--</ bean>-->
<!--配置mybatis的sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--配置MyBatis的Mapper扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cskt.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>
(2)引用database.properties文件
# 数据库连接配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/rainQuality?serverTimezone=GMT-8
jdbc.username=root
jdbc.password=root
# 连接池配置
db.pool.initialSize=5
db.pool.maxActive=20
db.pool.maxIdle=10
db.pool.minIdle=5
# 其他配置项
app.version=1.0.0
app.name=MyApp
(3)创建springmvc.xml目录的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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解开发-->
<mvc:annotation-driven/>
<!--开启扫描包-->
<context:component-scan base-package="com.cskt.controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
⑥ 建立包 / 文件
⑦在pojo中创建实体类
package com.cskt.pojo;
import lombok.Data;
@Data
public class RainQuality {
private Integer id;
private String districtName;
private String monitorTime;
private Float rain;
private String monitoringStation;
private String monitoringAddress;
}
⑧ 编写mapper接口(增删改查)
package com.cskt.mapper;
import com.cskt.pojo.RainQuality;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RainQualityMapper {
/***
* 查询所有的用户信息
* @return
*/
public List<RainQuality> selectRainQuality();
/***
* 新增用户信息
* @return
*/
public int insertRainQuality(RainQuality rainQuality);
/***
* 修改用户信息
* @return
*/
public int updateRainQuality(RainQuality rainQuality);
/***
* 根据id查询
* @return
*/
public RainQuality selectRainQualityById(Integer id);
/***
* 删除用户信息
* @return
*/
public int deleteRainQuality(Integer id);
}
⑨ 编写mapper.xml,这里需要注意的是namespace里填写的一定是mapper接口的路径(这里用的是动态sql语句)
<?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.cskt.mapper.RainQualityMapper">
<!--查询-->
<select id="selectRainQuality" resultType="com.cskt.pojo.RainQuality">
SELECT * FROM rainQuality
</select>
<!--新增-->
<insert id="insertRainQuality" parameterType="RainQuality">
INSERT INTO rainQuality (districtName, monitorTime, rain, monitoringStation, monitoringAddress)
VALUES (#{districtName}, #{monitorTime}, #{rain}, #{monitoringStation},#{monitoringAddress});
</insert>
<!--修改-->
<update id="updateRainQuality" parameterType="RainQuality">
UPDATE rainQuality
<trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
<if test="districtName!=null and districtName!=''">
districtName=#{districtName},
</if>
<if test="monitorTime!=null and monitorTime!=''">
monitorTime=#{monitorTime},
</if>
<if test="rain!=null and rain!=''">
rain=#{rain},
</if>
<if test="monitoringStation!=null and monitoringStation!=''">
monitoringStation=#{monitoringStation},
</if>
<if test="monitoringAddress!=null and monitoringAddress!=''">
monitoringAddress=#{monitoringAddress}
</if>
</trim>
</update>
<select id="selectRainQualityById" resultType="com.cskt.pojo.RainQuality">
SELECT * FROM rainQuality where id=#{id}
</select>
<!--删除-->
<delete id="deleteRainQuality" parameterType="java.lang.Integer">
DELETE FROM rainQuality
<trim prefix="where" prefixOverrides="and|or">
<if test="id!=null and id!=''">
id=#{id}
</if>
</trim>
</delete>
</mapper>
⑩ 编写Service接口和实现类
package com.cskt.service;
import com.cskt.pojo.RainQuality;
import java.util.List;
public interface RainQualityService {
/***
* 查询所有的用户信息
* @return
*/
public List<RainQuality> selectRainQuality();
/***
* 根据id查询
* @return
*/
public RainQuality selectRainQualityById(Integer id);
/***
* 新增用户信息
* @return
*/
public int insertRainQuality(RainQuality rainQuality);
/***
* 修改用户信息
* @return
*/
public int updateRainQuality(RainQuality rainQuality);
/***
* 删除用户信息
* @return
*/
public int deleteRainQuality(Integer id);
}
package com.cskt.service;
import com.cskt.mapper.RainQualityMapper;
import com.cskt.pojo.RainQuality;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class RainQualityServiceImpl implements RainQualityService{
//自动装配mapper
@Resource
//设置私有的持久层
private RainQualityMapper rainQualityMapper;
@Override
public List<RainQuality> selectRainQuality() {
return rainQualityMapper.selectRainQuality();
}
@Override
public RainQuality selectRainQualityById(Integer id) {
return rainQualityMapper.selectRainQualityById(id);
}
@Override
public int insertRainQuality(RainQuality rainQuality) {
return rainQualityMapper.insertRainQuality(rainQuality);
}
@Override
public int updateRainQuality(RainQuality rainQuality) {
return rainQualityMapper.updateRainQuality(rainQuality);
}
@Override
public int deleteRainQuality(Integer id) {
return rainQualityMapper.deleteRainQuality(id);
}
}
①① 编写controller层(controller层是用来接收前台数据和返回页面请求信息的,Controller层是不允许直接操作数据库的)
package com.cskt.controller;
import com.cskt.pojo.RainQuality;
import com.cskt.service.RainQualityService;
import lombok.Data;
import org.springframework.stereotype.Controller;
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 java.util.List;
@Controller
public class RainQualityController {
//自动装配 service
@Resource
//定义私有的业务层
private RainQualityService rainQualityService;
/***
* 查询所有的用户信息
* @return
*/
@RequestMapping("/selectRainQuality")
public ModelAndView selectRainQuality(ModelAndView modelAndView){
List<RainQuality> RainQualityList=rainQualityService.selectRainQuality();
modelAndView.addObject("RainQualityList",RainQualityList);
modelAndView.setViewName("index");
return modelAndView;
}
/***
* 根据id查询
* @return
*/
@RequestMapping("/selectRainQualityById")
public ModelAndView selectRainQualityById(ModelAndView modelAndView,@RequestParam("id") Integer id){
RainQuality rainQuality=rainQualityService.selectRainQualityById(id);
modelAndView.addObject("rainQualitys",rainQuality);
modelAndView.setViewName("update");
return modelAndView;
}
/***
* 新增用户信息
* @return
*/
@RequestMapping("/insertRainQuality")
public String insertRainQuality(@RequestParam("districtName")String districtName, @RequestParam("monitorTime") String monitorTime, @RequestParam("rain") Float rain, @RequestParam("monitoringStation") String monitoringStation, @RequestParam("monitoringAddress") String monitoringAddress){
int i = rainQualityService.insertRainQuality(new RainQuality(districtName,monitorTime,rain,monitoringStation,monitoringAddress));
if(i>0){
//重定向到查询所有
return "redirect:/selectRainQuality";
}else{
//否则就是404
return "redirect:/toError";
}
}
/***
* 修改用户信息
* @return
*/
@RequestMapping("/updateRainQuality")
public String updateRainQuality(@RequestParam("districtName")String districtName, @RequestParam("monitorTime") String monitorTime, @RequestParam("rain") Float rain, @RequestParam("monitoringStation") String monitoringStation, @RequestParam("monitoringAddress") String monitoringAddress,@RequestParam("id") Integer id){
int i = rainQualityService.updateRainQuality(new RainQuality(districtName,monitorTime,rain,monitoringStation,monitoringAddress,id));
if(i>0){
//重定向到查询所有
return "redirect:/selectRainQuality";
}else{
//否则就是404
return "redirect:/toError";
}
}
/***
* 删除用户信息
* @return
*/
@RequestMapping("deleteRainQuality")
public String deleteRainQuality(@RequestParam("id")Integer id){
int i = rainQualityService.deleteRainQuality(id);
if(i>0){
//重定向到查询所有
return "redirect:/selectRainQuality";
}else{
//否则就是404
return "redirect:/toError";
}
}
}
报错则跳此页面
package com.cskt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
/***
* 404页面
* @return
*/
@RequestMapping("toError")
public ModelAndView toError(ModelAndView modelAndView){
modelAndView.setViewName("error");
return modelAndView;
}
}
①② 编写页面
查询页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
table tr:nth-child(even){
background-color: aquamarine;
}
</style>
</head>
<body>
<h2>Hello World!</h2>
<table border="3">
<h3> <a href="insert.jsp">新增雨量监测信息</a></h3>
<tr style="background-color: aqua">
<td>序号</td>
<td>区域名称</td>
<td>监测时间</td>
<td>雨量值(mm)</td>
<td>监测站</td>
<td>站点地址</td>
<td>操作</td>
<td>操作</td>
</tr>
<c:forEach items="${RainQualityList}" var="item">
<tr>
<td>${item.id}</td>
<td>${item.districtName}</td>
<td>${item.monitorTime}</td>
<td>${item.rain}</td>
<td>${item.monitoringStation}</td>
<td>${item.monitoringAddress}</td>
<td><a href="deleteRainQuality?id=${item.id}">删除</a></td>
<td><a href="selectRainQualityById?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
使用样式控制页面内容整体,实现了标题字体及背景色效果,列表内容隔行变色
新增页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>新增页面</title>
</head>
<body>
<<h1>新增雨量监测信息</h1>
<form action="insertRainQuality">
<table border="1">
<tr>
<td>区域名称</td>
<td> <input type="text" name="districtName"></td>
</tr>
<tr>
<td>监测时间</td>
<td> <input type="text" name="monitorTime"></td>
</tr>
<tr>
<td>雨量值(mm)</td>
<td> <input type="text" name="rain"></td>
</tr>
<tr>
<td>监测站</td>
<td> <input type="text" name="monitoringStation"></td>
</tr>
<tr>
<td>站点地址</td>
<td> <input type="text" name="monitoringAddress"></td>
</tr>
<tr colspan="2">
<td>
<input type="submit" value="保存"> 
<a href="index.jsp"><input type="button" value="返回"></a>
</td>
</tr>
</table>
</form>
</body>
</html>
修改页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>修改页面</title>
</head>
<body>
<form action="updateRainQuality">
<table border="1">
<tr>
<td>id</td>
<td> <input type="text" name="id" value="${rainQualitys.id}" readonly></td>
</tr>
<tr>
<td>区域名称</td>
<td> <input type="text" name="districtName" value="${rainQualitys.districtName}" readonly="readonly"></td>
</tr>
<tr>
<td>监测时间</td>
<td> <input type="text" name="monitorTime" value="${rainQualitys.monitorTime}"></td>
</tr>
<tr>
<td>雨量值(mm)</td>
<td> <input type="text" name="rain" value="${rainQualitys.rain}"></td>
</tr>
<tr>
<td>监测站</td>
<td> <input type="text" name="monitoringStation" value="${rainQualitys.monitoringStation}"></td>
</tr>
<tr>
<td>站点地址</td>
<td> <input type="text" name="monitoringAddress" value="${rainQualitys.monitoringAddress}"></td>
</tr>
<tr colspan="2">
<td>
<input type="submit" value="保存"> 
<a href="index.jsp"><input type="button" value="返回"></a>
</td>
</tr>
</table>
</form>
</body>
</html>
这样,我们SSM增删改查就完成啦!