从头开始学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》系列——第二篇 内容包括: 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&…...
0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点
1502.判断是否能形成等差数列 题目 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 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 靶机下载 (…...

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

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

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

MySQL数据库基本概念
目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…...
什么是 jQuery
一、jQuery 基础入门 (一)什么是 jQuery jQuery 本质上是一个快速、小巧且功能丰富的 JavaScript 库。它将 JavaScript 中常用的功能代码进行了封装,为开发者提供了一套简洁、高效的 API,涵盖了 HTML 文档遍历与操作、事件处理、…...

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

[KEIL]单片机技巧 01
1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设…...
云原生监控篇——全链路可观测性与AIOps实战
引言:监控即生命线 2023年某全球支付平台因一次未被捕获的数据库连接泄漏,导致每小时损失120万美元。而另一家社交巨头通过实时异常检测系统,在30秒内自动隔离了大规模DDoS攻击。这两个案例揭示了云原生时代的核心生存法则——监控不是可选项…...
C# 13与.NET 9革新及工业开发应用
摘要 微软推出的C# 13与.NET 9以“高效且智能”为导向,具备扩展类型、半自动属性、锁对象优化等十大革新。本文深入剖析新特性于工业级开发的应用场景,包含性能优化策略、AI集成方案以及EF Core实战技巧,为开发者提供从理论到实践的完整指引…...

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

【Linux】【网络】不同子网下的客户端和服务器通信其它方式
【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接? 1 多拨 部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账…...
【C++/数据结构】栈
零.导言 栈是一种数据结构,在后续的学习中可能经常使用,因此我们今天就来学习如何实现栈,以更好地使用它。 一.栈的实现 栈的形式如下: #include<iostream> #include<cassert>using namespace std;typedef int Stack…...

Qt 对象树详解:从原理到运用
1. 什么是对象树? 对象树是一种基于父子关系的对象管理机制。在 Qt 中,所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时,子对象会被添加到父对象的内部列表中,形成一种树状结构。 Qt 提…...
【软路由】ImmortalWrt 编译指南:从入门到精通
对于喜欢折腾路由器,追求极致性能和定制化的玩家来说,OpenWrt 无疑是一个理想的选择。而在众多 OpenWrt 衍生版本中,ImmortalWrt 以其更活跃的社区、更激进的特性更新和对新硬件的支持而备受关注。 本文将带你深入了解 ImmortalWrt࿰…...

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】
智能音频眼镜,作为一款将时尚元素与前沿科技精妙融合的智能设备,这种将音频技术与眼镜形态完美结合的可穿戴设备,不仅解放了用户的双手,更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用,为音…...

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

深度学习笔记——线性回归的从0开始实现
记录学习到的知识: 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程,它将数字图像分成多个片段,并对每个区域中包含的信息进行分类。三种图像分割…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...