当前位置: 首页 > news >正文

从头开始学SpringBoot—02ssmp整合及案例

《从头开始学SpringBoot》系列——第二篇

内容包括:

        1)SpringBoot实现ssmp整合

        2)SpringBoot整合ssmp的案例

目录

1.整合SSMP

1.1整合JUnit

1.2整合Mybatis

1.2.1导入对应的starter

1.2.2配置相关信息

1.2.3dao(或是mapper)测试

1.3整合MybatisPlus

1.3.1导入对应的starter

1.3.2配置相关信息

1.3.3定义数据层接口与映射配置

1.4整合Druid

1.4.1导入坐标

1.4.2修改配置

修改前

修改后

2.整合SSMP案例

2.1案例实现效果

2.2模块创建

2.2.1pom文件

2.2.2启动类

2.2.3配置文件

2.3实体类开发

2.3.1对应的表结构

2.3.2实体类

1)使用lombok加快实体类开发

2)domain

2.4数据层开发

2.4.1基础CRUD

①导入坐标

②配置信息

③使用BashMapper加速开发

④测试类进行测试

⑤运行结果

⑥查看mybatisplus运行日志

2.4.2分页功能制作

①拦截器开启

②使用Page对象

2.4.3条件查询功能制作

2.5业务层开发

2.5.1业务层标准开发

①BookService

②BookServiceImpl

③BookServiceTest

2.5.2业务层快速开发(不推荐)

①IBookService

②IBookServiceImpl

③IBookServiceTest

小结

2.6表现层开发

2.6.1标准版Service的Controller开发

①controller

2.6.2快速版Service的Controller开发

①controller2

2.6.3表现层消息一致性处理

①返回结果类

②修改后的表现层标准版开发

2.7前后端连通性测试

2.7.1拷贝前端页面

2.7.2启动资源

2.7.3测试钩子函数

2.8页面基础功能开发

2.8.1列表功能(非分页版)

2.8.2添加功能

①添加操作

②取消添加操作

2.8.3删除功能

2.8.4修改功能

①显示具体数据

②修改数据

修改操作

取消编辑操作

③修改功能小结

2.9业务消息一致性处理

2.9.1修改返回结果类

2.9.2表现层做统一的异常处理

2.10页面功能开发

2.10.1分页功能

①getAll

②分页组件

③分页数据模型

④页码切换

2.10.2删除功能维护

2.10.3条件查询功能

①页面封装查询条件字段

②页面添加字段对应的数据模型绑定名称

③将查询条件组织成url参数添加到请求地址中

④修改controller中分页查询方法

⑤修改service与impl的方法

1)service

2)serviceImpl

⑥结果


1.整合SSMP

1.1整合JUnit

1.导入测试对应的starter

2.测试类使用@SpringBootTest修饰

3.使用自动装配的形式添加要测试的对象

4.测试类如果存在于引导类所在包或子包中无需指定引导类

5.测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类

@SpringBootTest
class Springboot04JunitApplicationTests {//注入你要测试的对象@Autowiredprivate BookDao bookDao;@Testvoid contextLoads() {//执行要测试的对象对应的方法bookDao.save();System.out.println("two...");}
}

1.2整合Mybatis

1.2.1导入对应的starter

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

1.2.2配置相关信息

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

1.2.3dao(或是mapper)测试

 

1.3整合MybatisPlus

1.3.1导入对应的starter

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency>

1.3.2配置相关信息

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

 

1.3.3定义数据层接口与映射配置

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

 

1.4整合Druid

1.4.1导入坐标

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version></dependency>
</dependencies>

1.4.2修改配置

修改前

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

修改后

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

2.整合SSMP案例

2.1案例实现效果

2.2模块创建

2.2.1pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--继承且指定springboot的版本--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version></parent><artifactId>ssmp</artifactId><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><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.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2.2启动类

@SpringBootApplication
public class SSMPApplication {public static void main(String[] args) {SpringApplication.run(SSMPApplication.class,args);}
}

2.2.3配置文件

application.yml

server:port: 80spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

此时项目结构为

2.3实体类开发

2.3.1对应的表结构

-- ----------------------------
-- Table structure for tbl_book
-- ----------------------------
DROP TABLE IF EXISTS `tbl_book`;
CREATE TABLE `tbl_book`  (`id` int(11) NOT NULL AUTO_INCREMENT,`type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of tbl_book
-- ----------------------------
INSERT INTO `tbl_book` VALUES (1, '计算机理论', 'Spring实战 第5版', 'Spring入门经典教程,深入理解Spring原理技术内幕');
INSERT INTO `tbl_book` VALUES (2, '计算机理论', 'Spring 5核心原理与30个类手写实战', '十年沉淀之作,手写Spring精华思想');
INSERT INTO `tbl_book` VALUES (3, '计算机理论', 'Spring 5 设计模式', '深入Spring源码剖析Spring源码中蕴含的10大设计模式');
INSERT INTO `tbl_book` VALUES (4, '计算机理论', 'Spring MVC+MyBatis开发从入门到项目实战', '全方位解析面向Web应用的轻量级框架,带你成为Spring MVC开发高手');
INSERT INTO `tbl_book` VALUES (5, '计算机理论', '轻量级Java Web企业应用实战', '源码级剖析Spring框架,适合已掌握Java基础的读者');
INSERT INTO `tbl_book` VALUES (6, '计算机理论', 'Java核心技术 卷I 基础知识(原书第11版)', 'Core Java 第11版,Jolt大奖获奖作品,针对Java SE9、10、11全面更新');
INSERT INTO `tbl_book` VALUES (7, '计算机理论', '深入理解Java虚拟机', '5个维度全面剖析JVM,大厂面试知识点全覆盖');
INSERT INTO `tbl_book` VALUES (8, '计算机理论', 'Java编程思想(第4版)', 'Java学习必读经典,殿堂级著作!赢得了全球程序员的广泛赞誉');
INSERT INTO `tbl_book` VALUES (9, '计算机理论', '零基础学Java(全彩版)', '零基础自学编程的入门图书,由浅入深,详解Java语言的编程思想和核心技术');
INSERT INTO `tbl_book` VALUES (10, '市场营销', '直播就该这么做:主播高效沟通实战指南', '李子柒、李佳琦、薇娅成长为网红的秘密都在书中');
INSERT INTO `tbl_book` VALUES (11, '市场营销', '直播销讲实战一本通', '和秋叶一起学系列网络营销书籍');
INSERT INTO `tbl_book` VALUES (12, '市场营销', '直播带货:淘宝、天猫直播从新手到高手', '一本教你如何玩转直播的书,10堂课轻松实现带货月入3W+');

2.3.2实体类

1)使用lombok加快实体类开发

导入坐标

<!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

2)domain

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tbl_book")
public class Book {private Integer id;private String type;private String name;private String description;
}

2.4数据层开发

使用mybatisplus进行数据层的开发

2.4.1基础CRUD

①导入坐标

mybatisplus和druid的start以及mysql驱动(前面已经导入了)

<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.6</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

②配置信息

配置数据库连接相关的数据源配置(前面已经配置过了)

server:port: 80spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTCusername: rootpassword: root

③使用BashMapper加速开发

@Mapper
public interface BookDao extends BaseMapper<Book> {@Select("select * from tbl_book where id = #{id}")public Book getById(Integer id);
}

④测试类进行测试
@SpringBootTest
public class SSMPApplicationTest {@Autowiredprivate BookDao bookDao;//测试查询@Testpublic void test(){System.out.println(bookDao.selectById(1));//System.out.println(bookDao.getById(2));}//测试新增@Testpublic void test2(){Book book = new Book();book.setType("测试数据1");book.setName("测试数据1");book.setDescription("测试数据1");bookDao.insert(book);}//测试删除@Testpublic void test3(){System.out.println(bookDao.deleteById(53));}//测试修改@Testpublic void test4(){Book book = new Book();book.setId(54);book.setType("测试数据11");book.setName("测试数据11");book.setDescription("测试数据11");System.out.println("修改条数;" + bookDao.updateById(book));}//测试查询全部@Testpublic void test5(){List<Book> list = bookDao.selectList(null);for(Book book : list)System.out.println(book);}
}

mybatis-plus:global-config:db-config:id-type: auto  #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增

⑤运行结果

⑥查看mybatisplus运行日志

mybatis-plus:global-config:db-config:id-type: auto  #设置主键id字段的生成策略为参照数据库设定的策略,当前数据库设置id生成策略为自增configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #开启mybatisplus运行日志

2.4.2分页功能制作

①拦截器开启

@Configuration
public class MPConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

上述代码第一行是创建MyBatisPlus的拦截器栈,这个时候拦截器栈中没有具体的拦截器,第二行是初始化了分页拦截器,并添加到拦截器栈中。如果后期开发其他功能,需要添加全新的拦截器,按照第二行的格式继续add进去新的拦截器就可以了。

②使用Page对象
//测试分页查询
@Test
public void test6(){IPage page = new Page(2,5);bookDao.selectPage(page,null);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());    //详细数据
}

2.4.3条件查询功能制作

//测试条件查询
@Test
public void test7(){String name = "1";LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();lqw.like(Strings.isNotEmpty(name),Book::getName,name);List<Book> books = bookDao.selectList(lqw);for(Book book : books)System.out.println(book);
}

2.5业务层开发

组织业务逻辑功能,并根据业务需求,对数据持久层发起调用

2.5.1业务层标准开发

①BookService
public interface BookService {Boolean save(Book book);Boolean update(Book book);Boolean delevte(Integer id);Book getById(Integer id);List<Book> getAll();IPage<Book> getPage(int currentPage, int pageSize);
}

②BookServiceImpl
@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;@Overridepublic Boolean save(Book book) {return bookDao.insert(book) > 0;}@Overridepublic Boolean update(Book book) {return bookDao.updateById(book) > 0;}@Overridepublic Boolean delevte(Integer id) {return bookDao.deleteById(id) > 0;}@Overridepublic Book getById(Integer id) {return bookDao.selectById(id);}@Overridepublic List<Book> getAll() {return bookDao.selectList(null);}@Overridepublic IPage<Book> getPage(int currentPage, int pageSize) {IPage<Book> page = new Page<>(currentPage,pageSize);bookDao.selectPage(page,null);return page;}
}

③BookServiceTest
@SpringBootTest
public class BookServiceTest {@Autowiredprivate BookService bookService;//通过id获取一个数据@Testpublic void test1(){System.out.println(bookService.getById(3));}//获取全部数据@Testpublic void test2(){List<Book> all = bookService.getAll();for(Book book : all)System.out.println(book);}//根据id删除数据@Testpublic void test3(){System.out.println("删除:" + bookService.delevte(55));}//根据id修改数据@Testpublic void test4(){Book book = new Book(55,"修改2","修改2","修改2");System.out.println("修改:" + bookService.update(book));}//新增一条数据@Testpublic void test5(){Book book = new Book(null,"测试2","测试2","测试2");System.out.println("保存:" + bookService.save(book));}//分页查询@Testpublic void test6(){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());}
}

2.5.2业务层快速开发(不推荐)

①IBookService
public interface IBookService extends IService<Book> {
}

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

③IBookServiceTest
@SpringBootTest
public class IBookServiceTest {@Autowiredprivate IBookService iBookService;//测试根据id删除数据@Testpublic void test1(){Book byId = iBookService.getById(4);}}

小结

2.6表现层开发

2.6.1标准版Service的Controller开发

①controller
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;//获取全部数据@GetMapping()public List<Book> getAll(){return bookService.getAll();}//根据id获取数据@GetMapping("/{id}")public Book getById(@PathVariable Integer id){return bookService.getById(id);}//根据id删除数据@DeleteMapping("/{id}")public Boolean delete(@PathVariable Integer id){return bookService.delete(id);}//更新数据@PutMapping()public Boolean update(@RequestBody Book book){return bookService.update(book);}//保存数据@PostMapping()public Boolean save(@RequestBody Book book){return bookService.save(book);}//分页查询@GetMapping("/{currentPage}/{pageSize}")public IPage<Book> getPage(@PathVariable int currentPage, @PathVariable int pageSize){return bookService.getPage(currentPage,pageSize);}
}

 

2.6.2快速版Service的Controller开发

①controller2
@RestController
@RequestMapping("/books")
public class BookController2 {@Autowiredprivate IBookService iBookService;//获取全部数据@GetMapping()public List<Book> getAll(){return iBookService.list();}//根据id获取数据@GetMapping("/{id}")public Book getById(@PathVariable Integer id){return iBookService.getById(id);}//根据id删除数据@DeleteMapping("/{id}")public Boolean delete(@PathVariable Integer id){return iBookService.removeById(id);}//更新数据@PutMapping()public Boolean update(@RequestBody Book book){LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();lqw.eq(book.getId()!=null,Book::getId,book.getId());return iBookService.update(book,lqw);}//保存数据@PostMapping()public Boolean save(@RequestBody Book book){return iBookService.save(book);}//分页查询@GetMapping("/{currentPage}/{pageSize}")public IPage<Book> getPage(@PathVariable int currentPage,@PathVariable int pageSize){IPage<Book> page = new Page<>(currentPage,pageSize);return iBookService.page(page);}
}

2.6.3表现层消息一致性处理

前后端数据协议

①返回结果类

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

②修改后的表现层标准版开发
@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;//获取全部数据@GetMapping()public R getAll(){List<Book> list = bookService.getAll();return new R(true,list);}//根据id获取数据@GetMapping("/{id}")public R getById(@PathVariable Integer id){Book book = bookService.getById(id);return new R(true,book);}//根据id删除数据@DeleteMapping("/{id}")public R delete(@PathVariable Integer id){Boolean flag = bookService.delete(id);return new R(flag,null);}//更新数据@PutMapping()public R update(@RequestBody Book book){Boolean flag =  bookService.update(book);return new R(flag,null);}//保存数据@PostMapping()public R save(@RequestBody Book book){Boolean flag = bookService.save(book);return new R(flag,null);}//分页查询@GetMapping("/{currentPage}/{pageSize}")public R getPage(@PathVariable int currentPage, @PathVariable int pageSize){IPage<Book> page = bookService.getPage(currentPage, pageSize);return new R(true,page);}
}

 

2.7前后端连通性测试

2.7.1拷贝前端页面

将页面资源拷贝到resource里的static文件夹里

 

2.7.2启动资源

maven先clean一下,然后重启服务输入地址查看页面是否加载成功

 

2.7.3测试钩子函数

//钩子函数,VUE对象初始化完成后自动执行
created() {this.getAll();
},
methods: {//列表getAll() {axios.get("/books").then((res)=>{console.log(res.data);});},

2.8页面基础功能开发

2.8.1列表功能(非分页版)

列表功能主要操作就是加载完数据,将数据展示到页面上,此处要利用VUE的数据模型绑定,发送请求得到数据,然后页面上读取指定数据即可。

只需修改getAll方法

//列表
getAll() {axios.get("/books").then((res)=>{this.dataList = res.data.data;});
},

2.8.2添加功能

添加功能用于收集数据的表单是通过一个弹窗展示的,因此在添加操作前首先要进行弹窗的展示,添加后隐藏弹窗即可。因为这个弹窗一直存在,因此当页面加载时首先设置这个弹窗为不可显示状态,需要展示,切换状态即可。

 

①添加操作
//添加
handleAdd () {//发送异步请求axios.post("/books",this.formData).then((res)=>{//如果操作成功,关闭弹层,显示数据if(res.data.flag){this.dialogFormVisible = false;this.$message.success("添加成功");}else {this.$message.error("添加失败");}}).finally(()=>{this.getAll();});
},

②取消添加操作
//取消
cancel(){this.dialogFormVisible = false;this.$message.info("操作取消");
},

2.8.3删除功能

// 删除
handleDelete(row) {//1.弹出提示框this.$confirm("此操作永久删除当前数据,是否继续?","提示",{type:'info'}).then(()=>{//2.做删除业务axios.delete("/books/"+row.id).then((res)=>{if(res.data.flag){this.$message.success("删除成功");}else{this.$message.error("删除失败");}}).finally(()=>{this.getAll();});}).catch(()=>{//3.取消删除this.$message.info("取消删除操作");});
},

2.8.4修改功能
①显示具体数据
//弹出编辑窗口
handleUpdate(row) {axios.get("/books/"+row.id).then((res)=>{if(res.data.flag){//展示弹层,加载数据this.formData = res.data.data;this.dialogFormVisible4Edit = true;}else{this.$message.error("数据同步失败,自动刷新");}});
},

②修改数据
修改操作
//修改
handleEdit() {axios.put("/books",this.formData).then((res)=>{//如果操作成功,关闭弹层并刷新页面if(res.data.flag){this.dialogFormVisible4Edit = false;this.$message.success("修改成功");}else {this.$message.error("修改失败,请重试");}}).finally(()=>{this.getAll();});
},

取消编辑操作

③修改功能小结

2.9业务消息一致性处理

2.9.1修改返回结果类

2.9.2表现层做统一的异常处理

@RestControllerAdvice
public class ProjectExceptionAdvice {@ExceptionHandler(Exception.class)public R doOtherException(Exception ex){//记录日志//发送消息给运维//发送邮件给开发人员,ex对象发送给开发人员ex.printStackTrace();return new R(false,null,"系统错误,请稍后再试!");}
}

2.10页面功能开发

2.10.1分页功能

①getAll

修改getAll方法作为默认分页查询的方法

//列表
getAll() {// axios.get("/books").then((res)=>{//     this.dataList = res.data.data;// });axios.get("/books/"+this.pagination.currentPage+"/"+this.pagination.pageSize).then((res) => {this.pagination.total = res.data.data.total;this.pagination.currentPage = res.data.data.current;this.pagination.pagesize = res.data.data.size;this.dataList = res.data.data.records;});
},

②分页组件
<!--分页组件-->
<div class="pagination-container"><el-paginationclass="pagiantion"@current-change="handleCurrentChange":current-page="pagination.currentPage":page-size="pagination.pageSize"layout="total, prev, pager, next, jumper":total="pagination.total"></el-pagination>
</div>

③分页数据模型
data:{pagination: {    //分页相关模型数据currentPage: 1,    //当前页码pageSize:10,    //每页显示的记录数total:0,        //总记录数}
},

④页码切换
//切换页码
handleCurrentChange(currentPage) {this.pagination.currentPage = currentPage;this.getAll();
},

2.10.2删除功能维护

修改bug:最后一页删除数据后,分页查询页码超出范围

修改分页查询的controller

//分页查询
@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage, @PathVariable int pageSize){IPage<Book> page = bookService.getPage(currentPage, pageSize);if(currentPage > page.getPages()) {page = bookService.getPage((int) page.getPages(), pageSize);}return new R(true,page);
}

2.10.3条件查询功能

①页面封装查询条件字段
pagination: {//分页相关模型数据currentPage: 1,//当前页码pageSize:4,//每页显示的记录数total:0,//总记录数name: "",type: "",description: ""
}

②页面添加字段对应的数据模型绑定名称
<div class="filter-container"><el-input placeholder="图书类别" style="width: 200px;" v-model="pagination.type" class="filter-item"></el-input><el-input placeholder="图书名称" style="width: 200px;" v-model="pagination.name" class="filter-item"></el-input><el-input placeholder="图书描述" style="width: 200px;" v-model="pagination.description" class="filter-item"></el-input><el-button @click="getAll()" class="dalfBut">查询</el-button><el-button type="primary" class="butT" @click="handleCreate()">新建</el-button>
</div>

③将查询条件组织成url参数添加到请求地址中
getAll() {// axios.get("/books").then((res)=>{//     this.dataList = res.data.data;// });//获取查询条件,拼接查询条件param = "?name="+this.pagination.name;param += "&type="+this.pagination.type;param += "&description="+this.pagination.description;console.log("-----------------"+ param);axios.get("/books/"+this.pagination.currentPage+"/"+this.pagination.pageSize + param).then((res) => {this.pagination.total = res.data.data.total;this.pagination.currentPage = res.data.data.current;this.pagination.pagesize = res.data.data.size;this.dataList = res.data.data.records;});
},

④修改controller中分页查询方法
//分页查询
@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage, @PathVariable int pageSize,Book book){System.out.println("参数=====>"+book);IPage<Book> page = bookService.getPage(currentPage, pageSize, book);if(currentPage > page.getPages()) {page = bookService.getPage((int) page.getPages(), pageSize, book);}return new R(true,page);
}

⑤修改service与impl的方法
1)service
IPage<Book> getPage(int currentPage, int pageSize, Book queryBook);

2)serviceImpl
@Override
public IPage<Book> getPage(int currentPage, int pageSize, Book queryBook) {IPage<Book> page = new Page<>(currentPage,pageSize);LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();lqw.like(Strings.isNotEmpty(queryBook.getName()),Book::getName,queryBook.getName());lqw.like(Strings.isNotEmpty(queryBook.getType()),Book::getType,queryBook.getType());lqw.like(Strings.isNotEmpty(queryBook.getDescription()),Book::getDescription,queryBook.getDescription());bookDao.selectPage(page,lqw);return page;
}

⑥结果

内容来源于黑马、尚硅谷教程,仅作为学习笔记参考

 

相关文章:

从头开始学SpringBoot—02ssmp整合及案例

《从头开始学SpringBoot》系列——第二篇 内容包括&#xff1a; 1&#xff09;SpringBoot实现ssmp整合 2&#xff09;SpringBoot整合ssmp的案例 目录 1.整合SSMP 1.1整合JUnit 1.2整合Mybatis 1.2.1导入对应的starter 1.2.2配置相关信息 1.2.3dao&#xff08;或是mapper&…...

0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点

1502.判断是否能形成等差数列 题目 给你一个数字数组 arr 。 如果一个数列中&#xff0c;任意相邻两项的差总等于同一个常数&#xff0c;那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列&#xff0c;请返回 true &#xff1b;否则&#xff0c;返回 false…...

Vulnhub靶机——AI-WEB-1

目录 一、实验环境 1.1 攻击机Kali 1.2 靶机下载 二、站点信息收集 2.1 IP扫描 2.2 端口扫描 2.3 目录扫描 三、漏洞利用 3.1 SQL注入 3.2 文件上传 四、权限提升 4.1 nc反弹连接 4.2 切换用户 一、实验环境 1.1 攻击机Kali 在虚拟机中安装Kali系统并作为攻击机 1.2 靶机下载 (…...

无人系统:未来科技的智能化代表

无人系统&#xff08;Unmanned Systems&#xff09;是指在不依赖人类直接干预的情况下&#xff0c;通过自主或远程控制方式完成任务的系统。随着科技的不断进步&#xff0c;特别是在人工智能、机器人学、传感技术、通信技术等领域的突破&#xff0c;无人系统在各行各业中得到了…...

在Docker中部署DataKit最佳实践

本文主要介绍如何在 Docker 中安装 DataKit。 配置和启动 DataKit 容器 登陆观测云平台&#xff0c;点击「集成」 -「DataKit」 - 「Docker」&#xff0c;然后拷贝第二步的启动命令&#xff0c;启动参数按实际情况配置。 拷贝启动命令&#xff1a; sudo docker run \--hostn…...

进程的状态 ─── linux第11课

目录 ​编辑 补充知识: 1.并行和并发 分时操作系统&#xff08;Time-Sharing Systems&#xff09; 实时操作系统&#xff08;Real-Time Systems&#xff09; 进程的状态(操作系统层面) ​编辑 运行状态 阻塞状态 状态总结: 挂起状态 linux下的进程状态 补充知识: …...

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…...

什么是 jQuery

一、jQuery 基础入门 &#xff08;一&#xff09;什么是 jQuery jQuery 本质上是一个快速、小巧且功能丰富的 JavaScript 库。它将 JavaScript 中常用的功能代码进行了封装&#xff0c;为开发者提供了一套简洁、高效的 API&#xff0c;涵盖了 HTML 文档遍历与操作、事件处理、…...

Redis Desktop Manager(Redis可视化工具)安装及使用详细教程

一、安装包下载 直接从官网下载&#xff0c;官网下载链接地址&#xff1a;Downloads - Redis 二、安装步骤 2.1说明 Redis Desktop Manager是一款简单快速、跨平台的Redis桌面管理工具&#xff0c;也也被称作Redis可视化工具。 支持命令控制台操作&#xff0c;以及常用&…...

[KEIL]单片机技巧 01

1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义&#xff0c;可以解决90%以上的单纯的片内外设bug&#xff0c;学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步&#xff0c;一定要善于使用这个工具&#xff0c;而不是外设…...

云原生监控篇——全链路可观测性与AIOps实战

引言&#xff1a;监控即生命线 2023年某全球支付平台因一次未被捕获的数据库连接泄漏&#xff0c;导致每小时损失120万美元。而另一家社交巨头通过实时异常检测系统&#xff0c;在30秒内自动隔离了大规模DDoS攻击。这两个案例揭示了云原生时代的核心生存法则——监控不是可选项…...

C# 13与.NET 9革新及工业开发应用

摘要 微软推出的C# 13与.NET 9以“高效且智能”为导向&#xff0c;具备扩展类型、半自动属性、锁对象优化等十大革新。本文深入剖析新特性于工业级开发的应用场景&#xff0c;包含性能优化策略、AI集成方案以及EF Core实战技巧&#xff0c;为开发者提供从理论到实践的完整指引…...

Linux系统之DHCP网络协议

目录 一、DHCP概述 二、DHCP部署实操 2.1、安装DHCP软件 2.2、拷贝配置文件 2.3、配置文件详解 2.4、重启软件服务 2.5、新开一台服务器&#xff0c;查看dhcp地址获取 一、DHCP概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种应用层网络协…...

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么&#xff0c;在 NAT 环境下&#xff0c;应该如何让内网设备做为服务器&#xff0c;使内网设备被外部连接&#xff1f; 1 多拨 部分运营商&#xff0c;支持在多个设备上&#xff0c;通过 PPPoE 登录同一个宽带账…...

【C++/数据结构】栈

零.导言 栈是一种数据结构&#xff0c;在后续的学习中可能经常使用&#xff0c;因此我们今天就来学习如何实现栈&#xff0c;以更好地使用它。 一.栈的实现 栈的形式如下&#xff1a; #include<iostream> #include<cassert>using namespace std;typedef int Stack…...

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…...

【软路由】ImmortalWrt 编译指南:从入门到精通

对于喜欢折腾路由器&#xff0c;追求极致性能和定制化的玩家来说&#xff0c;OpenWrt 无疑是一个理想的选择。而在众多 OpenWrt 衍生版本中&#xff0c;ImmortalWrt 以其更活跃的社区、更激进的特性更新和对新硬件的支持而备受关注。 本文将带你深入了解 ImmortalWrt&#xff0…...

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…...

第2章 windows故障排除(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第2章开始带你入门了&#xff0c;这里给出了几个windows重要的工具&#xff0c;说实话&#xff0c;好多我也是第一…...

深度学习笔记——线性回归的从0开始实现

记录学习到的知识&#xff1a; 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程&#xff0c;它将数字图像分成多个片段&#xff0c;并对每个区域中包含的信息进行分类。三种图像分割…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...