SSM增删改查

一、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="保存">&nbsp
               <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="保存">&nbsp
                <a href="index.jsp"><input type="button" value="返回"></a>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

这样,我们SSM增删改查就完成啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值