MyBatis-Plus的基本操作
目录
1、配置文件
1、添加依赖
2、启动类
3、实体类
4、添加Mapper类
5、测试Mapper接口
2、CRUD测试
1、insert添加
2、修改操作
3、删除操作
3、MyBatis-Plus条件构造器
4、knife4j
1、Swagger介绍
2、集成knife4j
3.添加依赖
4 添加knife4j配置类
5、 Controller层添加注解
6、测试
5、分页查询
1、配置分页插件
2、分页controller
3、测试
6、其他controller方法
7、统一异常处理
1、制造异常
2、全局异常处理
2.1、创建统一异常处理器
3、处理特定异常
1、添加异常处理方法
2、处理自定义异常
3、业务中需要位置抛出
4、添加异常处理方法
1、配置文件
sql语句
CREATE TABLE `sys_role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色id',
`role_name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名称',
`role_code` varchar(20) DEFAULT NULL COMMENT '角色编码',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`is_deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '删除标记(0:不可用 1:可用)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='角色';
1、添加依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version> </dependency>
2、配置 MySQL 数据库的相关配置及Mybatis-Plus日志
application.yml
spring:application:name: service-oaprofiles:active: dev
application-dev.yml
server:port: 8800 mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/guigu-oa?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8username: rootpassword: 123456
2、启动类
在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹:
package com.atguigu;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan;@SpringBootApplication @MapperScan("com.atguigu.auth.mapper") public class ServiceAuthApplication {public static void main(String[] args) {SpringApplication.run(ServiceAuthApplication.class, args);}}
3、实体类
已引入,实体类说明:
实体类注解详细文档:注解 | MyBatis-Plus
@TableName:表名注解,标识实体类对应的表
@TableId:主键注解,type = IdType.AUTO(数据库 ID 自增)
@TableField:字段注解(非主键)
@TableLogic:逻辑删除
package com.atguigu.model.system; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.atguigu.model.base.BaseEntity; import lombok.Data; @Data @TableName("sys_role") public class SysRole extends BaseEntity {private static final long serialVersionUID = 1L; //角色名称@TableField("role_name")private String roleName; //角色编码@TableField("role_code")private String roleCode; //描述@TableField("description")private String description; }
4、添加Mapper类
package com.atguigu.auth.mapper; import com.atguigu.model.auth.SysRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface SysRoleMapper extends BaseMapper<SysRole> { }
5、测试Mapper接口
//查询所有记录 @Test public void testSelectList() {//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper//所以不填写就是无任何条件List<SysRole> users = sysRoleMapper.selectList(null);System.out.println(users); }
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
2、CRUD测试
1、insert添加
1.1、示例
//添加操作 @Test public void add(){SysRole sysRole = new SysRole();sysRole.setRoleName("角色管理员1");sysRole.setRoleCode("role");sysRole.setDescription("角色管理员1");int insert = sysRoleMapper.insert(sysRole);System.out.println(insert);//影响行数System.out.println(sysRole.getId()); }
6.1.2、主键策略
1、ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
2、自增策略
-
要想主键自增需要配置如下主键策略
-
-
需要在创建数据表的时候设置主键自增
-
实体字段中配置 @TableId(type = IdType.AUTO)
-
@TableId(type = IdType.AUTO) private Long id;
其它主键策略:分析 IdType 源码可知
2、修改操作
@Test public void update(){//根据id查询SysRole role = sysRoleMapper.selectById(10);//设置修改值role.setRoleName("atguigu角色管理员");//调用方法实现最终修改int rows = sysRoleMapper.updateById(role);System.out.println(rows); }
3、删除操作
1、根据id删除
//删除操作 @Test public void deleteById(){int rows = sysRoleMapper.deleteById(10);System.out.println(rows); }
2、批量删除
//批量删除 @Test public void testDeleteBatchIds() {int result = sysRoleMapper.deleteBatchIds(Arrays.asList(1, 9));System.out.println(result); }
3、MyBatis-Plus条件构造器
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
注意:以下条件构造器的方法入参中的 column
均表示数据库字段
//条件查询 @Test public void restQuery1(){//创建QueryWrapper 对象,调用方法封装条件QueryWrapper<SysRole> wrapper = new QueryWrapper<>();wrapper.eq("role_name","管理员");//调用mp方法实现查询操作List<SysRole> list = sysRoleMapper.selectList(wrapper);System.out.println(list); }//条件查询 @Test public void restQuery2(){//创建LambdaQueryWrapper 对象,调用方法封装条件LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();wrapper.eq(SysRole::getRoleName,"管理员");//调用mp方法实现查询操作List<SysRole> list = sysRoleMapper.selectList(wrapper);System.out.println(list); }
其他条件构造可自行测试
4、knife4j
文档地址:Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
1、Swagger介绍
前后端分离开发模式中,api文档是最好的沟通方式。
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
1、及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)
2、规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)
3、一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)
4、可测性 (直接在接口文档上进行测试,以方便理解业务)
2、集成knife4j
knife4j属于service模块公共资源,因此我们集成到service-uitl模块
3.添加依赖
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId> </dependency>
4 添加knife4j配置类
package com.atguigu.common.config.knife4j;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;import java.util.ArrayList; import java.util.List;/*** @program: guigu-oa-perent* @description: knife4j配置信息* @author: Mr.Zhang* @create: 2023-04-06 11:40**/@Configuration @EnableSwagger2WebMvc public class Knife4jConfig {@Beanpublic Docket adminApiConfig() {List<Parameter> pars = new ArrayList<>();ParameterBuilder tokenPar = new ParameterBuilder();tokenPar.name("token").description("用户token").defaultValue("").modelRef(new ModelRef("string")).parameterType("header").required(false).build();pars.add(tokenPar.build());//添加head参数endDocket adminApi = new Docket(DocumentationType.SWAGGER_2).groupName("adminApi").apiInfo(adminApiInfo()).select()//只显示admin路径下的页面.apis(RequestHandlerSelectors.basePackage("com.atguigu")).paths(PathSelectors.regex("/admin/.*")).build().globalOperationParameters(pars);return adminApi;}private ApiInfo adminApiInfo() {return new ApiInfoBuilder().title("后台管理系统-API文档").description("本文档描述了后台管理系统微服务接口定义").version("1.0").contact(new Contact("atguigu", "http://atguigu.com", "2902352334@qq.com")).build();}}
5、 Controller层添加注解
package com.atguigu.auth.controller;import com.atguigu.auth.service.SysRoleService; import com.atguigu.common.result.Result; import com.atguigu.model.system.SysRole; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @program: guigu-oa-perent* @description: TODO* @author: Mr.Zhang* @create: 2023-04-06 11:09**/ @Api(tags = "角色管理接口") @RestController @RequestMapping("/admin/system/sysRole") public class SysRoleController {//路径//http://localhost:8800/admin/system/sysRole/findAll//注入service@Autowiredprivate SysRoleService sysRoleService;// //查询所有角色 // @GetMapping("/findAll") // public List<SysRole> finDAll(){ // //调用service的方法 // List<SysRole> list = sysRoleService.list(); // return list; // }//统一返回数据结果@ApiOperation("查询所有的角色")@GetMapping("/findAll")public Result finDAll() {//调用service的方法List<SysRole> list = sysRoleService.list();return Result.ok(list);}}
6、测试
http://localhost:8800/doc.html
5、分页查询
1、配置分页插件
说明:我们将@MapperScan("com.atguigu.auth.mapper")提取到该配置类上面,统一管理,启动类就不需要了。
package com.atguigu.common.config.mp;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /*** @program: guigu-oa-perent* @description: 分页查询* @author: Mr.Zhang* @create: 2023-04-06 11:51**/ @Configuration @MapperScan("com.atguigu.auth.mapper") public class MybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration -> configuration.setUseDeprecatedExecutor(false);} }
2、分页controller
/*** 条件分页查询* @param page 当前页* @param limit 每页显示记录数* @param sysRoleQueryVo 条件对象* @return*/ @ApiOperation("条件分页查询") @GetMapping("{page}/{limit}") public Result pageQueryRole(@PathVariable Long page,@PathVariable Long limit,SysRoleQueryVo sysRoleQueryVo) {//调用service的方法实现//1 创建Page对象,传递分页相关参数//page 当前页 limit 每页显示记录数Page<SysRole> pageParam = new Page<>(page, limit);//2 封装条件,判断条件是否为空,不为空进行封装LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();String roleName = sysRoleQueryVo.getRoleName();if (!StringUtils.isEmpty(roleName)) {//封装 like模糊查询wrapper.like(SysRole::getRoleName, roleName);}//3 调用方法实现IPage<SysRole> pageModel = sysRoleService.page(pageParam, wrapper);return Result.ok(pageModel); }
3、测试
6、其他controller方法
说明:通过knife4j测试接口 大家可以去测试一下
/*** 添加角色** @param role* @return*/ @ApiOperation("添加角色") @PostMapping("save") public Result save(@RequestBody SysRole role) {//调用service放入方法boolean is_success = sysRoleService.save(role);if (is_success) {return Result.ok();} else {return Result.fail();} }/*** 修改角色-根据id查询** @param id* @return*/ @ApiOperation(value = "根据id查询") @GetMapping("get/{id}") public Result get(@PathVariable Long id) {SysRole sysRole = sysRoleService.getById(id);return Result.ok(sysRole); }/*** 修改角色** @param role* @return*/ @ApiOperation("修改角色") @PutMapping("update") public Result update(@RequestBody SysRole role) {//调用service放入方法boolean is_success = sysRoleService.updateById(role);if (is_success) {return Result.ok();} else {return Result.fail();} }/*** 根据id删除* @param id* @return*/ @ApiOperation("根据id删除") @DeleteMapping("remove/{id}") public Result remove(@PathVariable Long id) {boolean is_success = sysRoleService.removeById(id);if (is_success) {return Result.ok();} else {return Result.fail();} }/*** 批量删除* @param idList* @return*/ @ApiOperation("批量删除") @DeleteMapping("batchRemove") public Result batchRemove(@RequestBody List<Long> idList){boolean is_success = sysRoleService.removeByIds(idList);if (is_success) {return Result.ok();} else {return Result.fail();} }
配置日期时间格式(不然测试响应的时间格式不一样)
application-dev.yml添加以下内容
jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8
7、统一异常处理
1、制造异常
除以0
int a = 10/0;
我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。
2、全局异常处理
2.1、创建统一异常处理器
package com.atguigu.common.config.execption;import com.atguigu.common.result.Result; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody;/*** @program: guigu-oa-perent* @description: 全局异常处理类* @author: Mr.Zhang* @create: 2023-04-07 09:37**/ @ControllerAdvice public class GlobalExceptionHandler {//全局异常处理,执行的方法@ExceptionHandler(Exception.class)@ResponseBodypublic Result error(){return Result.fail().message("执行了全局异常处理。。");} }
测试:
3、处理特定异常
1、添加异常处理方法
GlobalExceptionHandler.java中添加
//特定异常处理 @ExceptionHandler(Exception.class) @ResponseBody public Result error(ArithmeticException e){e.printStackTrace();return Result.fail().message("执行了特定异常处理"); }
2、处理自定义异常
package com.atguigu.common.config.execption;import com.atguigu.common.result.ResultCodeEnum; import lombok.Data;/*** @program: guigu-oa-perent* @description: 自定义全局异常类* @author: Mr.Zhang* @create: 2023-04-07 09:45**/ @Data public class GuiguException extends RuntimeException {//状态码private Integer code;//描述信息private String message;/*** 通过状态码和错误消息创建异常对象** @param code* @param message*/public GuiguException(Integer code, String message) {super(message);this.code = code;this.message = message;}/*** 接收枚举类型对象** @param resultCodeEnum*/public GuiguException(ResultCodeEnum resultCodeEnum) {super(resultCodeEnum.getMessage());this.code = resultCodeEnum.getCode();this.message = resultCodeEnum.getMessage();}@Overridepublic String toString() {return "GuliException{" +"code=" + code +", message=" + this.getMessage() +'}';} }
3、业务中需要位置抛出
//模拟异常效果 try {int i = 10/0; }catch (Exception e){//抛出自定义异常throw new GuiguException(2001,"执行了自定义异常处理"); }
4、添加异常处理方法
//自定义异常处理 @ExceptionHandler(GuiguException.class) @ResponseBody public Result error(GuiguException e){e.printStackTrace();return Result.fail().code(e.getCode()).message(e.getMessage()); }
测试:
相关文章:

MyBatis-Plus的基本操作
目录 1、配置文件 1、添加依赖 2、启动类 3、实体类 4、添加Mapper类 5、测试Mapper接口 2、CRUD测试 1、insert添加 2、修改操作 3、删除操作 3、MyBatis-Plus条件构造器 4、knife4j 1、Swagger介绍 2、集成knife4j 3.添加依赖 4 添加knife4j配置类 5、 Cont…...
HTTPAPI使用
1、使用浏览器 1.1、获取当前IP(限制 1200次 /小时) 用浏览器访问 http://ip.hahado.cn/current-ip 输入用户名和密码 [{"ip": "180.102.181.64","ttl": 262.87515091896057} ] "ip": 字段是当前的外网IP ("ip&qu…...

Windos下设置java项目开机自启动
这里是将java项目注册为Windows服务实现开机自启动。 查看.NET framework版本 因为使用winsw工具运行时需要使用.NET framework,基本上现在的win10系统带自带有.NET framework4.0,为了选择合适的版本,我们可以查看本机.NET Framework版本,根…...

(链表)移除链表元素(双指针法)
文章目录前言:问题描述:解题思路(双指针法):代码实现:总结:前言: 此篇是针对链表的经典练习题。 问题描述: 给你一个链表的头节点 head 和一个整数 val ,请…...
Raft协议
文章目录一、目的(与Paxos相同)二、名字来源三、服务器状态四、基本实现1、任期2、RPC调用3、领导者选举4、日志复制5.领导者更替三、Raft与Paxos的区别1.表现形式2.简单性3.领导选举算法一、目的(与Paxos相同) 保证日志完全相同…...

动态规划概述
动态规划概述动态规划的两个要求: 1.最优子结构 例:现有一座10级台阶的楼梯,我们要从下往上走,每次只能跨一步,一步可以往上走1级或者2级台阶,请问一共有多少种解法呢? 台阶数12345678910走法数…...

CPU缓存架构+Disruptor内存队列
文章目录CPU缓存架构Disruptor内存队列CPU缓存架构介绍缓存一致性问题缓存一致性协议MESI协议伪共享问题高性能内存队列DisruptorCPU缓存架构Disruptor内存队列 CPU缓存架构 介绍 cpu与内存的交互数据之间,有一个高速缓存层。有些处理器有3层缓冲,有些…...

Spark SQL join操作详解
一、 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据。分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark SparkSession.builder().appName("aggregations").master("lo…...

设计模式-day04
5,结构型模式 5.6 组合模式 5.6.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,…...

线段树的学习(2023.4.5)
今天我来学习线段树 首先它是树有着树的结构,线段树由于本身是专门用来处理区间问题的 它的作用可以处理区间的问题拥有更快的速度. 对于每一个子节点而言,都表示整个序列中的一段子区间;对于每个叶子节点而言,都表示序列中的单个元素信息…...

Java 实现excel、word、txt、ppt等办公文件在线预览功能
相信大家在开发的过程中都会遇到在线预览功能,有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能?今天我们就来解决这一疑问! 其实,网上还是有些公司对这一功能提供了收费服务。那么,如何实现…...
《Vue3实战》 第九章 路由
1、安装路由 cnpm install vue-router42、router-link应用 2.1、创建views/OrderList.vue组件 <template> <h1>订单列表页面......</h1> </template> <script> export default{name: OrderList,data(){return{arr:[4,2,5]} } …...

ToBeWritten之物联网Zigbee协议
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...

【万象奥科】RZ/G2UL网关内存压力测试
测试目的 内存压力测试的目的是测试系统内存的稳定性和可靠性,以便确定系统是否能够在各种负载情况下正常运行。其主要目的有: 测试内存的正确性:通过模拟各种内存负载情况,例如写入随机数据、重复写入相同数据、使用指定的模式…...

C++中的继承
面向对象的三大特性 封装继承多态 继承的概念和定义 继承的本质就是类层次的复用。 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段.它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类…...

SpringRetry接口异常优雅重试机制
场景: 某些场景下,如果接口出现异常需要进行重试,例如网络抖动、调用接口超时等并非接口代码导致的报错,此时可以进行接口重试机制 1、导入 spring retry 重试依赖 <!-- spring retry --><dependency><groupId>…...
2023年全国最新高校辅导员精选真题及答案46
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 27.充沛的精力和顽强的毅力是教师意志品质的体现。 答案:正确 28.规范与约束…...

程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了
什么样的工作才是好工作?每当遇到这个问题,我们的答案总是出奇的一致:钱多事少离家近。 然而现实总是残酷的,日前,有网友在某社交论坛发帖称:自己为了女朋友留在了成都进入华为工作,而自己的同…...

Linux中的算法分离手段
0. 简介 参数分离对于绝大多数算法开发来说收益是非常大的,因为我们都知道,随着平台的更替,很多时候如果说数据流和算法交叠在一起(即接口与实现合在一起)。这将有可能会导致在迁移平台时候会导致代码难以维护&#x…...

机器学习实战:Python基于Logistic逻辑回归进行分类预测
目录1 前言1.1 Logistic回归的介绍1.2 Logistic回归的应用2 iris数据集数据处理2.1 导入函数2.2 导入数据2.3 简单数据查看3 可视化3.1 条形图/散点图3.2 箱线图3.3 三维散点图4 建模预测4.1 二分类预测4.2 多分类预测5 讨论1 前言 1.1 Logistic回归的介绍 逻辑回归ÿ…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...