SSM整合测试


SSM 整合测试

目录
  • SSM 整合测试
    • 0、开始之前
    • 1、创建Maven项目并加入web支持(在项目上右键->Add Frameworks Support)
    • 2、依赖导入(注意资源过滤)
    • 3、项目结构
    • 4、Mybatis 层
    • 5、Spring层
    • 6、Spring-mvc层
    • 7、业务实现层 controller
          • 后端
          • 前端
    • 8、测试
    • 9、需要注意

项目源码:https://gitee.com/menghe999/ssmDemo

0、开始之前

软件环境: IDEA2018.3、 Maven3.5.3、 Tomcat 9.0.37、

建库建表:

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,'从进门到进牢');

1、创建Maven项目并加入web支持(在项目上右键->Add Frameworks Support)

image-20210605164626029

2、依赖导入(注意资源过滤)


   
   
       junit
       junit
       4.12
   
   
   
       mysql
       mysql-connector-java
       5.1.47
   
   
   
       com.mchange
       c3p0
       0.9.5.2
   

   
   
       javax.servlet
       servlet-api
       2.5
   
   
       javax.servlet.jsp
       jsp-api
       2.2
   
   
       javax.servlet
       jstl
       1.2
   

   
   
       org.mybatis
       mybatis
       3.5.2
   
   
       org.mybatis
       mybatis-spring
       2.0.2
   

   
   
       org.springframework
       spring-webmvc
       5.1.9.RELEASE
   
   
       org.springframework
       spring-jdbc
       5.1.9.RELEASE
   



    
        
            
                src/main/java
                
                    **/*.properties
                    **/*.xml
                
                false
            
            
                src/main/resources
                
                    **/*.properties
                    **/*.xml
                
                false
            
        
    

3、项目结构

├─java
│  └─com
│      └─example
│          ├─controller
│          │      BookController.java
│          │
│          ├─dao
│          │      BookMapper.java
│          │      BookMapper.xml
│          │
│          ├─pojo
│          │      Books.java
│          │
│          └─service
│                  BookService.java
│                  BookServiceImpl.java
│
└─resources
        applicationContext.xml
        database.properties
        mybatis-config.xml
        spring-dao.xml
        spring-mvc.xml
        spring-service.xml
        
        
    │─web
    │  index.jsp
    │
    └─WEB-INF
        │  web.xml
        │
        └─jsp
                addBook.jsp
                allBook.jsp
                updateBook.jsp

各层的主要作用

  • dao 主要操作数据库数据
  • pojo (plain ordinaty java object) 数据对象原型
  • service此层主要用于处理包含多个pojo对象(也就是数据表),进行事务管理(声明式事务管理),service层(其接口的实现类)被注入多个dao对象,以完成其数据操作。
  • controller主要用于和前端进行数据交互。

4、Mybatis 层

数据库连接配置

database.properties

这个文件主要配置数据连接的必须的参数

jdbc.driver=com.mysql.jdbc.Driver
#如果使用mysql 8.0+ 需要加时区设置 &serverTimezone=Asia/Shanghai
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=111111

Mybatis核心配置文件

mybatis-config.xml

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>



    
    
        
    

    
        
        
        
    

实体类的编写( 依赖lombok)

Books.java

package com.example.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.example.dao;

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

import java.util.List;

public interface BookMapper {
    //增加一个Book
    int addBook(Books book);

    //根据id删除一个Book
    int deleteBookById(@Param("bookId") int id);

    //更新Book
    int updateBook(Books books);

    //根据id查询,返回一个Book
    Books queryBookById(@Param("bookId") int id);

    //查询全部Book,返回list集合
    List queryAllBook();

    //查询书籍
    Books queryBookByName(@Param("bookName") String bookName);
}

编写接口对应的 Mapper.xml 文件。需要导入MyBatis的包

BookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>





    
    
      insert into ssmbuild.books(bookName,bookCounts,detail)
      values (#{bookName}, #{bookCounts}, #{detail})
   

    
    
      delete from ssmbuild.books where bookID=#{bookID}
   

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

    
    

    
    
	 
    

编写Service层的接口和实现类

BookService.java

package com.example.service;

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

import java.util.List;

//BookService:底下需要去实现,调用dao层
public interface BookService {
    //增加一个Book
    int addBook(Books book);
    //根据id删除一个Book
    int deleteBookById(int id);
    //更新Book
    int updateBook(Books books);
    //根据id查询,返回一个Book
    Books queryBookById(int id);
    //查询全部Book,返回list集合
    List queryAllBook();
    Books queryBookByName(String bookName);

}

BookServiceImpl.java

package com.example.service;

import com.example.dao.BookMapper;
import com.example.pojo.Books;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class BookServiceImpl implements BookService {
//    service 调用dao 组合dao

//调用dao层的操作,设置一个set接口,方便Spring管理
    private BookMapper bookMapper;

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

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

    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 queryAllBook() {
        return bookMapper.queryAllBook();
    }

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

5、Spring层

需要适配以下要求

  • 接管数据库连接
  • 配置数据源
  • 整合Mybatis(dao、service)

spring-dao.xml 编写 关联数据库、配置数据源c3p0

spring-dao.xml

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
        
        

    
    
    
    
    
        
        
        
        
    

spring-service.xml 的编写

spring-service.xml

<?xml version="1.0" encoding="UTF-8"?>

    
    

    
    
        
    

    
    
        
    
    
    
    

6、Spring-mvc层

此层主要用于controller层和前端的交互细节

web.xml

<?xml version="1.0" encoding="UTF-8"?>



    
    
        DispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:applicationContext.xml
        

        1
    
    
    
    
        DispatcherServlet
        /
    
    
    
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
    

    
    
        encodingFilter
        /*
    

    
        15
    
    

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
    
    
    
    
        
        
        
    
    
    


最后的配置文件 spring 的 applicationContext.xml 将整合以上dao service mvc

<?xml version="1.0" encoding="UTF-8"?>


        
        
        


项目模块属性

image-20210605164640291

基本的配置文件编写结束,接下来实现具体的业务(CURD)

7、业务实现层 controller

后端

controller.java

package com.example.controller;

import com.example.pojo.Books;
import com.example.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.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {
    //controller  --> service
    @Autowired
    @Qualifier("BookServiceImpl")    
    // 注:@Autowired  经常与 Qualifier 配合使用,用于Bean的注入
    private BookService bookService;


    //查询全部书籍
    @RequestMapping("/allBook")
    public String list(Model model){
        List list = bookService.queryAllBook();
        model.addAttribute("list", list);
        return "allBook";
    }

	
    @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";
    }

    @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";
    }
    @RequestMapping("/del/{bookId}")
    public String deleteBook(@PathVariable("bookId") int id) {
        bookService.deleteBookById(id);
        return "redirect:/book/allBook";
    }


    //查询
    @RequestMapping("/queryBook")
    public String queryBook(String queryBookName,Model model){
        Books books = bookService.queryBookByName(queryBookName);
        List list = new ArrayList();
        list.add(books);
        if(books== null){
            //如果未查到 显示全部书籍
            return "redirect:/book/allBook";
        }
        model.addAttribute("list", list);
        return "allBook";
    }
}

前端

页面编写(使用bootstrap)

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: MH
  Date: 2020/11/18
  Time: 22:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  
    首页
    
  
  
    

进入书籍页面

allBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: MH
  Date: 2020/11/21
  Time: 11:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    书籍列表
    
    
    


    
<%--seacher--%>
书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除

addBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: MH
  Date: 2020/11/21
  Time: 11:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    书籍列表
    
    
    


    
<%--seacher--%>
书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除

updateBook.jsp

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


    修改信息
    
    
    


书籍名称: 书籍数量: 书籍详情:

8、测试

? 配置Tomcat(因端口占用的问题配置为 10088),启动测试

image-20210605164703326

image-20210605164712999

运行测试

image-20210605164723671

9、需要注意

  • 项目开始的时候,创建lib目录并加入Library Files

    image-20210605164743900

  • web.xml 的servlet 配置注意,配置为applicationContext.xml

    image-20210605164758603

参考视频:https://www.bilibili.com/video/BV1RE41127rv?from=search&seid=2762745084734930132

参考文档:https://mp.weixin.qq.com/s/SDxqGu_il3MUCTcN1EYrng

ssm参考:http://mp.weixin.qq.com/mp/homepage?__biz=Mzg2NTAzMTExNg==&hid=3&sn=456dc4d66f0726730757e319ffdaa23e&scene=18#wechat_redirect

SSM