MyBatis 学习(三)之 MyBatis 全局配置文件

news2024/11/17 9:51:36

目录

1 MyBatis 全局配置文件

2 properties 元素

3 setting 设置

4 typeAlianses 别名处理器

5 typeHandler 类型处理器

6 objectFacotry 对象工厂(了解)

7 plugins 插件(了解)

8 environments 运行环境

9 databaseIdProvider 数据库厂商(了解)

10 mapper 加载 SQL 映射文件

11 参考文档


1 MyBatis 全局配置文件

MyBatais 全局配置文件所有配置项如下所示,配置项只能按照如下顺序进行设置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration> <!--配置-->
    <properties/> <!--属性-->
    <settings/> <!--全局配置参数-->
    <typeAliases/> <!--类型别名-->
    <typeHandlers/> <!--类型处理器-->
    <objectFactory/><!--对象工厂-->
    <plugins/><!--创建-->
    <environments default=""><!--环境配置-->
        <environment id=""><!--环境变量-->
            <transactionManager type=""/><!--事务管理器-->
            <dataSource type=""/><!--数据源-->
        </environment>
    </environments>
    <databaseIdProvider type=""/><!--数据库厂商标识-->
    <mappers/><!--映射器-->
</configuration>

2 properties 元素

mysql.properties 配置文件

url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driver=com.mysql.cj.jdbc.Driver

通过 properties 元素导入 mysql.properties 配置文件,会在当前配置文件所在目录下查找 mysql.properties 配置文件

<properties resource="mysql.properties" />

此外,也可以用 properties 元素的 url 属性来指定属性文件的 URL

<!-- 指定一个网络上的属性文件 -->
<properties url="http://example.com/jdbc.properties" />

<!-- 指定一个位于本地文件系统中的属性文件 -->
<properties url="file:///path/to/config.properties" />

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照如下顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取
<properties>
    <!--property子元素定义-->
    <property name="database.driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="database.url" value="jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
    <property name="database.username" value="root"/>
    <property name="database.password" value="123456"/>
</properties>
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性
// 加载数据库配置文件
is = Resources.getResourceAsStream("msyql.properties");
Properties properties = new Properties();
properties.load(is);

// 获取加密信息
String username= properties.getProperty("database.username");
String password= properties.getProperty("database.password");
 
// 解密用户名和密码,并重置属性
properties.setProperty("database.username", CyperTool.decodeByBase64(username));
properties.setProperty("database.password", CyperTool.decodeByBase64(password));

3 setting 设置

        setting 设置是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。但是大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置,只需要修改一些常用的规则即可。常用规则有自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器类型等。

<settings>
    <!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 -->
    <setting name="cacheEnabled" value="true" />
    <!--延时加载的全局开关 -->
    <setting name="lazyLoadingEnabled" value="false" />
</settings>
属性名含义简介有效值默认值
cacheEnabled是否使用缓存是整个工程中所有映射器配置缓存的开关,即是一个全局缓存开关true | falsetrue
lazyLoadingEnabled是否开启延迟加载控制全局是否使用延迟加载。当有特殊关联关系需要单独配置时,可以使用 fetchType 属性来覆盖此配置true | falsefalse
aggressiveLazyLoading是否按需加载属性开启时,不论调用什么方法加载某个对象,都会加载该对象的所有属性,关闭后只会按需加载true | falsefalse
multipleResultSetsEnabled是否允许单一语句返回多结果集即 Mapper 配置中一个单一的 sql 配置是否能够返回多个结果集true | falsetrue
useColumnLabel使用列标签代替列名设置是否使用列标签代替列名true | falsetrue
useGenerateKeys是否支持 JDBC 自动生成主键设置之后,将会强制使用自动生成主键的策略true | falsefalse
autoMappingBehavior指定 MyBatis 自动映射字段或属性的方式有三种方式,NONE 时将取消自动映射;PARTIAL 时只会自动映射没有定义结果集的结果映射;FULL 时会映射任意复杂的结果集NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior设置当自动映射时发现未知列的动作有三种动作,NONE 时不做任何操作;WARNING 时会输出提醒日志;FALLING 时会抛出 SqlSessionException 异常表示映射失败NONE, WARNING, FALLINGNONE
defaultExecutorType设置默认的执行器有三种执行器,SIMPLE 为普通执行器;REUSE 执行器会重用处理语句;BATCH 执行器将重用语句并执行批量更新SIMPLE, REUSE, BATCHSIMPLE
defaultStatementTimeout设置超时时间该超时时间即数据驱动连接数据库时,等待数据库回应的最大秒数任意正整数
defaultFetchSize设置驱动的结果集为了防止从数据库查询出来的结果过多,而导致内存溢出,可以通过设置 fetchSize 参数来控制结果集的数量任意正整数
safeRowBoundsEnabled允许在嵌套语句中使用分页,RowBound,即行内嵌套语句如果允许在 sql 的行内嵌套语句中使用分页,就设置该值为 falsetrue | falsefalse
safeResultHandlerEnabled允许在嵌套语句中使用分页,ResultHandler,即结果及处理如果允许对 sql 的结果集使用分页,就设置该值为 falsetrue | falsetrue
mapUnderscoreToCamelCase是否开启驼峰命名规则映射表名数据库中的字段名称与工程中 Java 实体内的映射是否采用驼峰命名规则校验true | falsefalse
localCacheScopeMyBatis 利用本地缓存机制防止循环引用和加速重复嵌套查询默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据SESSION | STATEMENTSESSION
jdbcTypeForNullJDBC 类型的默认设置当没有参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER常用 NUL、VARCHAR、OTHEROTHER
lazyLoadTriggeerMethods指定哪个对象的方法触发一次延迟加载配置需要触发延迟加载的方法的名字,该方法就会触发一次延迟加载一个逗号分隔的方法名称列表

equals, clone,

hashCode, toString

defaultScriptingLanguage动态 sql 默认语言指定动态 sql 生成的默认语言一个类型的的别名或者一个类的全类名

org.apache.ibatis.

scripting.xmltargs.

XMLLanguageDriver

callSettersOnNulls是否在空值情况下调用 Set 方法指定当结果集中的值为 null 时是否调用映射对像的 setter (map 对象为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化是有用的。注意基本类型不能设置为 nulltrue | falsefalse
returnInstanceForEmptyRow返回空实体集对象当返回行的所有列都是空时,MyBatis 默认返回 null。当开启这个设置时,MyBatis 会返回一个空实例。此外,从 MyBatis 3.4.2 开始,它也适用于嵌套的结果集true | falsefalse
logImpl日志实现指定 MyBatis 所用日志的具体实现,为指定时将自动查找SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
proxyFactory代理工厂指定 MyBatis 创建具有延迟加载能力的对象所用到的代理工具CGLIB | JAVASSISTJAVASSIST
vfsImplvfs 实现指定 vfs 的实现自定义 VFS 实现类的全类名,以逗号分割
useActualParamName使用方法签名允许使用方法签名中的名称作为语句参数名称。要使用该特性,工程必须采用 Java8 编译,并且加上 -parameters 选项(从 MyBatis 3.4.1 版本开始)true | false

false

configurationFactory配置工厂指定提供配置实例的类。返回的配置实例用于加载反序列化的懒加载参数。这个类必须有一个签名的静态配置 getconfiguration() 方法(从 MyBatis 3.2.3 版本开始)一个类型别名或者一个类的全类名

4 typeAlianses 别名处理器

typeAliases 可以给类设置别名,这样当我们需要使用类时,可以不用每次都写那么复杂的全类名 (com.pojo.User)

<!--设置别名-->
<typeAliases>
    <!--对类单独进行别名设置  -->
    <typeAlias alias="user" type="com.pojo.User"></typeAlias>
    <typeAlias alias="student" type="com.pojo.Student"></typeAlias>
</typeAliases>

批量给类设置别名,为包中的每一个类设置别名,设置规则是:获取类名称,将其第一个字母变为小写

<!--设置别名-->
<typeAliases>
    <!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
    <package name="com.pojo1"/>
    <package name="com.pojo2"/>
    <package name="com.pojo3"/>
</typeAliases>

通过 @Alias 注解设置别名

@Alias("user")
public class User {
    省略......
}

需要注意的是,MyBatis 已经为某些类定义了别名,此外,别名对大小写不敏感。对此,为某些类定义别名时,不能占用已有别名

5 typeHandler 类型处理器

        在 typeHandler 类型处理器中,包含 javaType 和 jdbcType 两种类型,其中 javaType 用来定义 Java 类型,jdbcType 用来定义数据库类型,而 typeHandler 的作用就是对 javaType 和 jdbcType 两种类型进行转换,如下图所示:

下图是 MyBatis 已经定义好的部分类型处理器,当然,我们也可以自定义类型处理器,此处不做介绍

6 objectFacotry 对象工厂(了解)

        objectFacotry 表示为对象工厂。对象工厂我们只需了解即可,因为到时候与 Spring 整合后,都会由 Spring 来管理。我们知道,在 JDBC 中查询的结果会保存在一个结果集中,而 MyBatis 也是这样,它会使用其定义的对象工厂 DefaultObjectFactory 来将查询的结果保存在结果集中。

7 plugins 插件(了解)

       plugins 插件是 MyBatis 提供的一个非常强大的机制通过插件,我们可以在不修改 MyBatis 核心代码的情况下,对其核心行为进行修改。利用动态代理机制,插件能够介入到四大对象(Mapper Interface、Mapped Statement、Parameter Map 和 ResultSet Handler)的任何一个方法的执行过程中。

8 environments 运行环境

        environments 标签用于指定当前运行环境,在 MyBatis 中可以配置多种环境,比如开发、测试和生产环境。每种环境使用一个 environment 标签进行配置并指定唯一标识符,可以通过 environments 标签中的 default 属性指定一个环境的标识符来快速的切换环境,environment  标签里面分为两个可配置的标签:事务管理 (transactionManager)、数据源 (DataSource)。而在我们的日常开发中,这些都会交给 Spring 来管理,不用在全局配置中编写。

transactionManager

        transactionManager 配置事务管理器类型,type = JDBC | MANAGED | 自定义(type=全类名或别名)

  • JDBC 使用 JdbcTransactionFactory 工厂生成的 JdbcTransaction 对象实现,以 JDBC 的方式进行数据库的提交、回滚等操作,它依赖于从数据源得到的连接来管理事务范围
  • MANAGED 使用 ManagedTransactionFactory 工厂生成的 ManagedTransaction 对象实现,它的提交和回滚不需要任何操作,而是把事务交给容器进行处理,默认情况下会关闭连接,如果不希望默认关闭,只要将其中的 closeConnection 属性设置为 false 即可
  • 自定义的事务管理类型需要实现 TransactionFactory 接口

DataSource

        在 MyBatis 中,数据库是通过 PooledDataSourceFactory、UnpooledDataSourceFactory 和 JndiDataSourceFactory 三个工厂类来提供,前两者分别产生 PooledDataSource 和 UnpooledDataSource 类对象,第三个则会根据 JNDI 的信息获得外部容器实现的数据库连接对象,总之,它们最后都会生成一个实现了 DataSource 接口的数据库连接对象。

type = UNPOOLED | POOLED | JNDI | 自定义

UNPOOLED

        UNPOOLED 采用非数据库池的管理方式,每次请求都会新建一个连接,所以性能不是很高,使用这种数据源的时候,UNPOOLED 类型的数据源可以配置以下属性:

  • driver:数据库驱动名
  • url:数据库连接 URL
  • username:用户名
  • password:密码
  • defaultTransactionIsolationLevel:默认的事务隔离级别,如果要传递属性给驱动,则属性的前缀为 driver

POOLED

        POOLED 采用连接池的概念将数据库链接对象 Connection 组织起来,可以在初始化时创建多个连接,使用时直接从连接池获取,避免了重复创建连接所需的初始化和认证时间,从而提升了效率,所以这种方式比较适合对性能要求高的应用中。除了 UNPOOLED 中的配置属性之外,还有以下几个修改连接池的配置:

  • poolMaximumActiveConnections:用于设置连接池中允许的最大活跃连接数。超过这个数量的连接将会被阻塞,直到有连接被释放为止,默认值为 10

  • poolMaxmumIdleConnections:用于设置连接池中允许的最大空闲连接数。当连接池中的连接数量超过这个值时,多余的连接将会被释放,默认值为 5

  • poolMaxmumCheckoutTime:用于设置连接在连接池中的最大使用时间。超过这个时间的连接将会被强制回收,默认值为 20000 毫秒(即 20 秒)

  • poolTimeToWait:用于设置从连接池中获取连接时的最大等待时间。如果在这个时间内无法获取到连接,将会抛出超时异常,默认值为 20000 毫秒(即 20 秒)

JNDI

        数据源 JNDI 的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源只需配置两个属性:

  • initial_context:用来在 InitialContext 中寻找上下文。可选,如果忽略,data_source 属性将会直接从 InitialContext 中寻找
  • data_source:引用数据源实例位置上下文的路径。当提供 initial_context 配置时,data_source 会在其返回的上下文进行查找,否则直接从 InitialContext 中查找

9 databaseIdProvider 数据库厂商(了解)

        databaseIdProvider 元素主要是为了支持不同厂商的数据库,这个元素不常用。

<!--数据库厂商标示 -->
<databaseIdProvider type="DB_VENDOR">
    <property name="Oracle" value="oracle"/>
    <property name="MySQL" value="mysql"/>
    <property name="DB2" value="d2"/>
</databaseIdProvider>

以下是 databaseIdProvider 中的属性介绍:

  • Type:DB_VENDOR,使用 MyBatis 提供的 VendorDatabaseIdProvider 解析数据库厂商标识。也可以实现 DatabaseIdProvider 接口来自定义
  • Property-name:数据库厂商标识
  • Property-value:为数据库厂商标识起一个别名,方便 SQL 语句使用 databaseId 属性引用

设置了以上配置,我们就可以在自己的 sql 语句中使用属性 databaseId 来标示数据库类型

<!-- 查询所有用户 -->
<select id="selectAllUser" resultType="com.entity.User" databaseId="oracle">
    select * from t_user
</select>

10 mapper 加载 SQL 映射文件

mapper 用来加载配置的 SQL 映射文件,它有以下四种加载方式:

  • 用文件路径引入
  • 使用 URL 方式引入
  • 用类注册引入
  • 用包名引入(推荐)
<mappers>
    <!-- 用文件路径引入,这种方式是相对路径,相对于项目目录下 -->
    <mapper resource="com/mapper/UserMapper.xml" />

    <!-- 使用 URL 方式引入,这种方式是绝对路径,
    就是从我们的磁盘读取映射文件,一般不会使用这种方式 -->
    <mapper url="D:/xxx/com/mapper/UserMapper.xml" />

    <!-- 用类注册引入,若使用这种方式,Mapper接口的名称必须与映射文件的名称相同,
    并且要在同一个包名下,否则会找不到。如:UserMapper.java(接口)—UserMapper.xml(映射文件) -->
    <mapper class="com.mapper.UserMapper" />

    <!-- 用包名引入(推荐),这种方式的要求同样是Mapper接口和Mapper的映射文件的名称要相同,
    并且要放在相同的包名下,否则会导致找不到 -->
    <package name="com.mapper"/>
</mappers>

11 参考文档

尚硅谷文档

MyBatis 配置 setting 详解

Mybatis3详解(三)----Mybatis全局配置文件详解 - 唐浩荣 - 博客园 (cnblogs.com)

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

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

相关文章

如何对酒店开展科学的定岗定编——以酒店健身房、娱乐房为例

近年来&#xff0c;随着旅游行业的快速发展&#xff0c;也带动了酒店业的兴盛。酒店的经营效益不仅受益于旅游业&#xff0c;同时也受制于旅游行业。由于旅游业存在明显的季节性差异&#xff0c;旅游旺季客流量多、淡季客流量少&#xff0c;造成人员忙闲不均的问题。酒店行业也…

怎么恢复删除的文件?6种有效的数据恢复方法汇总!

怎么才能恢复被删掉的数据啊&#xff1f;现在都是数字化时代了&#xff0c;我们的电脑里装了好多重要数据&#xff0c;一旦丢了&#xff0c;可是会给我们的工作和生活带来极大的麻烦啊。所以&#xff0c;学几招有效的电脑数据恢复方法是挺有必要的。下面&#xff0c;我就给大家…

C# 高阶语法 —— Winfrom链接SQL数据库的存储过程

存储过程在应用程序端的使用的优点 1 如果sql语句直接写在客户端&#xff0c;以一个字符串的形式体现的&#xff0c;提示不友好&#xff0c;会导致效率降低 2 sql语句写在客户端&#xff0c;可以利用sql注入进行攻击&#xff0c;为了安全性&#xff0c;可以把sql封装在…

出现 ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的解决方法(图文界面)

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 由于Java转全栈,对此前端的细节点都比他人更加注意,所以此处记录更有用的信息!(小白都能看懂) 1. 问题所示 出现如下问题: F:\vue_project>vue -version vue 不是内部或外部命令,也不是可运行的程序 或批处理文件…

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的&#xff0c;为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数&#xff0c;下面的函数用于查看GPU设备的一切信息。 …

挑战30天学完Python:Day29 API开发

&#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点知识&#xff0c;但又没…

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务&#xff0c;特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能&#xff0c;包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器&#xff0c;并…

【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…

mysql缓存机制面试题,学海无涯

二、我们先来看看这份笔记到底有什么 1、先把kubernetes跑起来&#xff08;先跑起来创建kubernetes集群部署应用访问应用Scale应用滚动更新&#xff09; 2、重要概念 3、部署kubernetes Cluster&#xff08;安装docker安装 kubelet.kubeadm和 kubectll用kubeadm 创建cluster&a…

【力扣hot100】刷题笔记Day18

前言 晚上巩固一下今天的回溯题&#xff0c;基础不牢地动山摇&#xff0c;po一张代码随想录总结的 组合补充 77. 组合 - 力扣&#xff08;LeetCode&#xff09; class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []res []def backtrack(star…

航拍无人机技术,航拍无人机方案详解,无人机摄影技术

航拍无人机是利用遥控技术和摄像设备&#xff0c;在空中进行拍摄和录像的无人机。这种无人机通常具有高清摄像设备、图像传输设备、GPS定位系统、智能控制系统等&#xff0c;可以轻松实现各种拍摄角度和高度&#xff0c;广泛应用于影视制作、旅游景区航拍、城市规划、环保监测等…

CryoEM - 使用 cryoSPARC 基于单颗粒图像从头重构蛋白质三维结构

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 基于冷冻电镜单颗粒图像重构蛋白质三维结构,利用冷冻电镜技术测定生物大分子结构的方法。原理是从冷冻电镜获得大量同一种蛋白质分子的二维投影图…

计算机组成原理-第一/二章 概述和数据的表示和运算【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计算机组成原理中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门&#xff1a; 第一/二章 概述和数据…

适用Java SpringBoot项目的分布式锁

在分布式系统中&#xff0c;常用到分布式锁&#xff0c;它有多中实现方式&#xff0c;如&#xff1a;基于redis&#xff0c;database&#xff0c;zookeeper等。Spring integration组件有这三种服务的分布式锁实现&#xff0c;今天来看看用的比较多的redis和database实现方式。 …

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割&#xff0c;提取出其中的单词。 在antlr4中&#xff0c;词法规则的名称的首字母需要大写&#xff0c;右侧必须是终结符&#xff0c;通常将词法…

Tomcat布署及优化

1.Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。一般来说&…

数据结构:队列 || oj(l两个队列实现栈)

[TOC](数据结构&#xff1a;队列 || oj(l两个队列实现栈)) 一、队列的概念 1.什么是队列&#xff1f; //先说一下&#xff0c;队列跟栈一样都是很重要的数据结构&#xff0c;重要的不是说这个数据结构怎么实现&#xff0c;重要的是结构的优势&#xff01; //栈&#xff1a;是…

上海亚商投顾:沪指终结月线6连阴 北向资金净买入超160亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日低开高走&#xff0c;沪指重新站上3000点&#xff0c;深成指、创业板指大涨超3%。半导体产业链全…

协议和序列化反序列化

“协议”和序列化反序列化 “协议”的概念&#xff1a; “协议”本身是一种约定俗成的东西&#xff0c;由通讯双方必须共同遵从的一组约定&#xff0c;因此我们一定要将这种约定用计算机语言表达出来&#xff0c;此时双方计算机才能识别约定的相关内容 我们把这个规矩叫做“…

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡&#xff1b;在拥堵的早高峰打个“空中的士”上班&#xff1b;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景&#xff0c;正逐渐走进现实。而推动上述场景实现的&#xff0c;就是近年来越来越热的“低空经…