springmvc和ssm项目结合书籍


此项目是结合springmvc和mybatis的整合,适合新手练习项目

1.编译环境及工具

  • IDEA
  • MySQL 8.0
  • Tomcat 9
  • Maven 4.0

2. 数据库表设计

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

3.项目环境搭建

新建一个maven 的web项目,在pom.xml中导入依赖


      junit
      junit
      4.11
      test


   
    
      javax.servlet
      servlet-api
      2.5
    

    
      javax.servlet.jsp
      jsp-api
      2.2
    

    
      javax.servlet
      jstl
      1.2
    

  
	 
      org.springframework
      spring-webmvc
      5.3.9
    

   
	
            mysql
            mysql-connector-java
            8.0.15
        

        
        
            com.mchange
            c3p0
            0.9.5.5
        

	 
        
            org.mybatis
            mybatis
            3.5.2
        
        
        
            org.mybatis
            mybatis-spring
            2.0.6
        

        
        
            org.springframework
            spring-jdbc
            5.3.10
        

        
            org.projectlombok
            lombok
            1.18.22
        

3.静态资源问题

在pom.xml文件中编写如下:


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

4.创建基本项目结构

  • pojo
  • mapper
  • service
  • controller
  • mybatis-config.xml

4.1 在pojo包下创建实体类(注意类属性和数据库字段同名)

package pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor // 无参
@AllArgsConstructor  // 有参
public class MyBook {
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;
}

4.2 在mapper包下创建操作书籍的接口及对应的方法

4.2.1 Bookmapper接口

package mapper;

import org.apache.ibatis.annotations.Param;
import pojo.MyBook;

import java.util.List;

public interface Bookmapper {
    //增加一个Book
    int addBook(MyBook book);

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

    //更新Book
    int updateBook(MyBook book);

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

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

}

4.2.2 配置Bookmapper.xml文件

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


 

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

    
    
        delete from books where bookID=#{bookID}
    

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

    
    

    
    


4.3 在service包下操作mapper接口和创建service实现类

4.3.1 BookService接口(其实就是Bookmapper接口的方法)

package service;
import pojo.MyBook;
import java.util.List;

public interface BookService {
    //增加一个Book
    int addBook(MyBook book);

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

    //更新Book
    int updateBook(MyBook book);

    //根据id查询,返回一个Book
    MyBook queryBookById(int id);

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

4.3.2 BookService实现类BookServiceImpl

package service;

import mapper.Bookmapper;
import pojo.MyBook;

import java.util.List;

public class BookServiceImpl implements BookService{
    //调用dao层的操作,设置一个set接口,方便Spring管理
    private Bookmapper bookMapper;

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

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

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

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

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

    public List queryAllBook() {
        return bookMapper.queryAllBook();
    }
}

4.4 配置mybatis-config.xml文件,并绑定mapper.xml

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


	  
    
        
    
    
     
    
         
         
         
        
    


5.配置文件的编写

项目采用分开配置结构,便于spring容器管理

  • db.properties 数据库的配置
  • spring-mapper.xml dao配置操作数据库的 数据源(dataSource)数据配置文件sqlSessionFactory 和相应的mapper扫描包
  • spring-service.xml service 配置相应的service扫描包,配置事务管理
  • spring-mvc.xml 配置controller扫描包 和视图解析器
  • applicationContext.xml 整合mapper,service,mvc的全局配置文件

5.1 db.properties设置

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
# 注意不能写成username,在这里踩过坑
user=root
password=root

5.2 配置spring-mapper.xml

   
    
    
    
    
    
        
        
        
        
        

        
        
        
        
        
        
        
        
        
    
	 
    
        
        
        
        
    

  
    
    
        
        
        
        
    

5.3 配置spring-service.xml

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


    
    
    
    
        
    

    
    
        
        
    


5.4 spring-mvc.xml

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


    
    
    
    
    

    
    
        
        
        
    
    
    
        
            
                
            
            
                
                    
                        
                    
                
            
        
    

    
    


5.5 applicationContext.xml配置

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


    
    
    

6 web.xml配置和controller的编写

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

6.2 Bookcontroller配置

package controller;

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 pojo.MyBook;
import service.BookService;
import java.util.List;

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

    @RequestMapping("/allBook")
    public String list(Model model) {
        List list = bookService.queryAllBook();
        model.addAttribute("list", list);
        return "allBook";
    }

    @RequestMapping("/addBook")
    public String addPaper(MyBook book) {
        System.out.println(book);
        bookService.addBook(book);
        return "redirect:/book/allBook";
    }

    @RequestMapping("/toUpdateBook")
    public String toupdateBook(Model model,int id) {
        MyBook book = bookService.queryBookById(id);
        System.out.println(book);
        model.addAttribute("book",book);
        return "updateBook";
    }


    @RequestMapping("/updateBook")
    public String updateBook(Model model,MyBook book) {
        System.out.println(book);
        bookService.updateBook(book);
        //MyBook books = bookService.queryBookById(book.getBookID());
        model.addAttribute("books", book);
        return "redirect:/book/allBook";
    }

    @RequestMapping("/del/{bId}")
    public String deleteBook(@PathVariable("bId") int id) {
        bookService.deleteBookById(id);
        return "redirect:/book/allBook";
    }
}

7. 遇到的坑

7.1 配置文件管理,否则bookmapper找不到

7.2 web.xml 配置的理应是全局文件

7.3 lib库没有导入

8.结果显示