SSMP整合案例

黑马程序员Spring Boot2

1、创建项目

1.1 新建项目

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

1.2 整合 MyBatis Plus

  1. 访问 https://mvnrepository.com/ 搜索 mybatis plus 选择第一个,选择一个版本,复制其坐标,粘贴到pom.xml,刷新maven

在这里插入图片描述

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
  1. 修改配置文件为yml格式

2、创建表以及对应的实体类

2.1 创建表

# 创建数据库
create database ssm;
# 使用数据库
use ssm;
# 创建表book
create table book(
    id int primary key , # 书id,主键
    type varchar(32), # 类型
    name varchar(32), # 书名
    description varchar(256) # 描述
);
# 查询测试
select * from book;
# 向表中插入16条数据
insert into book value (1,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (2,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (3,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (4,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (5,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (6,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (7,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (8,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (9,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (10,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (11,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (12,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (13,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (14,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (15,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕'),
        (16,'计算机理论','Spring实战 第5版','Spring入门经典教程,深入理解Spring原理技术内幕');

2.2 创建实体类

2.2.1 引入lombok,简化实体类开发

  1. 在 pom.xml 中引入 lombok 的坐标
    在这里插入图片描述
<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.18.20.0</version>
            <scope>provided</scope>
        </dependency>

2.2.2 开发实体类

  1. 新建pojo 包,新建Book 类
package com.itheima.pojo;

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

@Data // get/set方法、toString方法、hshCode方法、equals方法
@AllArgsConstructor //全参构造函数
@NoArgsConstructor // 无参构造函数
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

3、数据层开发

  • 技术实现方案
    • MyBatisPlus
    • Druid

3.1 手动导入两个坐标

在这里插入图片描述

 <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.23</version>
        </dependency>

3.2 配置数据源与MyBatisPlus对应的配置

在这里插入图片描述

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbcmysql://localhost:3306/mytails
      username: root
      password: 123456

3.3 开发Dao接口(继承BaseMapper)

package com.itheima.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.pojo.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BookDao extends BaseMapper<Book> {
}

3.4 制作测试类测试Dao功能是否有效

package com.itheima.dao;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTest {
    @Autowired
    BookDao bookDao;
    @Test
    public void getById(){
        System.out.println(bookDao.selectById(1));
    }
}

3.5 遇到问题

  1. 报错信息如下
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookDao' defined in file [E:\IDEA\IDEA2023-zhuanye\project\heima\SpringBoot2\springboot-ssmp\springboot-ssmp\target\classes\com\itheima\dao\BookDao.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.parsePendingMethods(Z)V
  1. 解决方法
    • mybatis plus 的版本太高了,降低一下版本即可

3.5 开启MyBatis Plus的日志

  • 为方便调试可以开启MyBatis Plus的日志
    在这里插入图片描述
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.6 分页功能的视线

  1. 分页操作依赖MyBatisPlus分页拦截器实现功能
    • 创建一个包config ,在包下创建MPConfig类,类中代码如下

在这里插入图片描述

  • 分页操作师在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
package com.itheima.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 定义拦截器
        MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();
        // 添加具体拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

  1. 使用IPage封装分页数据
  • 分页查询代码
    在这里插入图片描述
@Test
    void testGetPage(){
        IPage page=new Page(2,5);
        bookDao.selectPage(page,null);
    }
  • 分页操作需要设定分页对象IPage
  • IPage对象封装了分页操作中的所有数据
    • 数据
    • 当前页码值
    • 每页数据总量
    • 最大页码值
    • 数据总量

3.7 按照条件查询

 @Test
    void testGetBy(){
        String name="Spring";
        LambdaQueryWrapper<Book> lqw=new LambdaQueryWrapper<Book>();
        lqw.like(name!=null,Book::getName,name);
        bookDao.selectList(lqw);
    }

4、业务层开发

4.1 标准开发

  1. 新建包service,在该包下创建BookService接口
package com.itheima.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.pojo.Book;

import java.util.List;

public interface BookService {
    boolean save(Book book);// 插入数据
    boolean delete(Integer id);// 根据id删除
    boolean update(Book book);// 更新数据
    Book getByAd(Integer id);// 根据id查询单个用户
    List<Book> getAll();// 查询所有数据
    IPage<Book> getByPage(int currentPage,int pageSize);// 查询某一页信息
}

  1. 实现类定义
package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.dao.BookDao;
import com.itheima.pojo.Book;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    BookDao bookDao;

    /**
     * 插入数据
     * @param book
     * @return
     */
    @Override
    public boolean save(Book book) {
//        book.setId(17);
//        book.setName("测试数据1");
//        book.setType("测试数据1");
//        book.setDescription("测试数据1");
        return bookDao.insert(book)>0;
    }

    /**
     * 根据id删除数据
     * @param id
     * @return
     */
    @Override
    public boolean delete(Integer id) {
        return bookDao.deleteById(id)>0;
    }

    /**
     * 更新数据
     * @param book
     * @return
     */
    @Override
    public boolean update(Book book) {
        book.setId(17);
        book.setDescription("我是更新之后的数据");
        return bookDao.updateById(book)>0;
    }

    /**
     * 根据id查询单条数据
     * @param id
     * @return
     */
    @Override
    public Book getById(Integer id) {
        return bookDao.selectById(id);
    }

    /**
     * 查询所有数据
     * @return
     */
    @Override
    public List<Book> getAll() {
        return bookDao.selectList(null);
    }

    /**
     * 查询某一页的数据
     * @param currentPage
     * @param pageSize
     * @return
     */
    @Override
    public IPage<Book> getByPage(int currentPage, int pageSize) {
        IPage<Book> page=new Page(currentPage,pageSize);
        return bookDao.selectPage(page,null);
    }
}

  1. 测试类定义
package com.itheima.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.pojo.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTest {
    @Autowired
    BookService bookService;
    /**
     * 根据id查询单个
     */
    @Test
    public void getById(){
        System.out.println(bookService.getById(1));
    }

    /**
     * 新增数据
     */
    @Test
    public void testInsert(){
        Book book=new Book(17,"计算机理论","Spring实战 第5版","Spring入门经典教程 深入理解Spring 原理");
        bookService.save(book);
    }

    /**
     * 根据id删除数据
     */
    @Test
    public void testDelete(){
        bookService.delete(17);

    }

    /**
     * 更新数据
     */
    @Test
    public void testUpdate(){
        Book book=bookService.getById(16);
        book.setName("Spring实战");
        bookService.update(book);

    }

    /**
     * 查询所有数据
     */
    @Test
    public void testGetAll(){
        System.out.println(bookService.getAll());
    }

    /**
     * 查询某一页数据
     */
    @Test
    void testGetPage(){
        bookService.getByPage(2, 5);
    }
}

4.2 快速开发方案

  • 使用MyBatisPlus提供有业务层通用接口与业务层通用实现类
  • 在通用类基础上做功能重载或功能追加
  • 注意重载是不要覆盖原始操作,避免原始提供的功能丢失
  1. 接口定义
package com.itheima.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.pojo.Book;

public interface IBookService extends IService<Book> {
    // 可追加操作【可谁家大的操作与原始操作通过名称区分,功能类似】
}

  1. 实现类定义
package com.itheima.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.dao.BookDao;
import com.itheima.pojo.Book;
import com.itheima.service.IBookService;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl2 extends ServiceImpl<BookDao, Book> implements IBookService {
}

  1. 测试
package com.itheima.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.pojo.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTest2 {
    @Autowired
    IBookService bookService;
    /**
     * 根据id查询单个
     */
    @Test
    public void getById(){
        System.out.println(bookService.getById(1));
    }

    /**
     * 新增数据
     */
    @Test
    public void testInsert(){
        Book book=new Book(17,"计算机理论","Spring实战 第5版","Spring入门经典教程 深入理解Spring 原理");
        bookService.save(book);
    }

    /**
     * 根据id删除数据
     */
    @Test
    public void testDelete(){
        bookService.removeById(17);

    }

    /**
     * 更新数据
     */
    @Test
    public void testUpdate(){
        Book book=bookService.getById(16);
        book.setName("Spring实战");
        bookService.updateById(book);

    }

    /**
     * 查询所有数据
     */
    @Test
    public void testGetAll(){
        System.out.println(bookService.list());
    }

    /**
     * 查询某一页数据
     */
    @Test
    void testGetPage(){
        IPage<Book> page=new Page(2,5);
        bookService.page(page);
    }
}

5、表现层开发

  1. 基于Restful进行表现层接口开发
    • 新增:POST
    • 删除:DELETE
    • 修改:PUT
    • 查询:GET
  2. 接收参数
    • 实体数据:@RequestBody
    • 路径变量:@PathVariable

5.1 表现层代码

  1. 新建controller包,之后再该包下新建BookController类
package com.itheima.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.pojo.Book;
import com.itheima.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    IBookService bookService;

    /**
     * 查询全部数据
     * @return
     */
    @GetMapping
    public List<Book> getAll(){
        return bookService.list();
    }

    /**
     * 插入一条数据
     * @param book
     * @return
     */
    @PostMapping
    public Boolean save(@RequestBody Book book){
        return bookService.save(book);
    }

    /**
     * 更新数据
     * @param book
     * @return
     */
    @PutMapping
    public Boolean update(@RequestBody Book book){
        return bookService.updateById(book);
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Boolean delete(@PathVariable Integer id){
        return bookService.removeById(id);
    }

    /**
     * 分页查询
     * @param currentPage
     * @param pageSize
     * @return
     */
    @GetMapping("/{currentPage}/{pageSize}")
    public IPage<Book> getByPage(@PathVariable int currentPage,@PathVariable int pageSize){
        return bookService.getPage(currentPage,pageSize);
    }
}

5.2 表现层数据一致性处理

  1. 设计统一的返回值结果类型便于前端开发读取数据
  2. 返回值结构类型可以根据需求自行设定,没有固定格式
  3. 返回值结果类型类似于后端与前端进行数据格式统一,也称为前后端数据协议
  4. 统一返回结果例子
package com.itheima;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class R {
    private Boolean flag;
    private Object data;

}

6、前后端协议联调

  • 前后后端分离结构设计中页面归属前端服务器
  • 单体工程中页面放置在resources目录下的static目录中
    在这里插入图片描述
  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面为您介绍一个简单的Spring Boot + Mybatis Plus(SSMP)整合案例。 1. 首先,在pom.xml文件中添加以下依赖: ```xml <!--Spring Boot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Mybatis Plus 依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!--MySQL 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> ``` 2. 在application.properties中配置数据源: ```properties # 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 3. 创建一个实体类User,用于映射数据库中的user表: ```java @Data public class User { private Long id; private String name; private Integer age; private String email; } ``` 4. 创建UserMapper接口,用于定义数据库操作: ```java public interface UserMapper extends BaseMapper<User> { } ``` 5. 创建UserService类,用于定义业务逻辑: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> selectList() { return userMapper.selectList(null); } public User selectById(Long id) { return userMapper.selectById(id); } public int insert(User user) { return userMapper.insert(user); } public int update(User user) { return userMapper.updateById(user); } public int delete(Long id) { return userMapper.deleteById(id); } } ``` 6. 创建UserController类,用于处理HTTP请求: ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public List<User> selectList() { return userService.selectList(); } @GetMapping("/{id}") public User selectById(@PathVariable Long id) { return userService.selectById(id); } @PostMapping public int insert(@RequestBody User user) { return userService.insert(user); } @PutMapping public int update(@RequestBody User user) { return userService.update(user); } @DeleteMapping("/{id}") public int delete(@PathVariable Long id) { return userService.delete(id); } } ``` 7. 启动应用程序,访问http://localhost:8080/user/list可以获取所有用户的列表,访问http://localhost:8080/user/1可以获取id为1的用户的详细信息。 以上就是一个简单的Spring Boot + Mybatis Plus(SSMP)整合案例,希望能帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值