mybatis-flex探索

news2024/11/22 23:10:55

mybatis古今未来

最近无意之中发现了一个非常棒的持久层框架mybatis-flex,迫不及待研究了一下

发现简直就是我的梦中情框,之前写ibatis,后来写mybatis,接着写mybatis-plus,接着研究mybatis-flex

ibatis

    ibatis是apache开源的,当时是一款轻量级的数据据持久层的半自动式开发框架

   它简化直接用jdbc开发的60%以上的代码量,并且支持将sql写入xml中,使结构变得非常清晰,而且能灵活配置,从此进入了ibatis的时代,受到当时大量的开发人员的喜爱

优点:

  1. 简化了直接使用jdbc产生的大量代码
  2. 定义xml映射器,将sql语句与java代码分离,维护更轻松
  3. 查询能将结果集反映射到java对象中
  4. 提供了事物管理和连接池管理
  5. 。。。。

缺点:

  1. 结果集封装单一,不够灵活
  2. 增删改查,入参有限制,只有一个
  3. 配置关系太多
  4. 不够优化,大量的单表操作仍旧需要手动写增删改查等sql
  5. 复杂查询逻辑会出现嵌套查询 n+1的情况,造成资源抢占,拥护,卡顿
  6. 。。。。

mybatis:

   它就是千锤百炼锻造出来的,它的前身就是ibatis

优点:

  1. 前身是ibatis,所以它有ibatis的一切优点
  2. 借助jdk的泛型和注解特性进一步做了简化
  3. 实现了接口绑定,自动生成接口的具体实现,简化了ibatis在dao与xml的映射关系需要指定的操作
  4. 对象关系映射改进,效率更高
  5. 性能高:提供了缓存机制提高性能,存储过程等
  6. 。。。。

缺点

  1. sql编写工作量较大,大量的单表操作仍旧需要写常规的sql语句
  2. 配置关系仍旧太多
  3. 复杂的查询操作需要自己编写sql语句
  4. 缓存使用不当,容易产生脏数据
  5. 。。。

mybatis-plus

   它是mybatis的增强工具,在mybatis的基础上只做增强不做改变

优点:

  1. 它只是增强mybatis,所以mybatis一切优点它全都继承了过来
  2. 依赖少,仅仅依赖 Mybatis 以及 Mybatis-Spring 。
  3. 预防sql注入,内置sql注入剥离器,可以很好的防止sql注入
  4. 内置多种主键策略
  5. 单表增删改查等业务可以不用写sql
  6. 强大的条件构造器可以满足各种使用需求
  7. 支持Lambda形式调用
  8. 。。。。

缺点:

  1. 分页查询无sql解析设计
  2. 不支持多表查询
  3. 不支持多主键,复合主键
  4. 。。。。

MyBatis-Flex

它也是在mybatis上做了增强

  1. 拥有mybatis所有的优点
  2. 仅依赖mybatis,体积更小更轻量
  3. 支持多表查询
  4. 支持多主键,复合主键
  5. 。。。。。

我的要求:

  1. 不用写重复性单表增删改查的业务,
  2. 能支持分页查询
  3. 支持多表查询
  4. 支持rpc远程调用

mybatis-flex满足了我所有的要求,所以我觉得自己很有必要去了解一下

例子截图

 

代码部分

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zxs</groupId>
    <artifactId>springboot-mybatis-flex</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mybatis-flex</name>
    <description>springboot-mybatis-flex</description>
    <properties>
        <java.version>17</java.version>
        <mybatis-flex.version>1.5.6</mybatis-flex.version>
        <fastjson.version>1.2.47</fastjson.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>knife4j-dependencies</artifactId>
                <version>4.1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mybatis-flex</groupId>
            <artifactId>mybatis-flex-spring-boot-starter</artifactId>
            <version>${mybatis-flex.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test
    username: root
    password: zkb.com
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
      maximum-pool-size: 100
      minimum-idle: 10
      pool-name: HikaraPool-1
springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: '查询接口'
      paths-to-match: '/**'
      packages-to-scan: com.zxs.springbootmybatisflex.controller.sys
    - group: '增删改接口'
      paths-to-match: '/**'
      packages-to-scan: com.zxs.springbootmybatisflex.controller.client
  default-flat-param-object: true

knife4j:
  enable: true
package com.zxs.springbootmybatisflex.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableKnife4j
public class SwaggerConfig {
    // 设置 openapi 基础参数
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("zxs API 管理")
                        .version("1.0")
                        .description("探索mybatis-flex demo")
                        .license(new License().name("Apache 2.0")));
    }
}
package com.zxs.springbootmybatisflex.controller.client;

import com.mybatisflex.core.query.QueryCondition;
import com.mybatisflex.core.query.QueryWrapper;
import com.zxs.springbootmybatisflex.entity.User;
import com.zxs.springbootmybatisflex.service.UserService;
import com.zxs.springbootmybatisflex.uitl.DataResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import static com.zxs.springbootmybatisflex.entity.table.UserTableDef.USER;

@RestController
@Tag(name="用户增删改")
@RequestMapping("/suser")
public class SuserController {
    @Autowired
    UserService userService;



    @Operation(summary = "根据id删除用户",description = "方式一")
    @GetMapping("/deleteUser/{id}")
    public DataResult<User> deleteUser(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        userService.deleteUser(id);
        return result;
    }

    @Operation(summary = "根据id删除用户",description = "方式二")
    @GetMapping("/deleteUser2/{id}")
    public DataResult<User> deleteUser2(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        userService.removeById(id);
        return result;
    }

    @Operation(summary = "根据id删除用户",description = "方式三")
    @GetMapping("/deleteUser3/{id}")
    public DataResult<User> deleteUser3(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        userService.deleteUser3(id);
        return result;
    }

    @Operation(summary = "根据id删除用户",description = "方式四")
    @GetMapping("/deleteUser4/{id}")
    public DataResult<User> deleteUser4(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        QueryCondition queryCondition =USER.ID.eq(id);
        userService.remove(queryCondition);
        return result;
    }

    @Operation(summary = "增加用户",description = "方式一")
    @PostMapping("/addUser1")
    public DataResult<User> addUser1(@RequestBody User user){
        DataResult<User> result = DataResult.success();
        userService.save(user);
        return result;
    }

    @Operation(summary = "修改用户",description = "方式一")
    @PostMapping("/updateUser1")
    public DataResult<User> updateUser1(@RequestBody User user){
        DataResult<User> result = DataResult.success();
        QueryWrapper queryWrapper = QueryWrapper.create().
                where(USER.USERNAME.eq(user.getUsername())).
                and(USER.PASSWORD.eq(user.getPassword()));
        userService.update(user,queryWrapper);
        return result;
    }

    @Operation(summary = "修改用户",description = "方式二")
    @PostMapping("/updateUser2")
    public DataResult<User> updateUser2(@RequestBody User user){
        DataResult<User> result = DataResult.success();
        QueryWrapper queryWrapper = QueryWrapper.create().
                where(USER.USERNAME.eq(user.getUsername())).
                and(USER.PASSWORD.eq(user.getPassword()));
        userService.update(user,queryWrapper);
        return result;
    }

}
package com.zxs.springbootmybatisflex.controller.sys;

import com.zxs.springbootmybatisflex.entity.User;
import com.zxs.springbootmybatisflex.service.UserService;
import com.zxs.springbootmybatisflex.uitl.DataResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@Tag(name="用户查询")
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;

    @Operation(summary = "获取全部用户",description="获取全部用户")
    @GetMapping("/selectUsers")
    public DataResult<List<User>> selectUsers(){
        DataResult<List<User>> result = DataResult.success();
        List<User> list = userService.list();
        result.setData(list);
        return result;
    }

    @Operation(summary = "根据id获取用户",description = "方式一")
    @GetMapping("/selectUser/{id}")
    public DataResult<User> selectUser(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        User user = userService.selectUserById(id);
        result.setData(user);
        return result;
    }

    @Operation(summary = "根据id获取用户",description = "方式二")
    @GetMapping("/selectUser2/{id}")
    public DataResult<User> selectUser2(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        User user = userService.getById(id);
        result.setData(user);
        return result;
    }

    @Operation(summary = "根据id获取用户",description = "方式三")
    @GetMapping("/selectUser3/{id}")
    public DataResult<User> selectUser3(@PathVariable(value = "id") Long id){
        DataResult<User> result = DataResult.success();
        User user = userService.selectUserById2(id);
        result.setData(user);
        return result;
    }
}
package com.zxs.springbootmybatisflex.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
//import io.swagger.annotations.ApiModel;
//import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;


@Data
@EqualsAndHashCode(callSuper = false)
@Tag(name = "用户", description = "用户实体类")
@Table("user")
public class User{

    @Schema(description="用户id")
    @JsonSerialize(using = ToStringSerializer.class)
    @Id(keyType = KeyType.Auto)
    private Long id;

    /**
     * 用户名
     */
    @Schema(description="用户名")
    private String username;
    /**
     * 密码
     */
    @Schema(description="密码")
    private String password;
    /**
     * 名称
     */
    @Schema(description="名称")
    private String name;

    /**
     * 邮箱
     */
    @Schema(description="邮箱")
    private String email;
    /**
     * 联系方式
     */
    @Schema(description="手机号")
    private String phone;

    /**
     * 用户状态:1有效; 2删除
     */
    @Schema(description="状态")
    private Integer status;
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Column("createTime")
    private Date createTime;
    /**
     * 用户类型
     */
    @Schema(description="登录次数")
    private Integer logins;


}
package com.zxs.springbootmybatisflex.exception.code;


public enum BaseResponseCode implements ResponseCodeInterface {
    /**
     * 这个要和前段约定好
     * 引导用户去登录界面的
     * code=401001 引导用户重新登录
     * code=401002 token 过期刷新token
     * code=401008 无权限访问
     */
    SUCCESS(200,"操作成功"),
    SYSTEM_BUSY(500001, "系统繁忙,请稍候再试"),
    OPERATION_ERRO(500002,"操作失败"),
    METHODARGUMENTNOTVALIDEXCEPTION(500003, "方法参数校验异常"),
    ;

    /**
     * 错误码
     */
    private final int code;
    /**
     * 错误消息
     */
    private final String msg;

    BaseResponseCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }
}
package com.zxs.springbootmybatisflex.exception.code;


public interface ResponseCodeInterface {
    int getCode();

    String getMsg();
}
package com.zxs.springbootmybatisflex.exception.handler;


import com.zxs.springbootmybatisflex.exception.BusinessException;
import com.zxs.springbootmybatisflex.exception.code.BaseResponseCode;
import com.zxs.springbootmybatisflex.uitl.DataResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;


@RestControllerAdvice
@Slf4j
public class RestExceptionHandler {


    @ExceptionHandler(Exception.class)
    public <T> DataResult<T> handleException(Exception e){
        log.error("Exception,exception:{}", e);
        return DataResult.getResult(BaseResponseCode.SYSTEM_BUSY);
    }


    @ExceptionHandler(value = BusinessException.class)
    <T> DataResult<T> businessExceptionHandler(BusinessException e) {
        log.error("BusinessException,exception:{}", e);
        return new DataResult<>(e.getMessageCode(),e.getDetailMessage());
    }


    @ExceptionHandler(MethodArgumentNotValidException.class)
    <T> DataResult<T> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        log.error("methodArgumentNotValidExceptionHandler bindingResult.allErrors():{},exception:{}", e.getBindingResult().getAllErrors(), e);
        List<ObjectError> errors = e.getBindingResult().getAllErrors();
        return createValidExceptionResp(errors);
    }
    private <T> DataResult<T> createValidExceptionResp(List<ObjectError> errors) {
        String[] msgs = new String[errors.size()];
        int i = 0;
        for (ObjectError error : errors) {
            msgs[i] = error.getDefaultMessage();
            log.info("msg={}",msgs[i]);
            i++;
        }
        return DataResult.getResult(BaseResponseCode.METHODARGUMENTNOTVALIDEXCEPTION.getCode(), msgs[0]);
    }
}
package com.zxs.springbootmybatisflex.exception;


import com.zxs.springbootmybatisflex.exception.code.ResponseCodeInterface;

public class BusinessException extends RuntimeException{
    /**
     * 异常编号
     */
    private final int messageCode;

    /**
     * 对messageCode 异常信息进行补充说明
     */
    private final String detailMessage;

    public BusinessException(int messageCode,String message) {
        super(message);
        this.messageCode = messageCode;
        this.detailMessage = message;
    }
    /**
     * 构造函数
     * @param code 异常码
     */
    public BusinessException(ResponseCodeInterface code) {
        this(code.getCode(), code.getMsg());
    }

    public int getMessageCode() {
        return messageCode;
    }

    public String getDetailMessage() {
        return detailMessage;
    }
}
package com.zxs.springbootmybatisflex.exception;


import com.zxs.springbootmybatisflex.exception.code.ResponseCodeInterface;

public class RoleSaveException extends RuntimeException{
    /**
     * 异常编号
     */
    private final int messageCode;

    /**
     * 对messageCode 异常信息进行补充说明
     */
    private final String detailMessage;

    public RoleSaveException(int messageCode, String message) {
        super(message);
        this.messageCode = messageCode;
        this.detailMessage = message;
    }
    /**
     * 构造函数
     * @param code 异常码
     */
    public RoleSaveException(ResponseCodeInterface code) {
        this(code.getCode(), code.getMsg());
    }

    public int getMessageCode() {
        return messageCode;
    }

    public String getDetailMessage() {
        return detailMessage;
    }
}
package com.zxs.springbootmybatisflex.mapper;

import com.mybatisflex.core.BaseMapper;
import com.zxs.springbootmybatisflex.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
package com.zxs.springbootmybatisflex.service.impl;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.zxs.springbootmybatisflex.entity.User;
import com.zxs.springbootmybatisflex.mapper.UserMapper;
import com.zxs.springbootmybatisflex.service.UserService;
import org.springframework.stereotype.Service;

import static com.zxs.springbootmybatisflex.entity.table.UserTableDef.USER;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User selectUserById(Long id) {
        return getById(id);
    }

    @Override
    public User selectUserById2(Long id) {
        QueryWrapper queryWrapper = QueryWrapper.create().where(USER.ID.eq(id));
        return getOne(queryWrapper);
    }

    @Override
    public void deleteUser(Long id) {
        removeById(id);
    }

    @Override
    public void deleteUser3(Long id) {
        QueryWrapper queryWrapper = QueryWrapper.create().where(USER.ID.eq(id));
        remove(queryWrapper);
    }
}
package com.zxs.springbootmybatisflex.service;

import com.mybatisflex.core.service.IService;
import com.zxs.springbootmybatisflex.entity.User;

public interface UserService extends IService<User> {

    User selectUserById(Long id);

    User selectUserById2(Long id);

    void deleteUser(Long id);

    void deleteUser3(Long id);
}
package com.zxs.springbootmybatisflex.uitl;

import com.zxs.springbootmybatisflex.exception.code.BaseResponseCode;
import com.zxs.springbootmybatisflex.exception.code.ResponseCodeInterface;
import lombok.Data;


@Data
public class DataResult<T>{

    /**
     * 请求响应code,0为成功 其他为失败
     */
    private int code;

    /**
     * 响应异常码详细信息
     */
    private String msg;

    /**
     * 响应内容 , code 0 时为 返回 数据
     */
    private T data;

    public DataResult(int code, T data) {
        this.code = code;
        this.data = data;
        this.msg=null;
    }

    public DataResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public DataResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
        this.data=null;
    }


    public DataResult() {
        this.code= BaseResponseCode.SUCCESS.getCode();
        this.msg=BaseResponseCode.SUCCESS.getMsg();
        this.data=null;
    }

    public DataResult(T data) {
        this.data = data;
        this.code=BaseResponseCode.SUCCESS.getCode();
        this.msg=BaseResponseCode.SUCCESS.getMsg();
    }

    public DataResult(ResponseCodeInterface responseCodeInterface) {
        this.data = null;
        this.code = responseCodeInterface.getCode();
        this.msg = responseCodeInterface.getMsg();
    }

    public DataResult(ResponseCodeInterface responseCodeInterface, T data) {
        this.data = data;
        this.code = responseCodeInterface.getCode();
        this.msg = responseCodeInterface.getMsg();
    }

    public static <T>DataResult success(){
        return new <T>DataResult();
    }

    public static <T>DataResult success(T data){
        return new <T>DataResult(data);
    }

    public static <T>DataResult getResult(int code,String msg,T data){
        return new <T>DataResult(code,msg,data);
    }

    public static <T>DataResult getResult(int code,String msg){
        return new <T>DataResult(code,msg);
    }

    public static <T>DataResult getResult(BaseResponseCode responseCode){
        return new <T>DataResult(responseCode);
    }

    public static <T>DataResult getResult(BaseResponseCode responseCode,T data){

        return new <T>DataResult(responseCode,data);
    }
}
package com.zxs.springbootmybatisflex;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.zxs.springbootmybatisflex.mapper")
public class SpringbootMybatisFlexApplication {

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

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm在线医疗服务系统源码和论文PPT

ssm在线医疗服务系统源码和论文PPT003 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 选题意义、价值和目标&#xff1a; 随着经济的迅速发展,人们对生活水平和身体健康的要…

chatGPT应用于房地产行业

作为 2023 年的房地产专业人士&#xff0c;您无疑认识到技术对行业的重大影响。近年来&#xff0c;一项技术进步席卷了世界——人工智能。人工智能彻底改变了房地产业务的各个方面&#xff0c;从简化管理任务到增强客户互动。 在本文中&#xff0c;我们将探讨几种巧妙的人工智…

工业互联网发展在即 博晨(BOCHEN)攻克“卡脖子”难题

5G时代的到来&#xff0c;正在悄然掀起一场智能化技术改革的风暴。工业互联网未来一定要走向制造智能化&#xff0c;这可能是我们未来工业互联网推动工业系统新生态的核心问题。”中国电子信息行业联合会专家委员会主任董云庭就曾表示。目前&#xff0c;工业互联网已经覆盖至国…

DC电源模块在工业控制器中的重要性

BOSHIDA DC电源模块在工业控制器中的重要性 DC电源模块在工业控制器中起着非常重要的作用&#xff0c;它是实现工业控制器运转所必需的组成部分。 DC电源模块主要用于将交流电转换成直流电供给工业控制器中的各个部件&#xff0c;包括控制器内部的微处理器、传感器、执行器等等…

【C++】五分钟带你搞懂深浅拷贝

目录 拷贝函数 浅拷贝拷贝构造函数 深拷贝拷贝构造函数 总结 前言 前面我们学习了C的一些基本的知识点&#xff0c;并且介绍了一些STL里面String的一些关键操作&#xff0c;除了这些博主还新开了一个专栏关于Linux的讲解&#xff08;Linux专栏链接&#xff09;大家可以关注…

Redis-简单动态字符串(SDS)

文章目录 文章概要SDS数据结构定义SDS和C字符串的区别总结参考 文章概要 本篇文章&#xff0c;我们来学习Redis字符串的编码格式SDS编码&#xff0c;文章将将从以下几个方面介绍SDS&#xff1a; SDS的底层数据结构定义Redis是C写的&#xff0c;那SDS和C中的字符串的区别是什么…

勒索软件野蛮生长,迷雾中企业何去何从

根据GRIT最新发布的勒索软件报告显示&#xff0c;今年二季度观测到的勒索软件事件数量明显多于一季度&#xff0c;而导致这一情况的三大原因分别为&#xff1a;漏洞的大规模利用、勒索软件工具技术的“民主化”以及新兴勒索软件组织的野蛮生长。 报告公布了2023年最活跃最多产的…

第9集丨Vue 江湖 —— 监测数据原理

目录 一、修改数据时的一个问题1.1 现象一1.2 现象二 二、Vue监测数据原理2.1 模拟一个数据监测2.2 数据劫持2.3 Vue.set()/vm.$set()2.4 基本原理2.4.1 如何监测对象中的数据?2.4.2 如何监测数组中的数据?2.4.3 修改数组中的某个元素 2.5 案例2.5.1 需求功能2.5.2 实现 一、…

【深度学习 video detect】Towards High Performance Video Object Detection for Mobiles

文章目录 摘要IntroductionRevisiting Video Object Detection BaselinePractice for Mobiles Model Architecture for MobilesLight Flow 摘要 尽管在桌面GPU上取得了视频目标检测的最近成功&#xff0c;但其架构对于移动设备来说仍然过于沉重。目前尚不清楚在非常有限的计算…

android studio 实用插件推荐

本文字数&#xff1a;&#xff1a;2352字 预计阅读时间&#xff1a;8分钟 背景 现在做安卓开发的同学基本都是用 Android Studio 了吧&#xff0c;它具有强大的开放性&#xff0c;可以让用户根据自己的需求开发或使用一些插件辅助自己搬砖&#xff0c;当然开发插件我们可能还没…

操作系统—调度算法

进程调度算法 进程调度算法也称CPU调度算法 调度发生时期 当进程从运行状态转到等待状态&#xff1b;当进程从运行状态转到就绪状态&#xff1b;当进程从等待状态转到就绪状态&#xff1b;当进程从运行状态转到终止状态&#xff1b; 其中发生在 1 和 4 两种情况下的调度称为…

工业无线技术应用-无线控制斗轮机启停、故障等开关信号

斗轮堆取料机是一种对散料进行连续堆取作业的高效装卸大型机械,被广泛使用于火力发电厂和炼焦厂的输煤系统中。目前对斗轮机的技改主要为将斗轮机的部分程控信号改为无线传输&#xff0c;取代卷筒电机和电缆的应用。 多数情况下都是利用无线通讯做媒介&#xff0c;让工作人员通…

Shopee买家通系统可全自动批量注册虾皮买家号

Shopee买家通系统可批量注册虾皮买家号&#xff0c;如果想要拥有大量虾皮买家号&#xff0c;完全可以试试&#xff0c; 不过在注册之前我们需要先准备好账号所需要的资料&#xff0c;比如邮箱、手机号、ip、收货地址等。不过想要账号能自动化&#xff0c;对于账号资料也是有一…

SSL证书DV和OV的区别?

SSL证书是在互联网通信中保护数据传输安全的一种加密工具。它能够确保客户端和服务器之间的通信得以加密&#xff0c;防止第三方窃听或篡改信息。在选择SSL证书时&#xff0c;常见的有DV证书和OV证书&#xff0c;它们在验证标准和信任级别上有所不同。那么SSL证书DV和OV的有哪些…

TEC2083BS-PD码转换器(解决博世矩阵控制PELCO派尔高球机的问题)

TEC2083BS-PD码转换器 使用说明 1.设备概述 控制码转换器在安防工程中起着非常重要的角色&#xff0c;随着高速球型摄像机在安防工程中大范围的使用&#xff0c;而高速球厂家都因为某些原因很少使用博世、飞利浦的协议。为此&#xff0c;工程商经常会遇到博世协议和PELCO协议之…

【Oracle 数据库 SQL 语句 】积累1

Oracle 数据库 SQL 语句 1、分组之后再合计2、显示不为空的值 1、分组之后再合计 关键字&#xff1a; grouping sets &#xff08;&#xff08;分组字段1&#xff0c;分组字段2&#xff09;&#xff0c;&#xff08;&#xff09;&#xff09; select sylbdm ,count(sylbmc) a…

Vue [Day6]

路由进阶 路由模块的封装抽离 src/router/index.js import VueRouter from vue-router // 用绝对路径的方式来写目录 相当于src import Find from /views/Find import Friend from ../views/Friend import My from ../views/Myimport Vue from vue Vue.use(VueRouter)con…

Idea 反编译jar包

实际项目中&#xff0c;有时候会需要更改jar包源码来达到业务需求&#xff0c;本文章将介绍一下如何通过Idea来进行jar反编译 1、Idea安装decompiler插件 2、找到decompiler插件文件夹 decompiler插件文件夹路径为&#xff1a;idea安装路径/plugins/java-decompiler/lib 3、…

移动端的Flex布局

目录 引入 一、传统布局与flex布局 传统性 flex布局 二、felx的特点 三、flex布局父项的常见属性 四、flex布局子项的常见方向 总结 引入 flex 是 flexible Box的缩写&#xff0c;意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器…

成像质量高精度标定高均匀光源积分球

随着航天遥感技术的发展&#xff0c;对遥感仪器的定标精度要求越来越高&#xff0c;这就需要高精度的工程应用定标光源。光学定标&#xff0c;在工程应用上是采用光学标准传递的方法对应用设备进行定标&#xff0c;而不是直接用原始标准对应用设备进行定标。其传递链路之一&…