SSM 整合实战—— IDEA 版

1、ssm 整合:Mybatis 层

一、MyBatis 层核心目标

搭建 MyBatis 基础环境,编写实体类、Mapper 接口、Mapper 映射文件,实现数据库底层交互,为 Spring 整合做准备。

二、IDEA 项目结构(MyBatis 层)

复制代码
src/main/java
  └── com.example
      ├── pojo          # 实体类
      │   └── Book.java
      ├── mapper        # Mapper接口
      │   └── BookMapper.java
      └── service       # Service层接口(后续Spring层)
          └── BookService.java
src/main/resources
  ├── mapper            # MyBatis映射文件
  │   └── BookMapper.xml
  ├── mybatis-config.xml # MyBatis核心配置
  └── db.properties     # 数据库连接信息

三、核心代码实现

1. 数据库准备(ssm_db)

sql

复制代码
CREATE DATABASE ssm_db CHARACTER SET utf8mb4;
USE ssm_db;

CREATE TABLE books (
    id INT PRIMARY KEY AUTO_INCREMENT,
    bookName VARCHAR(100) NOT NULL,
    author VARCHAR(50) NOT NULL,
    price DOUBLE NOT NULL
);

INSERT INTO books (bookName, author, price) VALUES
("Spring实战", "Craig Walls", 79.00),
("MyBatis从入门到精通", "刘增辉", 69.00);
2. 实体类(Book.java)
复制代码
package com.example.pojo;

import lombok.Data;

@Data // Lombok简化代码,需安装插件
public class Book {
    private Integer id;
    private String bookName;
    private String author;
    private Double price;
}
3. Mapper 接口(BookMapper.java)
复制代码
package com.example.mapper;

import com.example.pojo.Book;
import java.util.List;

public interface BookMapper {
    // 查询所有书籍
    List<Book> queryAllBook();
    // 根据ID查询
    Book queryBookById(Integer id);
    // 添加书籍
    int addBook(Book book);
    // 修改书籍
    int updateBook(Book book);
    // 删除书籍
    int deleteBook(Integer id);
    // 搜索书籍(模糊查询)
    List<Book> searchBook(String bookName);
}
4. MyBatis 映射文件(BookMapper.xml)

xml

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.BookMapper">

    <!-- 查询所有书籍 -->
    <select id="queryAllBook" resultType="Book">
        SELECT * FROM books
    </select>

    <!-- 根据ID查询 -->
    <select id="queryBookById" parameterType="int" resultType="Book">
        SELECT * FROM books WHERE id = #{id}
    </select>

    <!-- 添加书籍 -->
    <insert id="addBook" parameterType="Book">
        INSERT INTO books (bookName, author, price)
        VALUES (#{bookName}, #{author}, #{price})
    </insert>

    <!-- 修改书籍 -->
    <update id="updateBook" parameterType="Book">
        UPDATE books
        SET bookName = #{bookName}, author = #{author}, price = #{price}
        WHERE id = #{id}
    </update>

    <!-- 删除书籍 -->
    <delete id="deleteBook" parameterType="int">
        DELETE FROM books WHERE id = #{id}
    </delete>

    <!-- 搜索书籍(模糊查询) -->
    <select id="searchBook" parameterType="string" resultType="Book">
        SELECT * FROM books WHERE bookName LIKE CONCAT('%', #{bookName}, '%')
    </select>

</mapper>
5. MyBatis 核心配置(mybatis-config.xml)

xml

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 环境配置(此处由Spring管理,此处可简化) -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器 -->
    <mappers>
        <mapper resource="mapper/BookMapper.xml"/>
    </mappers>

</configuration>
6. 数据库配置(db.properties)

properties

复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

2、ssm 整合:Spring 层

一、Spring 层核心目标

将 MyBatis 的核心组件(SqlSessionFactoryMapper)交给 Spring 容器管理,管理 Service 层 Bean,配置声明式事务,实现解耦与事务控制

二、Spring 核心配置(applicationContext.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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://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/tx
       https://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 1. 加载数据库配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!-- 2. 配置数据源(Druid连接池,推荐) -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 3. 配置SqlSessionFactory(MyBatis与Spring整合核心) -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 加载MyBatis核心配置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 加载Mapper映射文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!-- 配置别名 -->
        <property name="typeAliasesPackage" value="com.example.pojo"/>
    </bean>

    <!-- 4. 扫描Mapper接口,自动代理并注册为Bean(替代MyBatis生成代理) -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!-- 5. 扫描Service层,自动扫描并创建Bean -->
    <context:component-scan base-package="com.example.service"/>

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

    <!-- 7. 开启声明式事务注解支持 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

三、Service 层代码实现

1. Service 接口(BookService.java)
复制代码
package com.example.service;

import com.example.pojo.Book;
import java.util.List;

public interface BookService {
    List<Book> queryAllBook();
    Book queryBookById(Integer id);
    void addBook(Book book);
    void updateBook(Book book);
    void deleteBook(Integer id);
    List<Book> searchBook(String bookName);
}
2. Service 实现类(BookServiceImpl.java)
复制代码
package com.example.service.impl;

import com.example.mapper.BookMapper;
import com.example.pojo.Book;
import com.example.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

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

    // 自动注入Mapper
    @Autowired
    private BookMapper bookMapper;

    @Override
    public List<Book> queryAllBook() {
        return bookMapper.queryAllBook();
    }

    @Override
    public Book queryBookById(Integer id) {
        return bookMapper.queryBookById(id);
    }

    @Override
    @Transactional // 事务控制:添加操作
    public void addBook(Book book) {
        bookMapper.addBook(book);
    }

    @Override
    @Transactional // 事务控制:修改操作
    public void updateBook(Book book) {
        bookMapper.updateBook(book);
    }

    @Override
    @Transactional // 事务控制:删除操作
    public void deleteBook(Integer id) {
        bookMapper.deleteBook(id);
    }

    @Override
    public List<Book> searchBook(String bookName) {
        return bookMapper.searchBook(bookName);
    }
}

3、SSM 整合:SpringMVC 层

3.1 作用说明

SpringMVC 负责接收浏览器请求、调用 Service、跳转页面、返回数据,是整个 Web 项目的入口控制层。


3.2 配置 web.xml(核心)

路径:src/main/webapp/WEB-INF/web.xml

xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 1. 启动 Spring 根容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 2. 解决 POST 请求中文乱码 -->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 3. 配置 SpringMVC 前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3.3 配置 springmvc-servlet.xml

路径:src/main/resources/springmvc-servlet.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       https://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">

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

    <!-- 2. 开启 SpringMVC 注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 3. 静态资源放行(css/js/img) -->
    <mvc:default-servlet-handler/>

    <!-- 4. 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4、SSM 整合:查询所有书籍功能

4.1 编写 Controller

路径:com.controller.BookController.java

复制代码
package com.controller;

import com.pojo.Book;
import com.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    // 查询所有书籍
    @RequestMapping("/allBook")
    public String list(Model model) {
        List<Book> bookList = bookService.queryAllBook();
        model.addAttribute("bookList", bookList);
        return "bookList";
    }
}

4.2 编写书籍列表页面

路径:src/main/webapp/WEB-INF/pages/bookList.jsp

jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>书籍列表</title>
</head>
<body>
<h1>书籍信息</h1>
<a href="${pageContext.request.contextPath}/book/toAdd">添加书籍</a>

<table border="1">
    <tr>
        <th>书籍ID</th>
        <th>书籍名称</th>
        <th>书籍数量</th>
        <th>书籍详情</th>
        <th>操作</th>
    </tr>

    <c:forEach var="book" items="${bookList}">
        <tr>
            <td>${book.bookID}</td>
            <td>${book.bookName}</td>
            <td>${book.bookCounts}</td>
            <td>${book.detail}</td>
            <td>
                <a href="${pageContext.request.contextPath}/book/toUpdate?id=${book.bookID}">修改</a>
                &nbsp;|&nbsp;
                <a href="${pageContext.request.contextPath}/book/deleteBook?id=${book.bookID}">删除</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

5、SSM 整合:添加书籍功能

5.1 跳转到添加页面

复制代码
// 跳转到添加页面
@RequestMapping("/toAdd")
public String toAdd() {
    return "addBook";
}

5.2 编写添加页面 addBook.jsp

jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加书籍</title>
</head>
<body>
<h1>添加书籍</h1>

<form action="${pageContext.request.contextPath}/book/addBook" method="post">
    书籍名称:<input type="text" name="bookName" required><br/>
    书籍数量:<input type="text" name="bookCounts" required><br/>
    书籍描述:<input type="text" name="detail" required><br/>
    <input type="submit" value="添加">
</form>
</body>
</html>

5.3 执行添加

复制代码
// 添加书籍
@RequestMapping("/addBook")
public String addBook(Book book) {
    bookService.addBook(book);
    return "redirect:/book/allBook";
}

6、SSM 整合:修改书籍功能

6.1 跳转到修改页面(回显数据)

复制代码
// 跳转到修改页面
@RequestMapping("/toUpdate")
public String toUpdate(int id, Model model) {
    Book book = bookService.queryBookById(id);
    model.addAttribute("book", book);
    return "updateBook";
}

6.2 修改页面 updateBook.jsp

jsp

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>修改书籍</title>
</head>
<body>
<h1>修改书籍</h1>

<form action="${pageContext.request.contextPath}/book/updateBook" method="post">
    <input type="hidden" name="bookID" value="${book.bookID}">
    书籍名称:<input type="text" name="bookName" value="${book.bookName}"><br/>
    书籍数量:<input type="text" name="bookCounts" value="${book.bookCounts}"><br/>
    书籍描述:<input type="text" name="detail" value="${book.detail}"><br/>
    <input type="submit" value="修改">
</form>
</body>
</html>

6.3 执行修改

复制代码
// 修改书籍
@RequestMapping("/updateBook")
public String updateBook(Book book) {
    bookService.updateBook(book);
    return "redirect:/book/allBook";
}

7、SSM 整合:删除书籍功能

复制代码
// 删除书籍
@RequestMapping("/deleteBook")
public String deleteBook(int id) {
    bookService.deleteBookById(id);
    return "redirect:/book/allBook";
}

8、SSM 整合:查询书籍(模糊搜索)

8.1 Controller

复制代码
// 模糊查询
@RequestMapping("/queryBook")
public String queryBook(String queryBookName, Model model) {
    List<Book> bookList = bookService.queryBookByName(queryBookName);
    model.addAttribute("bookList", bookList);
    return "bookList";
}

8.2 在 bookList.jsp 中添加搜索框

jsp

复制代码
<form action="${pageContext.request.contextPath}/book/queryBook" method="post">
    <input type="text" name="queryBookName" placeholder="输入书籍名称">
    <input type="submit" value="搜索">
</form>

9、IDEA 部署 Tomcat 测试

  1. 配置 Tomcat 服务器
  2. 部署项目 war 包
  3. 启动访问:http://localhost:8080/book/allBook
相关推荐
子木HAPPY阳VIP2 小时前
【无标题】
java·python·mysql
砍材农夫2 小时前
spring-ai 第七模型介绍-向量模型
java·人工智能·spring
玛卡巴卡ldf2 小时前
【Springboot6】内存泄漏OOM、VisualVM、Arthas、Prometheus Grafana监控、垃圾回收
java·jvm·springboot
无心水2 小时前
2、5分钟上手|PyPDF2 快速提取PDF文本
java·linux·分布式·后端·python·架构·pdf
小元宝的专属厨师2 小时前
day08_LinkedList与队列栈
java
Han_han9193 小时前
案例二:交通工具调度系统(核心:继承 + 多态 + final + 方法重写)
java·开发语言
cch89183 小时前
Java vs 汇编:高级与低级的终极对决
java·开发语言·汇编
码上实战3 小时前
到底Java 适不适合做 AI 呢?
java·人工智能·后端·python·ai
如若1233 小时前
ERROR:pdf2zh.converter:‘str‘ object has no attribute ‘choices‘ converter.py:357
java·开发语言·servlet