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

【微服务核心】MyBatis Plus

文章目录

  • 1. 简介
  • 2. 入门使用
  • 3. 核心功能
    • 3.1 CRUD 接口
      • 3.1.1 Mapper CRUD 接口
      • 3.1.2 Service CRUD 接口
    • 3.2 条件构造器
    • 3.3 分页插件
    • 3.4 Mybatis-Plus 注解
  • 4. 拓展
    • 4.1 逻辑删除
    • 4.2 MybatisX快速开发插件
  • 5. 插件
    • 5.1 [分页插件](#page)
    • 5.2 乐观锁插件

1. 简介

MyBatis Plus,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官网:https://baomidou.com/ ,下面功能及使用都可从官网找到

MyBatis Plus 具有以下特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2. 入门使用

  1. 创建Maven工程

  2. 添加依赖,这里给一份 springboot3 较为完整依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version>
    </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency>
    </dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
    </build>
    
  3. 启动类配置 @MapperScan("com.springboot.mapper") mapper接口扫描注解

  4. 配置文件 application.yaml

    spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: rooturl: jdbc:mysql:///mybatisplusdriver-class-name: com.mysql.cj.jdbc.Driver
    
  5. 编写 mapper 接口,继承 BaseMapper ,继承mybatis-plus提供的基础Mapper接口,将自带crud方法

部分约定配置:

map-underscore-to-camel-case :下划线驼峰命名,默认开启

mapper扫描:classpath*:/mapper/**/*.xml

3. 核心功能

3.1 CRUD 接口

3.1.1 Mapper CRUD 接口

官网:https://baomidou.com/pages/49cc81/#mapper-crud-接口

使用时:ScheduleMapper extends BaseMapper<Schedule>

  • 通用 CRUD 封装 BaseMapper 接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
  • 泛型 T 为任意实体对象
  • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
  • 对象 Wrapper 为 条件构造器

ScheduleMapper 将包含 BaseMapper 中的一系列增删改查及分页查询方法

3.1.2 Service CRUD 接口

官网:https://baomidou.com/pages/49cc81/#service-crud-接口

  • 通用 Service CRUD 封装 IService 接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 对象 Wrapper 为 条件构造器

3.2 条件构造器

在这里插入图片描述

Wrapper : 条件构造抽象类,最顶端父类

  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    • QueryWrapper : 查询/删除条件封装
    • UpdateWrapper : 修改条件封装
    • AbstractLambdaWrapper : 使用Lambda 语法
      • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

组装条件:

在这里插入图片描述

这里仅介绍基于 Lambda 的条件封装的使用,非 Lambda 自行创建对象 QueryWrapper 用类似方法进行拼接即可

LambdaQueryWrapper

@RequestMapping("query")
public Result<List<Schedule>> query() {LambdaQueryWrapper<Schedule> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Schedule::getId, 2);return new Result<>(scheduleService.list(queryWrapper));
}

LambdaUpdateWrapper :使用 set() 方法设置属性

@RequestMapping("update")
public Result<Boolean> update() {LambdaUpdateWrapper<Schedule> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(Schedule::getId, 2).eq(Schedule::getCompleted, 0);updateWrapper.set(Schedule::getCompleted, 1).set(Schedule::getTitle, "学个P呀");return new Result<>(scheduleService.update(updateWrapper));
}

3.3 分页插件

配置方法:配置类中,将 MybatisPlusInterceptor 注入 IoC容器中,注入前添加 PaginationInnerInterceptor 拦截器

@MapperScan("com.springboot.mapper")
@SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}

使用默认实现的分页:scheduleService.page 返回的是 Page 对象,与 new Page 是同一个,只是对象中有了更多信息

@RequestMapping("query")
public Result<Page<Schedule>> query() {Page<Schedule> page = new Page<>(1,5);return new Result<>(scheduleService.page(page));
}

Page :该类继承了 IPage 类,实现了 简单分页模型 如果你要实现自己的分页模型可以继承 Page 类或者实现 IPage

属性名类型默认值描述
recordsListemptyList查询数据列表
totalLong0查询列表总记录数
sizeLong10每页显示条数,默认 10
currentLong1当前页
ordersListemptyList排序字段信息,允许前端传入的时候,注意 SQL 注入问题,可以使用 SqlInjectionUtils.check(...) 检查文本
optimizeCountSqlbooleantrue自动优化 COUNT SQL 如果遇到 jSqlParser 无法解析情况,设置该参数为 false
optimizeJoinOfCountSqlbooleantrue自动优化 COUNT SQL 是否把 join 查询部分移除
searchCountbooleantrue是否进行 count 查询,如果只想查询到列表不要查询总记录数,设置该参数为 false
maxLimitLong单页分页条数限制
countIdStringxml 自定义 count 查询的 statementId 也可以不用指定在分页 statementId 后面加上 _mpCount 例如分页 selectPageById 指定 count 的查询 statementId 设置为 selectPageById_mpCount 即可默认找到该 SQL 执行

自定义分页方法接口:

//传入参数携带Ipage接口
//返回结果为IPage
IPage<User> selectPageVo(IPage<?> page, Integer id);
<select id="selectPageVo" resultType="xxx.xxx.xxx.User">SELECT * FROM user WHERE id > #{id}
</select>

如果返回类型是 IPage 则入参的 IPage 不能为null,因为 返回的 IPage == 入参的IPage;如果想临时不分页,可以在初始化 IPage 时 size 参数传 <0 的值;
如果返回类型是 List 则入参的 IPage 可以为 null(为 null 则不分页),但需要你手动 入参的IPage.setRecords(返回的 List);
如果 xml 需要从 page 里取值,需要 page.属性 获取

注意:多个插件使用的情况,请将分页插件放到 插件执行链 最后面。如在租户插件前面,会出现 COUNT 执行 SQL 不准确问题

3.4 Mybatis-Plus 注解

详情可参考官网:https://baomidou.com/pages/223848/#tablename

  • @TableName :表名注解,标识实体类对应的表
  • @TableId :主键注解。type指定为 ASSIGN_ID 会调用主键生成默认实现类,以雪花算法生成 ID
  • @TableField :字段注解(非主键)
  • @Version :乐观锁注解
  • @TableLogic :逻辑处理注解,增加注解后删除会进行逻辑删除。默认逻辑删除属性已删除值为 1,未删除值为 0。也可通过 mybatis-plus.global-config.db-config.logic-delete-field 配置全局逻辑删除属性。二者必须配置一个逻辑删除才会生效,注意也会影响默认查询逻辑,查询中会过滤逻辑删除的数据
  • @OrderBy :内置 SQL 默认指定排序,优先级低于 wrapper 条件查询

4. 拓展

4.1 逻辑删除

  1. 配置 application.yaml ,从 3.3.0 版本开始,可以忽略不配置 @TableLogic 注解
mybatis-plus:global-config:db-config:logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 实体类字段上加上 @TableLogic 注解

4.2 MybatisX快速开发插件

在 idea 插件中搜索 MybatisX ,安装后右侧导航栏(Datasbase)连接数据源后,即可选择表右键直接生成代码

在这里插入图片描述

如果需要生成是子模块代码,这里需要手动填一下子模块目录,目前版本选中子模块不会自动填入,如我这里是 T01

  • relative package :实体类的生成包

在这里插入图片描述

之后需选中 Model 才会生成实体类

在这里插入图片描述

5. 插件

目前已有的功能:

  • 自动分页: PaginationInnerInterceptor
  • 乐观锁: OptimisticLockerInnerInterceptor
  • 多租户: TenantLineInnerInterceptor
  • 动态表名: DynamicTableNameInnerInterceptor
  • 非法SQL拦截: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor
  • 数据权限:DataPermissionInterceptor
  • 数据变动记录:DataChangeRecorderInnerInterceptor

插件配置:注入 MybatisPlusInterceptor 对象即可,注入前把需要的对应拦截器添加到该对象中

@MapperScan("com.springboot.mapper")
@SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}

注意:

使用多个功能需要注意顺序关系,建议使用如下顺序

  • 多租户,动态表名
  • 分页,乐观锁
  • sql 性能规范,防止全表更新与删除

总结: 对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入

具体可参考官网使用:https://baomidou.com/pages/2976a3/

5.1 分页插件

5.2 乐观锁插件

配置完拦截器后在实体类的字段上加上 @Version 注解即可

说明:

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1newVersion 会回写到 entity
  • 仅支持 updateById(id)update(entity, wrapper) 方法
  • update(entity, wrapper) 方法下, wrapper 不能复用!!!

相关文章:

【微服务核心】MyBatis Plus

文章目录 1. 简介2. 入门使用3. 核心功能3.1 CRUD 接口3.1.1 Mapper CRUD 接口3.1.2 Service CRUD 接口 3.2 条件构造器3.3 分页插件3.4 Mybatis-Plus 注解 4. 拓展4.1 逻辑删除4.2 MybatisX快速开发插件 5. 插件5.1 [分页插件](#page)5.2 乐观锁插件 1. 简介 MyBatis Plus&am…...

什么是Alibaba Cloud Linux?完全兼容CentOS,详细介绍

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…...

Spark---RDD算子(单值类型Value)

文章目录 1.RDD算子介绍2.转换算子2.1 Value类型2.1.1 map2.1.2 mapPartitions2.1.3 mapPartitionsWithIndex2.1.4 flatMap2.1.5 glom2.1.6 groupBy2.1.7 filter2.1.8 sample2.1.9 distinct2.1.10 coalesce2.1.11 repartition2.1.12 sortBy 1.RDD算子介绍 RDD算子是用于对RDD进…...

数据库中的MVCC--多版本并发控制

一、前言 1、定义&#xff1a;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;多版本并发控制&#xff0c;主要为了提高数据库 的并发性能。是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用于实现提交读和可重 复读这两种隔离级别。 2…...

wps将姓名处理格式为:姓**

1.打开wps&#xff0c;在要处理数据右侧一个单元格 输入公式&#xff1a;LEFT(A1,1)&"**"&#xff0c;然后回车 2.按住ctrl和处理好的数据的右下角小方框&#xff0c;往下拖动即可生成格式为&#xff1a;姓** 格式的数据 3.复制生成的数据&#xff0c;右键选择 “…...

2023年我的编程之旅:技术演进与自我成长的纪录

2023年我的编程之旅&#xff1a;技术演进与自我成长的纪录 转眼间&#xff0c;2023年已经悄然走到了尾声。这一年&#xff0c;对我来说既是挑战也是机遇的一年。我的编程之旅如同坐上了一辆高速前进的列车&#xff0c;从新技术的学习探索到项目实战的沉浸经历&#xff0c;再到…...

好用免费的WAF---如何安装雷池社区版

什么是雷池​ 雷池&#xff08;SafeLine&#xff09;是长亭科技耗时近 10 年倾情打造的 WAF&#xff0c;核心检测能力由智能语义分析算法驱动。 Slogan: 不让黑客越雷池半步。 什么是 WAF​ WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。 …...

看似 bug 又非 bug 的一个 bug

最近的一个项目中&#xff0c;对于 CSS 的一些属性一些选择符可以大胆使用&#xff0c;然后很意外得撞上一个 iOS 中 Safari 的一个解析问题。 <Component style{{height: "calc(100vh - 46px)"}}>一个组件</Component> 这样的一段代码很简单&#xff…...

mysql常见问题

批量导入SQL 数据库结构 数据时&#xff0c;如果数据是批量插入的话会报错&#xff1a;2006 - MySQL server has gone away。 解决办法&#xff1a;找到你的 mysql 目录下的 my.ini 配置文件&#xff0c;加入以下代码 max_allowed_packet500M wait_timeout288000 interactiv…...

QT上位机开发(串口界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果上位机要和嵌入式设备进行打交道的话&#xff0c;那么串口可能就是我们遇到的第一个硬件设备。串口的物理接线很简单&#xff0c;基本上就是收…...

k8s之pod

1、pod&#xff1a;k8s中最小的资源管理组件&#xff0c;最小化运行容器化应用的资源管理对象 &#xff08;1&#xff09;pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 &#xff08;2&#xff09;一个pod中运行一个容器是最常用的方式 &#xff…...

第二百四十三回 再分享一个Json工具

文章目录 1. 概念介绍2. 分析与比较2.1 分析问题2.2 比较差异 3. 使用方法4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"相关的内容&#xff0c;本章回中将再 分享一个Json插件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…...

electron自定义菜单

创建menu.js const { app, Menu } require("electron"); const createMenu () > {const menu [{label: "菜单",submenu: [{label: "新增",click: () > {},}, ],},{label: "关于",submenu: [{label: "新增",click:…...

变量和函数提升(js的问题)

• js解释执行 • 变量和函数提升 变量声明提前&#xff0c;函数声明提前 • 变量声明提前&#xff1a;值停留在本地 • 函数声明提前&#xff1a;整个函数体提前 如果是var赋值声明的函数&#xff0c;变量提前&#xff0c;函数体停留在本地 1、变量提…...

Excel 插件:ASAP Utilities Crack

ASAP Utilities是一款功能强大的 Excel 插件&#xff0c;填补了 Excel 的空白。在过去的 20 年里&#xff0c;我们的加载项已经发展成为世界上最受欢迎的 Microsoft Excel 加载项之一。 ASAP Utilities 中的功能数量&#xff08;300 多个&#xff09;可能看起来有点令人眼花缭乱…...

hyperf 十九 数据库 二 模型

教程&#xff1a;Hyperf 一、命令行 symfony/console-CSDN博客 hypery 十一、命令行-CSDN博客 hyperf console 执行-CSDN博客 根据之前应该能了解到命令行的基本实现&#xff0c;和hyperf中命令行的定义。 1.1 命令初始化 hyperf.php中系统初始化中通过ApplicationFacto…...

使用python快速开发与PDF文档对话的Gemini聊天机器人

检索增强生成(Retrieval-augmented generation&#xff0c;RAG)使得我们可以让大型语言模型(LLMs)访问外部知识库数据(如pdf,word、text等)&#xff0c;从而让人们可以更加方便的通过LLM来学习外部数据的知识。今天我们将利用之前学习到的RAG方法&#xff0c;谷歌Gemini模型和l…...

Spring Cloud Gateway集成Knife4j

1、前提 网关路由能够正常工作。 案例 基于 Spring Cloud Gateway Nacos 实现动态路由拓展的参考地址&#xff1a;Spring Cloud Gateway Nacos 实现动态路由 详细官网案例&#xff1a;https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway/spring-gatewa…...

Hive10_窗口函数

窗口函数&#xff08;开窗函数&#xff09; 1 相关函数说明 普通的聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通的聚合函数每组(Group by)只返回一个值&#xff0c;而开窗函数则可为窗口中的每行都返回一个值。简单理解&#xff0c;就是对查询的结果多出一列…...

ipvsadm命令详解

ipvsadm命令详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨一个在Linux系统网络管理中极具威力的命令——ipvsadm&#xff0c;通过详细解析…...

zabbix通过自动发现-配置监控项、触发器(小白教程)

自动发现配置参考链接&#xff08;不小白&#xff0c;不友好&#xff09; zabbix-get介绍 1配置 zabbix server&#xff1a;版本7&#xff08;不影响&#xff09;,IP地址&#xff1a;192.168.0.60zabbix agent&#xff1a;版本agent1&#xff08;不影响&#xff09;&#xff…...

Dockerfile文件介绍

0 Preface/Foreword 0.1 Docker docker用来自制镜像。 1 Introduction 1.1 Dockerfile Dockerfile是用于定义Docker镜像的构建过程&#xff0c;它包含一系列的指令用于安装 软件包、配置环境等操作。 Dockerfile文件的格式如下&#xff1a; FROM base_image RUN apt-get up…...

【PHP】函数array_reduce()使用场景

目录 1.计算数组中所有元素的和 2.计算数组中所有元素的乘积 3.将多个字符串连接在一起 4.对数组中的元素进行逻辑计算 5.取出第一个满足条件的数组&#xff0c;筛选有用数组 6.array_reduce()函数的基本语法&#xff1a; array_reduce 函数通常用于对数组中的元素进行累…...

软件测试基础理论学习-软件测试方法论

软件测试方法论 软件测试的方法应该建立在不同的软件测试类型上&#xff0c;不同的测试类型会存在不同的方法。本文以软件测试中常见的黑盒测试为例&#xff0c;简述常见软件测试方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、因果图法、判定表驱动法、正交试…...

Unity 关于点击不同物品移动并触发不同事件

关于点击不同物品触发不同事件 可以实现在界面中点击不同的物体&#xff0c;移动到物品附近位置&#xff0c;然后触发对应的事件。 首先建立一个公共管理的类&#xff1a; public class InteractionObject : MonoBehaviour {private NavMeshAgent PlayerAgent;private bool …...

c++IO库详细介绍

文章目录 前言c IO 类简介1. iostream库iostream 类标准IO对象 2. fstream库fstream 类 3. stringstream库stringstream 类 格式化和控制错误处理 IO对象无拷贝或赋值IO条件状态主要的状态标志检查流状态控制流状态示例 管理输出缓冲主要操作示例 文件输入输出使用文件流对象示…...

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…...

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃&#xff08;二&#xff09; 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目&#xff0c;其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…...

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处&#xff1a; 众所周知CPU是用来处理游戏的逻辑运算的&#xff0c;而GPU是用来处理游戏中图像的。在GPU中&#xff0c;我们要绘制一个图像需要提交图片&#xff08;纹理&#xff09;到显存&#xff0c;然后再进行绘制&#xff08;在这个过程中会产生一次DrawCall…...

java maven项目添加oracle jdbc的依赖

一般添加依赖是直接在pom.xml中添加配置即可&#xff0c;Maven会自动获取对应的jar包&#xff0c;但是oracle驱动依赖添加后会显示红色&#xff0c;代表找不到依赖项&#xff0c;是因为Oracle授权问题&#xff0c;Maven3不提供Oracle JDBC driver&#xff0c;为了在Maven项目中…...

那个做图网站叫什么/百度推广没有效果怎么办

有人说&#xff0c;现在人们追不上技术的革新&#xff0c;变化太快&#xff0c;我们都来不及反应&#xff0c;以下就是由Deloitte根据欧洲技术公司在过去五年的收入增长所评出的欧洲20家成长最快的技术公司&#xff0c;总体来看&#xff0c;似乎英国&#xff0c;德国&#xff0…...

滁州做网站优化/百度投放广告收费标准

在本文中&#xff0c;我们会研究一些用于数据科学任务的 Python 库&#xff0c;而不是常见的比如 panda、scikit-learn 和 matplotlib 等的库。尽管像 panda 和 scikit-learn 这样的库&#xff0c;是在机器学习任务中经常出现的&#xff0c;但是了解这个领域中的其它 Python 产…...

温州做模具的网站/山东最新资讯

实例说明代理是Java SE 1.3版新增的特性。使用代理可以在程序运行时创建一个实现指定接口的新类。通常只有在编译时无法确定需要使用哪个接口时才需要使用代理&#xff0c;这对于应用程序员很少见。对于系统程序员而言&#xff0c;代理可以为工具类提供更加灵活的特性。本实例模…...

做养生产品哪个网站好/友情链接又称

Java参数传值&#xff1a;特点&#xff1a;1、参数属于局部变量&#xff1b;2、当对象调用方法时&#xff0c;参数被分配内存空间&#xff0c;同时要求对象为参数传值才能进行使用&#xff0c;即方法被调用时&#xff0c;参数变量必须有具体的值&#xff1b;如下代码演示&#…...

网站后台word编辑器/长沙百度搜索排名优化

一、静态绑定和动态绑定的区别在Java中&#xff0c;当你调用一个方法时&#xff0c;可能会在编译时期(compile time)解析(resolve)&#xff0c;也可能实在运行时期(runtime)解析&#xff0c;这全取决于到底是一个静态方法(static method)还是一个虚方法(virtual method)。如果是…...

网站建设合同.doc/有创意的营销案例

guan大数据挖掘最深入人心的一个故事应该是“啤酒与尿布”&#xff0c;这个规律就是用关联分析发现的。今天我们就来点关联分析&#xff0c;刚刚学到的&#xff0c;现学现分享?。下面假设是某超市的交易记录&#xff08;我编造的&#xff09;基本概念我们在关联分析之前先了解…...