黑马程序员Spring Boot2
文章目录
- 1、创建项目
- 1.1 新建项目
- 1.2 整合 MyBatis Plus
- 2、创建表以及对应的实体类
- 2.1 创建表
- 2.2 创建实体类
- 2.2.1 引入lombok,简化实体类开发
- 2.2.2 开发实体类
- 3、数据层开发
- 3.1 手动导入两个坐标
- 3.2 配置数据源与MyBatisPlus对应的配置
- 3.3 开发Dao接口(继承BaseMapper)
- 3.4 制作测试类测试Dao功能是否有效
- 3.5 遇到问题
- 3.5 开启MyBatis Plus的日志
- 3.6 分页功能的视线
- 3.7 按照条件查询
- 4、业务层开发
- 4.1 标准开发
- 4.2 快速开发方案
- 5、表现层开发
- 5.1 表现层代码
- 5.2 表现层数据一致性处理
- 6、前后端协议联调
1、创建项目
1.1 新建项目
1.2 整合 MyBatis Plus
- 访问 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>
- 修改配置文件为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,简化实体类开发
- 在 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 开发实体类
- 新建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 遇到问题
- 报错信息如下
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
- 解决方法
- mybatis plus 的版本太高了,降低一下版本即可
3.5 开启MyBatis Plus的日志
- 为方便调试可以开启MyBatis Plus的日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.6 分页功能的视线
- 分页操作依赖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;
}
}
- 使用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 标准开发
- 新建包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);// 查询某一页信息
}
- 实现类定义
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);
}
}
- 测试类定义
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提供有业务层通用接口与业务层通用实现类
- 在通用类基础上做功能重载或功能追加
- 注意重载是不要覆盖原始操作,避免原始提供的功能丢失
- 接口定义
package com.itheima.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.pojo.Book;
public interface IBookService extends IService<Book> {
// 可追加操作【可谁家大的操作与原始操作通过名称区分,功能类似】
}
- 实现类定义
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 {
}
- 测试
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、表现层开发
- 基于Restful进行表现层接口开发
- 新增:POST
- 删除:DELETE
- 修改:PUT
- 查询:GET
- 接收参数
- 实体数据:@RequestBody
- 路径变量:@PathVariable
5.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 表现层数据一致性处理
- 设计统一的返回值结果类型便于前端开发读取数据
- 返回值结构类型可以根据需求自行设定,没有固定格式
- 返回值结果类型类似于后端与前端进行数据格式统一,也称为前后端数据协议
- 统一返回结果例子
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目录中