SSM整合书籍管理案例

环境要求

环境:

  • IDEA
  • MySQL 5.7.19
  • Tomcat 8
  • Maven 3.6

要求:

  • 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;

数据库环境

创建一个存放书籍数据的数据库表

CREATE DATABASE ssmbuild;

USE ssmbuild;

DROP TABLE IF EXISTS books;

CREATE TABLE books(

	bookID INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
	bookName VARCHAR(100) NOT NULL,
	bookCounts INT (11) NOT NULL,
	detail VARCHAR(200) NOT NULL
);

INSERT INTO books (bookID,bookName,bookCounts,detail) VALUES (1,"Java",1,"从入门到放弃");

INSERT INTO books (bookID,bookName,bookCounts,detail) VALUES (2,"MySql",10,"从删库到跑路");

INSERT INTO books (bookID,bookName,bookCounts,detail) VALUES (3,"Linux",5,"从进门到进牢");

SELECT * FROM books;

基本环境搭建

1、新建一Maven项目!ssmbuild , 添加web的支持

2、导入相关的pom依赖!

<dependencies>

    <!--Junit-->

    <dependency>

        <groupId>junit</groupId>

        <artifactId>junit</artifactId>

        <version>4.12</version>

    </dependency>

    <!--数据库驱动-->

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

        <version>5.1.47</version>

    </dependency>

    <!-- 数据库连接池 -->

    <dependency>

        <groupId>com.mchange</groupId>

        <artifactId>c3p0</artifactId>

        <version>0.9.5.2</version>

    </dependency>

    <!--Servlet - JSP -->

    <dependency>

        <groupId>javax.servlet</groupId>

        <artifactId>servlet-api</artifactId>

        <version>2.5</version>

    </dependency>

    <dependency>

        <groupId>javax.servlet.jsp</groupId>

        <artifactId>jsp-api</artifactId>

        <version>2.2</version>

    </dependency>

    <dependency>

        <groupId>javax.servlet</groupId>

        <artifactId>jstl</artifactId>

        <version>1.2</version>

    </dependency>

    <!--Mybatis-->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis</artifactId>

        <version>3.5.2</version>

    </dependency>

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis-spring</artifactId>

        <version>2.0.2</version>

    </dependency>

    <!--Spring-->

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-webmvc</artifactId>

        <version>5.1.9.RELEASE</version>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

        <version>5.1.9.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.aspectj</groupId>

      <artifactId>aspectjweaver</artifactId>

      <version>1.9.4<version>

    </dependency>


</dependencies>

3、Maven资源过滤设置

<build>

    <resources>

        <resource>

            <directory>src/main/java</directory>

            <includes>

                <include>**/*.properties</include>

                <include>**/*.xml</include>

            </includes>

            <filtering>false</filtering>

        </resource>

        <resource>

            <directory>src/main/resources</directory>

            <includes>

                <include>**/*.properties</include>

                <include>**/*.xml</include>

            </includes>

            <filtering>false</filtering>

        </resource>

    </resources>

</build>

4、建立基本结构和配置框架!

  • com.hsz.pojo

  • com.hsz.dao

  • com.hsz.service

  • com.hsz.controller

  • 数据库配置文件 database.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=utf8

jdbc.username=root

jdbc.password=root
  • 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>

    <!--别名-->
    <typeAliases>

        <package name="com.hsz.pojo"/>

    </typeAliases>

</configuration>
  • 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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--开启注解扫描,希望处理service和dao 不处理controller-->
    <context:component-scan base-package="com.hsz">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

    </context:component-scan>

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

    <!--配置连接池-->
    <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}"/>

    </bean>

    <!--##################################################################################-->

    <!--spring整合mybatis框架***************************************************************-->

    <!--配置SqlSessionFactory工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!--指定mybatis全局配置文件的位置-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--指定mybatis,mapper文件的位置-->
        <property name="mapperLocations" value="classpath:com/hsz/dao/*.xml"/>

    </bean>
    <!--配置扫描器,将mybatis接口的实现加入到IOC容器中-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <!--扫描所有dao接口的实现,接入到IOC容器中-->
        <property name="basePackage" value="com.hsz.dao"/>

    </bean>
    <!--***********************************************************************************************-->

    <!--配置Spring框架声明式事务管理+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <!--控制数据源-->
        <property name="dataSource" ref="dataSource"/>

    </bean>

    <!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式)-->
    <aop:config>

        <!--切入点表达式-->
        <aop:pointcut expression="execution(* com.hsz.service.BookServiceImpl.*(..))" id="txPoint"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>

    </aop:config>

    <!--配置事务增强,事务如何切入-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">

        <tx:attributes>
            <tx:method name="find" read-only="true"/>
            <tx:method name="*" isolation="DEFAULT"/>
        </tx:attributes>

    </tx:advice>
    <!--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
</beans>

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

    <!--开启注解扫描,只扫描controller注解-->
    <context:component-scan base-package="com.hsz" use-default-filters="false">

        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

    </context:component-scan>

    <!--配置视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>

    </bean>

    <!--过滤静态资源,将springMVC不能处理的请求交给tomcat-->
    <mvc:default-servlet-handler/>

    <!--开启springMVC注解支持 JSR303校验、Ajax、映射动态请求-->
    <mvc:annotation-driven/>

</beans>
  • 编写数据库对应的实体类 com.hsz.pojo.Books

使用lombok插件!

package com.hsz.pojo;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

@Data

@AllArgsConstructor

@NoArgsConstructor

public class Books {

    private int bookID;

    private String bookName;

    private int bookCounts;

    private String detail;

}
  • 编写Dao层的 Mapper接口!BookMapper.java
package com.hsz.dao;

import com.hsz.pojo.Books;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BookMapper {

    //添加书籍
    int addBook(Books books);

    //根据ID删除书籍
    int deleteBookById(@Param("bookID") int id);

    //更新书籍
    int updateBook(Books books);

    //根据ID查询书籍
    Books queryBookById(@Param("bookID") int id);

    //查询全部书籍
    List<Books> queryAllBook();

    //根据书名查询
    Books queryBookName(@Param("bookName") String bookName);
}
  • 编写接口对应的 BookMapper.xml 文件
<?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.hsz.dao.BookMapper">
    
    <insert id="addBook" parameterType="Books">
        
        insert into
        books (bookName, bookCounts, detail)
        values (#{bookName},#{bookCounts},#{detail});
        
    </insert>

    <delete id="deleteBookById" parameterType="int">

        delete from books where bookID = #{bookID}

    </delete>

    <update id="updateBook" parameterType="Books">

        update books
        set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}
        where bookID = #{bookID};

    </update>

    <select id="queryBookById" resultType="Books">

        select * from books where bookID = #{bookID};

    </select>

    <select id="queryAllBook" resultType="Books">

        select * from books;

    </select>

    <select id="queryBookName" resultType="Books">

        select * from books where bookName = #{bookName};

    </select>
    
</mapper>
  • 编写Service层的接口和实现类

接口:BookService.java

package com.hsz.service;

import com.hsz.pojo.Books;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BookService {

    //添加书籍
    int addBook(Books books);

    //根据ID删除书籍
    int deleteBookById(@Param("bookID") int id);

    //更新书籍
    int updateBook(Books books);

    //根据ID查询书籍
    Books queryBookById(@Param("bookID") int id);

    //查询全部书籍
    List<Books> queryAllBook();

    //根据书名查询
    Books queryBookName(String bookName);

}

实现类:BookServiceImpl.java

package com.hsz.service;

import com.hsz.dao.BookMapper;
import com.hsz.pojo.Books;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("bookService")
public class BookServiceImpl implements BookService {

    @Autowired
    private BookMapper bookMapper;

    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }

    public int addBook(Books books) {
        return bookMapper.addBook(books);
    }

    public int deleteBookById(int id) {
        return bookMapper.deleteBookById(id);
    }

    public int updateBook(Books books) {
        return bookMapper.updateBook(books);
    }

    public Books queryBookById(int id) {
        return bookMapper.queryBookById(id);
    }

    public List<Books> queryAllBook() {
        return bookMapper.queryAllBook();
    }

    public Books queryBookName(String bookName) {
        return bookMapper.queryBookName(bookName);
    }
}

配置文件,暂时结束!Controller 和 视图层编写

1、BookController 类编写 , 方法一:查询全部书籍

@Controller

@RequestMapping("/book")

public class BookController {

    @Autowired

    @Qualifier("BookServiceImpl")

    private BookService bookService;

    @RequestMapping("/allBook")

    public String list(Model model) {

        List<Books> list = bookService.queryAllBook();

        model.addAttribute("list", list);

        return "allBook";

    }

}

2、编写首页 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE HTML>

<html>

<head>

    <title>首页</title>

    <style type="text/css">

        a {

            text-decoration: none;

            color: black;

            font-size: 18px;

        }

        h3 {

            width: 180px;

            height: 38px;

            margin: 100px auto;

            text-align: center;

            line-height: 38px;

            background: deepskyblue;

            border-radius: 4px;

        }

    </style>

</head>

<body>

<h3>

    <a href="${pageContext.request.contextPath}/book/allBook">点击进入列表页</a>

</h3>

</body>

</html>

3、书籍列表页面 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>

4、BookController 类编写 , 方法二:添加书籍

@RequestMapping("/toAddBook")

public String toAddPaper() {

    return "addBook";

}

@RequestMapping("/addBook")

public String addPaper(Books books) {

    System.out.println(books);

    bookService.addBook(books);

    return "redirect:/book/allBook";

}

5、添加书籍页面: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>

    <div class="row">

        <div class="col-md-4 column">

            <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a>
            <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/allBook">显示全部书籍</a>

        </div>

        <div class="col-md-8 column">
            <%--查询书籍--%>
            <form class="form-inline" action="${pageContext.request.contextPath}/book/queryBook " method="post" style="float: right">

                <span style="color:red;font-weight:bold">${error}</span>
                <input type="" name="queryBookName" class="form-control" placeholder="请输入要查询的书籍名称">
                <input type="submit" value="查询" class="btn btn-primary">

            </form>

        </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>

6、BookController 类编写 , 方法三:修改书籍

@RequestMapping("/toUpdateBook")

public String toUpdateBook(Model model, int id) {

    Books books = bookService.queryBookById(id);

    System.out.println(books);

    model.addAttribute("book",books );

    return "updateBook";

}

@RequestMapping("/updateBook")

public String updateBook(Model model, Books book) {

    System.out.println(book);

    bookService.updateBook(book);

    Books books = bookService.queryBookById(book.getBookID());

    model.addAttribute("books", books);

    return "redirect:/book/allBook";

}

7、修改书籍页面 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>

8、BookController 类编写 , 方法四:删除书籍

@RequestMapping("/del/{bookId}")

public String deleteBook(@PathVariable("bookId") int id) {

    bookService.deleteBookById(id);

    return "redirect:/book/allBook";

}
  1. BookController 类编写 , 方法五:根据书名查询书籍
//查询书籍
    @RequestMapping("/queryBook")
    public String queryBook(String queryBookName,Model model){

        Books books = bookService.queryBookName(queryBookName);
        List<Books> list = new ArrayList<Books>();
        list.add(books);

        if (books == null){
            list = bookService.queryAllBook();
            model.addAttribute("error","未查到");
        }

        model.addAttribute("list",list);

        return "allBook";

    }

配置Tomcat,进行运行!

到目前为止,这个SSM项目整合已经完全的OK了,可以直接运行进行测试!这个练习十分的重要,大家需要保证,不看任何东西,自己也可以完整的实现出来!

项目结构图

img

img

效果图

小结及展望

第一个SSM整合案例,一定要烂熟于心!

SSM框架的重要程度是不言而喻的,学到这里,已经可以进行基本网站的单独开发。但是这只是增删改查的基本操作。可以说学到这里,才算是真正的步入了后台开发的门。也就是能找一个后台相关工作的底线。

或许很多人,工作就做这些事情,但是对于个人的提高来说,还远远不够!

前路漫漫,认真坚持最重要!

B站地址:https://www.bilibili.com/video/BV1aE41167Tu?p=19

posted @ 2020-10-30 20:39  han_sh_zh  阅读(130)  评论(0编辑  收藏  举报