SSM框架终极篇——Spring、SpringMVC、MyBatis整合练习

一、准备工作

环境:

  • 新版IDEA
  • MySQL 5.7
  • Tomcat 9.0.2
  • Maven

要求:

  • 熟练掌握MySQL数据库
  • 掌握Spring、SpringMVC、MyBatis框架知识
  • 了解简单的前端知识(JSP、BootStarp)
二、项目编写
1.创建数据库
CREATE DATABASE `ssmbuild`;

USE `ssmbuild`;

DROP TABLE IF EXISTS `books`;

CREATE TABLE `books` (
  `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
  `bookName` VARCHAR(100) NOT NULL COMMENT '书名',
  `bookCounts` INT(11) NOT NULL COMMENT '数量',
  `detail` VARCHAR(200) NOT NULL COMMENT '描述',
  KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES 
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从入门到入狱');

在这里插入图片描述

2.新建Maven的web项目并连接数据库

在这里插入图片描述
并创建相应的目录结构
在这里插入图片描述
连接数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.导入MySQL驱动包、创建JDBC配置文件

在pom.xml中导入MySQL驱动依赖包

    <!-- 数据库驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>

在resources目录下创建database.properties文件,写入连接数据库的配置信息

jdbc.Driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
4.编写pojo实体类、编写dao持久化层

实体类

package com.muhan.pojo;

//实体类
public class Book {
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;

    public Book() {
    }

    public Book(int bookID, String bookName, int bookCounts, String detail) {
        this.bookID = bookID;
        this.bookName = bookName;
        this.bookCounts = bookCounts;
        this.detail = detail;
    }

    public int getBookID() {
        return bookID;
    }

    public void setBookID(int bookID) {
        this.bookID = bookID;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public int getBookCounts() {
        return bookCounts;
    }

    public void setBookCounts(int bookCounts) {
        this.bookCounts = bookCounts;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookID=" + bookID +
                ", bookName='" + bookName + '\'' +
                ", bookCounts=" + bookCounts +
                ", detail='" + detail + '\'' +
                '}';
    }
}

dao层接口

package com.muhan.dao;

import com.muhan.pojo.Book;

import java.util.List;

//dao层接口
public interface BookDao {
    //增加Book
    int addBook(Book book);
    
    //通过id查询Book
    Book queryBookById(int id);
    
    //修改Book
    int updateBook(Book book);
    
    //根据id删除Book
    int deleteBookById(int id);
    
    //查询所有Book,返回集合
    List<Book> queryAllBook();
}

导入MyBatis的依赖包

    <!-- MyBatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

编写dao层接口对应的Mapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.muhan.dao.BookDao">
    <!--//1.增加一个book-->
    <insert id="addBook" parameterType="Book">
        insert into ssmbuild.book(bookID,bookName,bookCounts,detail)
        values (#{bookID},#{bookName},#{bookCounts},#{detail})
    </insert>
    <!--//2.通过ID删除一个book-->
    <delete id="deleteBookById" parameterType="Integer">
        delete from ssmbuild.book where bookID=#{bookID}
    </delete>

    <!--//3.更改book-->
    <update id="updateBook" parameterType="Book">
        update ssmbuild.book
        set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
        where bookID=#{bookID}
    </update>


    <!--//4.通过ID查询book-->
    <select id="queryBookById" resultType="Book">
        select * from ssmbuild.book where bookID=#{bookID}
    </select>

    <!--//5.获取所有的book-->
    <select id="queryAllBook" resultType="Book">
        select * from ssmbuild.book
    </select>

</mapper>

在resources目录下新建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>
	<!--别名-->
    <typeAliases>
        <package name="com.muhan.pojo"/>
    </typeAliases>
    <!--映射BookDaoMapper.xml文件-->
    <mappers>
        <mapper resource="com/muhan/dao/BookDaoMapper.xml"/>
    </mappers>
</configuration>
5.编写Service层接口、接口实现类

编写Service接口

package com.muhan.service;

import com.muhan.pojo.Book;

import java.util.List;

//service层接口
public interface BookService {
    //增加Book
    int addBook(Book book);

    //通过id查询Book
    Book queryBookById(Integer id);

    //修改Book
    int updateBook(Book book);

    //根据id删除Book
    int deleteBookById(Integer id);

    //查询所有Book,返回集合
    List<Book> queryAllBook();
}

编写Service接口实现类

package com.muhan.service;

import com.muhan.dao.BookDao;
import com.muhan.pojo.Book;

import java.util.List;

//Service层接口实现类,调用dao层
public class BookServiceImpl implements BookService {
    
    //将BookDao组合进来
    private BookDao bookDao;
    
    //设置一个set方法接口,方斌Spring管理
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    //增加Book
    @Override
    public int addBook(Book book) {
        return bookDao.addBook(book);
    }
    //通过id查询Book
    @Override
    public Book queryBookById(Integer id) {
        return bookDao.queryBookById(id);
    }
    //修改Book
    @Override
    public int updateBook(Book book) {
        return bookDao.updateBook(book);
    }
    //根据id删除Book
    @Override
    public int deleteBookById(Integer id) {
        return bookDao.deleteBookById(id);
    }
    //查询所有Book,返回集合
    @Override
    public List<Book> queryAllBook() {
        return bookDao.queryAllBook();
    }
}

6.配置Spring整合MyBtis(dao层)

我们这里使用c3p0连接池,导入依赖包

    <!-- 数据库连接池 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

再导入mybatis-spring的依赖包、Spring相关包(spring-web、spring-jdbc)

    <!-- mybatis-spring整合包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>
    <!--Spring相关包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.24.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.24.RELEASE</version>
    </dependency>

Spring整合MyBatis,在resources目录下新建spring目录,并在该目录下新建spring-dao.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"
       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">

    <!--配置Spring整合Mybatis-->

    <!--1.扫描包-->
    <context:component-scan base-package="com.muhan.dao"/>

    <!--2.关联数据库文件-->
    <context:property-placeholder location="classpath:database.properties"/>

    <!--3.数据库连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
        <!--配置连接池属性-->
        <property name="driverClass" value="${jdbc.Driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>


        <!--c3p0私有属性配置(可以不配)-->

        <property name="maxPoolSize" value="30"/> <!--最大连接数-->
        <property name="minPoolSize" value="5"/> <!--最小连接数-->
        <property name="autoCommitOnClose" value="false"/><!-- 关闭连接后不自动commit -->
        <property name="checkoutTimeout" value="10000"/> <!-- 获取连接超时时间 -->
        <property name="acquireRetryAttempts" value="2"/><!-- 当获取连接失败重试次数 -->
    </bean>


    <!--4.配置sqlSessionFactory对象:SqlSessionFactoryBean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--配置mybatis全局配置文件:mybatis-config.xml-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>


    <!--5.扫描dao接口包,动态实现dao接口注入到spring中-->
    <bean  class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

        <!--给出需要扫描的dao接口包-->
        <property name="basePackage" value="com.muhan.dao"/>
    </bean>
</beans>
6.配置Spring整合Service层

在resources/spring目录下新建spring-service.xml配置文件,并编写整合servcie层的配置

<?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">

    <!--扫描servcie相关的包-->
    <context:component-scan base-package="com.muhan.service"/>

    <!--将service层的接口是实现类注入到Spring的IOC容器中-->
    <bean id="BookServiceImpl" class="com.muhan.service.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

    <!--配置事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
</beans>
7.配置SpringMVC

首先导入springmvc的三个包:jsp,jstl,servlet

        <!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!--jsp-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>

        <!--jstl-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

配置web.xml,在web.xml中配置DispatcherServlet以及过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:application.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

在resources/spring下新建spring-mvc.xml配置文件,用来配置springmvc

<?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: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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--springmvc配置-->

    <!--1.扫描包-->
    <context:component-scan base-package="com.muhan.controller"/>

    <!--2.静态资源过滤
        (1)加入对静态资源的处理:js,gif,png
        (2)允许使用"/"做整体映射
    -->
    <mvc:default-servlet-handler/>

    <!--3.配置注解驱动-->
    <mvc:annotation-driven/>

    <!--4.配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <!--配置前缀-->
        <property name="prefix" value="/WEN-INF/jsp/"/>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
8.Spring整合配置文件

在resources目录下新建一个application.xml文件,将spring目录下的三个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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--整合导入三个spring配置文件-->
    <import resource="spring/spring-dao.xml"/>
    <import resource="spring/spring-service.xml"/>
    <import resource="spring/spring-mvc.xml"/>

</beans>
9.编写Controller
package com.muhan.controller;

import com.muhan.pojo.Book;
import com.muhan.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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 java.util.List;

@Controller
@RequestMapping("/book")
public class UserController {
    @Autowired
    @Qualifier("BookServiceImpl")
    private BookService bookService;



    @RequestMapping("/allBook")
    public String list(Model model) {
        System.out.println("allBook进来了---------------------------------");
        List<Book> list = bookService.queryAllBook();
        model.addAttribute("list",list);
        return "allBook";
    }

    @RequestMapping("/toAddBook")
    public String toAddBook() {
        return "addBook";
    }

    @RequestMapping("/addBook")
    public String addBook(Book book){
        System.out.println("添加的书:---------------->"+book);
        bookService.addBook(book);
        return "redirect:/book/allBook";//重定向到allBook页面
    }

    @RequestMapping("/toUpdateBook")
    public String toUpdateBook(Model model,Integer id){
        Book book = bookService.queryBookById(id);
        System.out.println("展示要修改的书:---------------->"+book);
        model.addAttribute("book",book);
        return "updateBook";
    }

    @RequestMapping("/updateBook")
    public String updateBook(Model model,Book book){
        System.out.println("要修改的书:---------------->"+book);
        bookService.updateBook(book);
        Book book1 = bookService.queryBookById(book.getBookID());
        model.addAttribute("book",book1);
        System.out.println("修改后的书籍===="+book1);
        return "redirect:/book/allBook";//重定向到allBook页面
    }

    @RequestMapping("/del/{bookID}")
    public String deleteBook(@PathVariable("bookID") Integer id){
        bookService.deleteBookById(id);
        return "redirect:/book/allBook";//重定向到allBook页面
    }
}
10.处理资源导出问题

在pom.xml里的build里面配置

 <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
11.前端视图层

首页index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <style>
        body{
            text-align: center;
            line-height: 500PX;
            text-align: center;
        }
        div{
            width: 200px;
            height: 200px;
            text-align: center;
            line-height: 200PX;
            background: aquamarine;
            border-radius: 100px;
        }
        a{
            font-size: 25px;
            color: black;
            text-decoration: none;
        }
    </style>
</head>
<body>

<div>
    <a href="${pageContext.request.contextPath}/book/allBook">点击查看列表</a>
</div>

</body>
</html>

在WEB-INF目录下新建jsp目录,并将以下的页面放在该目录下

增加书籍页面addBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>新增书籍</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>新增书籍</small>
                </h1>
            </div>
        </div>
    </div>
    <form action="${pageContext.request.contextPath}/book/addBook" method="post">
        书籍名称:<input type="text" name="bookName"><br><br><br>
        书籍数量:<input type="text" name="bookCounts"><br><br><br>
        书籍详情:<input type="text" name="detail"><br><br><br>
        <input type="submit" value="添加">
    </form>

</div>

书籍列表页面allBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>书籍列表</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>书籍列表 —— 显示所有书籍</small>
                </h1>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-md-4 column">
            <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
        </div>
    </div>

    <div class="row clearfix">
        <div class="col-md-12 column">
            <table class="table table-hover table-striped">
                <thead>
                <tr>
                    <th>书籍编号</th>
                    <th>书籍名字</th>
                    <th>书籍数量</th>
                    <th>书籍详情</th>
                    <th>操作</th>
                </tr>
                </thead>

                <tbody>
                <c:forEach var="book" items="${requestScope.get('list')}">
                    <tr>
                        <td>${book.getBookID()}</td>
                        <td>${book.getBookName()}</td>
                        <td>${book.getBookCounts()}</td>
                        <td>${book.getDetail()}</td>
                        <td>
                            <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
                            <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a>
                        </td>
                    </tr>
                </c:forEach>
                </tbody>
            </table>
        </div>
    </div>
</div>

修改书籍信息页面updateBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>修改信息</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>修改信息</small>
                </h1>
            </div>
        </div>
    </div>

    <form action="${pageContext.request.contextPath}/book/updateBook" method="post">
        <input type="hidden" name="bookID" value="${book.getBookID()}"/>
        书籍名称:<input type="text" name="bookName" value="${book.getBookName()}"/>
        书籍数量:<input type="text" name="bookCounts" value="${book.getBookCounts()}"/>
        书籍详情:<input type="text" name="detail" value="${book.getDetail() }"/>
        <input type="submit" value="提交"/>
    </form>

</div>
12.配置Tomcat

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.项目结构

在这里插入图片描述

14.测试

运行tomcat测试
在这里插入图片描述
点击查看列表
在这里插入图片描述
点击新增按钮,新增书籍
在这里插入图片描述
新增后,自动返回列表页面,我们发现新增的数据已经填加上了
在这里插入图片描述
再去数据库查看
在这里插入图片描述
我们修改信息,点击提交后会自动返回列表页面
在这里插入图片描述
发现数据已经更改

在这里插入图片描述
在数据库中查看,发现已经更新数据
在这里插入图片描述

然后我们点击删除,发现已经删除
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐