一、案例实现方案分析
- 实体类开发——使用Lombok快速制作实体类
- Dao开发——整合MyBatisPlus,制作数据层测试类
- Service开发——基于MyBatisPlus进行增量开发,制作业务层测试类
- Controller开发——基于Restful开发,使用PostMan测试接口功能
- Controller开发——前后端开发协议制作
- 页面开发——基于VUE+ElementUI制作,前后端联通,页面数据处理,页面消息处理
- 列表、新增、修改、删除、分页、查询
- 项目异常处理
- 按条件查询——页面功能调整、Controller修正功能、Service修正功能
二、模块创建
此次项目先不做前后端分离
1. 创建一个新项目
勾选SpringMVC与MySQL坐标
2. pom添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
3. 修改配置文件为yml格式
#3.设置端口为80方便访问
server:
port: 80
4. 实体类
Lombok,一个Java类库,提供了一组注解,简化poJo实体类开发,可看相关博客:
第02讲:LomBok模板代码生成器_萧篱衣的博客-CSDN博客
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
常用注解:@Data
package com.jf.domain;
import lombok.Data;
@Data
public class Book {
private Integer id;
private String type;
private String name;
private String description;
}
为当前实体类在编译期设置对应的get/set方法,toString方法,hashCode方法,equals方法。@AllArgsConstructor 有参构造,@NoArgsConstructor 无参构造。
5. 数据层开发
5.1 配置yml
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/tbl_book?serverTimezone=UTC
username: root
password: 123123
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
5.2 创建数据层接口继承并指定泛型
使用MP写法
package com.jf.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jf.domain.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BookMapper extends BaseMapper<Book> {
}
5.3 建一个测试类校验代码是否正确
package com.jf.mapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookMapperTestCase {
@Autowired
private BookMapper bookMapper;
@Test
void testGetById(){
System.out.println(bookMapper.selectById(1));
}
}
5.4 启动
5.5 其他功能
5.5.1 添加功能
/**
* 添加
*/
@Test
void testSave(){
Book book = new Book();
book.setType("土地");
book.setName("测试123");
book.setDescription("测试123");
bookMapper.insert(book);
}
运行后会报错:
原因:
MP默认生成id的算法是雪花算法,而我们想要的是数据库默认的最基本的自增模式
解决办法:
yml直接配置
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
id-type: auto
5.5.2 修改功能
/**
* 修改
*/
@Test
void testUpdate(){
Book book = new Book();
book.setId(13);
book.setType("土地abcg");
book.setName("测试123");
book.setDescription("测试123");
bookMapper.updateById(book);
}
5.5.3 删除功能
/**
* 删除
*/
@Test
void testDelete(){
bookMapper.deleteById(13);
}
5.5.4 查询全部功能
/**
* 查询全部
*/
@Test
void testGetALL(){
System.out.println(bookMapper.selectList(null));
}
分页和根据条件查询后补
6. MP运行日志
6.1 yml配置
使用配置方式开启日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#设置日志输出方式为标准输出
7. 分页
/**
* 分页查询
*/
@Test
void testGetPage(){
IPage page = new Page(1,5);
//这里的1和5分别指第几页显示几条数据
bookMapper.selectPage(page,null);
}
问题:没有起到分页效果
原因:分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
解决办法:
package com.jf.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(){
//1.定义MP拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2.添加具体的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
小结:
8. 按条件查询
/**
* 根据条件查询
*/
@Test
void testGetBy(){
QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
//查询条件
queryWrapper.like("name","Spring");
bookMapper.selectList(queryWrapper);
}
但是上面这种写法一旦写错就无法识别,可以使用下面这种写法制动编译
/**
* 根据条件查询2
*/
@Test
void testGetBy2(){
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//查询条件
lambdaQueryWrapper.like(Book::getName,"Spring");
bookMapper.selectList(lambdaQueryWrapper);
}
这种写法在实际中还存在一个问题,就是如果获得数据为空,它当作字符进行查询,我们需要进行判断
@Test
void testGetBy2(){
String name = "1";
LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//查询条件
//lambdaQueryWrapper.like(Book::getName,"Spring");
lambdaQueryWrapper.like(name != null,Book::getName,name);
bookMapper.selectList(lambdaQueryWrapper);
}
使用Querywrapper对象封装查询条件,推荐使用LambdaQuerywrapper对象,所有查询操作封装成方法调用
9. 业务层开发
package com.jf.service;
import com.jf.domain.Book;
import java.util.List;
public interface IBookService {
Boolean save(Book book);
Boolean update(Book book);
Boolean delete(Integer id);
Book getById(Integer id);
List<Book> getAll();
}
9.1 定义实现类
package com.jf.service.impl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jf.domain.Book;
import com.jf.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements IBookService {
@Autowired
private BaseMapper baseMapper;
@Override
public Boolean save(Book book) {
return baseMapper.insert(book) > 0;
}
@Override
public Boolean update(Book book) {
return baseMapper.updateById(book) > 0;
}
@Override
public Boolean delete(Integer id) {
return baseMapper.deleteById(id) > 0;
}
@Override
public Book getById(Integer id) {
return (Book) baseMapper.selectById(id);
}
@Override
public List<Book> getAll() {
return baseMapper.selectList(null);
}
}
9.2 定义测试类
package com.jf.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jf.domain.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
private IBookService bookService;
@Test
void testGetById(){
System.out.println(bookService.getById(4));
}
@Test
void testSave(){
Book book = new Book();
book.setType("土地");
book.setName("测试123");
book.setDescription("测试123");
bookService.save(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(14);
book.setType("土地abcg");
book.setName("测试123");
book.setDescription("测试123");
bookService.update(book);
}
@Test
void testDelete(){
bookService.delete(14);
}
@Test
void testGetALL(){
bookService.getAll();
}
@Test
void testGetPage(){
IPage<Book> page = bookService.getPage(2, 5);
System.out.println(page.getCurrent());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.getPages());
System.out.println(page.getRecords());
}
}
9.3 快速开发
package com.jf.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jf.domain.Book;
public interface IBookService extends IService<Book> {
}
使用MyBatisPlus提供有业务层通用接口(ISerivce<T>)与业务层通用实现(ServiceImpl<M,T>
在通用类基础上做功能重载或功能追加
注意重载时不要覆盖原始操作,避免原始提供的功能丢失
package com.jf.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jf.domain.Book;
import com.jf.mapper.BookMapper;
import com.jf.service.IBookService;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
}
package com.jf.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jf.domain.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
private IBookService bookService;
@Test
void testGetById(){
System.out.println(bookService.getById(4));
}
@Test
void testSave(){
Book book = new Book();
book.setType("土地");
book.setName("测试123");
book.setDescription("测试123");
bookService.save(book);
}
@Test
void testUpdate(){
Book book = new Book();
book.setId(14);
book.setType("土地abcg");
book.setName("测试123");
book.setDescription("测试123");
bookService.updateById(book);
}
@Test
void testDelete(){
bookService.removeById(14);
}
@Test
void testGetALL(){
bookService.list();
}
@Test
void testGetPage(){
IPage<Book> page = new Page<>(2,5);
bookService.page(page);
System.out.println(page.getCurrent());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.getPages());
System.out.println(page.getRecords());
}
}
基于Spring Boot的SSMP整合案例中_萧篱衣的博客-CSDN博客
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111722.html