07.MyBatis映射器:一对一关联查询

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。

《MyBatis 映射器:实现简单的 SQL 语句》中,我们在 MyBatis 映射器的查询语句中使用 resultType 元素实现了从数据库到 Java 对象的自动映射,但是这种自动映射是有它的局限性的,首先是要求数据库中表的列名必须与 Java 对象中的字段名保持一致,其次是无法实现关联查询,也就是说使用 resultType 元素无法应对一些复杂的场景,那么对于复杂的查询场景,MyBatis 中有没有可以应对的方案呢?
答案是肯定的,MyBatis 对这些复杂场景给出了自己的答案:resultMap 元素。

前期准备工作

正式开始前,我们要做一些准备工作,主要是两部分:数据库准备和项目准备。

数据库准备

在本文及未来的《MyBatis 映射器:一对多关联查询》的中,我们需要使用一套简单的“用户-订单”体系,数据库结构如下:

这里简单的描述下这 4 张表之间的关系:

  • 用户表(user)与用户订单表(user_order)之间通过 user_id 进行关联,每个用户可以对应多个订单,即一对多;
  • 用户订单表(user_order)与订单明细表(order_item)之间通过 order_id 进行关联,每个订单可以对应多个商品,即一对多;
  • 用户订单表(user_order)与支付订单表(pay_order)之间通过 order_id 进行关联,每个订单对应一个支付订单,即一对一。

你不需要照着图片创建这些表,因为我在文章的末尾准备了这 4 张表的建表 SQL 语句和测试数据的初始化 SQL 语句。

项目准备

我们再来准备一个用于练习的 MyBatis 项目,Maven 依赖和 mybatis-config.xml 的配置你可以在《MyBatis入门》中找到,这里我就不再赘述了。
接着,我们为上面的 4 张表创建对应的 Java 对象,Mapper 接口和映射器文件。如果你熟悉 MyBatis 生成工具(如 MyBatis-Generator,MyBatis X 等),你可以使用生成工具来创建这些文件,如果你不熟悉,你可以直接创建这些文件,只需要照着数据库表创建 Java 对象,并且创建对应的空的 Mapper 接口和映射器文件就可以了。
最后,我们准备一个单元测试文件,只需要提前做一些配置工作就可以了,代码如下:

public class CustomizeMappedTest {private static SqlSession sqlSession;private static UserMapper userMapper;private static UserOrderMapper userOrderMapper;private static PayOrderMapper payOrderMapper;private static OrderItemMapper orderItemMapper;@BeforeClasspublic static void init() throws IOException {Reader mysqlReader = Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(mysqlReader);sqlSession = sqlSessionFactory.openSession();userMapper = sqlSession.getMapper(UserMapper.class);userOrderMapper = sqlSession.getMapper(UserOrderMapper.class);payOrderMapper = sqlSession.getMapper(PayOrderMapper.class);orderItemMapper = sqlSession.getMapper(OrderItemMapper.class);}
}

至此,我们已经完成了所有前期准备工作,来看一下工程的整体结构:

基础用法:定义映射规则

如果你是通过 MyBatis 生成工具创建的映射器文件,那么在你的映射器文件中会出现如下配置(如果不是的话,把这些 copy 到你的项目中),这里以 UserOrderMapper.xml 为例:

<resultMap id="BaseResultMap" type="com.wyz.entity.UserOrderDO"><id property="orderId" column="order_id" jdbcType="INTEGER"/><result property="userId" column="user_id" jdbcType="INTEGER"/><result property="orderNo" column="order_no" jdbcType="VARCHAR"/><result property="orderPrice" column="order_price" jdbcType="DECIMAL"/><result property="orderStatus" column="order_status" jdbcType="INTEGER"/><result property="createDate" column="create_date" jdbcType="DATE"/><result property="payDate" column="pay_date" jdbcType="DATE"/>
</resultMap>

这便是 resultMap 元素最基础的用法,指定数据库表中字段与 Java 对象中字段的映射关系,定义数据库表与 Java 对象的映射规则
上面的配置内容并不难理解,这里我做一个简单的解释:

  • resultMap 元素:用于自定义映射规则;
    • id 属性,定义了 resultMap 元素的唯一标识;
    • type 属性,定义了与 resultMap 元素对应的 Java 对象;
  • id 元素:定义了数据库中主键与 Java 对象中字段的映射关系;
    • property 属性:映射到 Java 对象中的字段名;
    • column 属性:数据库表中的字段名;
    • jdbcType 属性:声明了数据库表中字段的类型;
  • result 元素,定义了数据库中普通字段与 Java 对象中字段的映射关系。

id 元素与 result 元素所使用的属性完全相同, 除了上面的 3 个之外,还有 javaType 属性和 typeHandler 属性,分别用于声明 Java 对象中字段的类型和字段需要使用的类型处理器
注意,由于使用 resultMap 元素是将数据库表中的字段名与 Java 对象中的字段名建立映射关系,因此我们不需要考虑到数据库字段命名规范与 Java 对象字段命名规范间的差异,也不需要在 mybatis-config.xml 中配置插件“mapUnderscoreToCamelCase”。
假设此时,老板提出了一个需求:“我想要通过订单号查询出订单信息”,那么我们可以这样定义 Mapper 接口中的方法:

UserOrderDO selectByOrderNo(@Param("orderNo")String orderNo);

映射器中的 SQL 语句如下:

<select id="selectByOrderNo" resultMap="BaseResultMap">select * from user_order where order_no = #{orderNo, jdbcType=VARCHAR}
</select>

最后我们来写单元测试:

@Test
public void selectByOrderNo() {UserOrderDO userOrder = userOrderMapper.selectByOrderNo("D202405082208045788");System.out.println("查询结果:");System.out.println(JSON.toJSONString(userOrder, JSONWriter.Feature.PrettyFormat));
}

执行单元测试,我们来看控制台输出的结果:

可以看到,测试结果符合我们的预期,数据库中表的字段与 Java 对象中的字段完成了映射。
当然,如果 resultMap 元素只有上面的那点功能的话,我们完全没有必要学习它。resultMap 元素最强大的功能在于它能够帮助我们实现关联查询,无论是一对一关联还是一对多关联,resultMap 都提供了解决方案

进阶用法:使用 association 元素实现一对一关联查询

完成了查询订单信息的功能后,老板提出了新的要求:“我想要用订单号同时查询出订单信息和支付订单信息”。
最容易想到的办法是拆分成多步查询,首先用订单号查询出订单信息,再用订单 ID 去查询关联的支付订单信息,最后将两者的数据合并后输出,但是这么做的问题是,两次查询需要经历两次数据库交互,会带来额外的性能损耗。
如果想要通过一次数据库交互查询出两张表的数据,可以使用联表查询一次性将用户订单与支付订单的数据全部查询出来,SQL 语句如下:

select uo.order_id,uo.user_id,uo.order_no,uo.order_price,uo.order_status,uo.create_date,uo.pay_date,po.pay_order_id as po_pay_order_id,po.order_id     as po_order_id,po.pay_order_no as po_pay_order_no,po.pay_amount   as po_pay_amount,po.pay_channel  as po_pay_channel,po.pay_status   as po_pay_status,po.create_date  as po_create_date,po.finish_date  as po_finish_date
from user_order uo,pay_order po
where uo.order_no = 'D202405082208045788'and uo.order_id = po.order_id;

在 SQL 语句的查询字段中,我为所有 pay_order 表的字段添加了前缀“po_”,这是因为 user_order 表与 pay_order 表有重名字段 order_id 和 create_date,虽然两张表中的 order_id 字段含义相同,取值也一样,但是 create_date 字段的含义却不相同,为了起到区分的作用,索性为 pay_order 表的所有字段都起了别名。
那么对于这样的查询结果我们该怎样使用 resultMap 元素进行映射呢?答案是使用 resultMap 元素和它的子元素 association 来实现一对一联表查询的结果集映射
我们先来修改下 UserOrderDO 对象,代码非常简单,只需要将 PayOrderDO 对象组合进来就行,如下:

public class UserOrderDO   {// 省略 UserOrderDO 本身的字段/*** 支付订单信息*/private PayOrderDO payOrder;
}

接着我们使用 resultMap 元素来构建新的映射规则“userOrderContainPayOrderMap”:

<resultMap id="userOrderContainPayOrderMap" type="com.wyz.entity.UserOrderDO" extends="BaseResultMap"><association property="payOrder" javaType="com.wyz.entity.PayOrderDO" columnPrefix="po_"><id property="payOrderId" column="pay_order_id" jdbcType="INTEGER"/><result property="orderId" column="order_id" jdbcType="INTEGER"/><result property="payOrderNo" column="pay_order_no" jdbcType="VARCHAR"/><result property="payAmount" column="pay_amount" jdbcType="DECIMAL"/><result property="payChannel" column="pay_channel" jdbcType="INTEGER"/><result property="payStatus" column="pay_status" jdbcType="INTEGER"/><result property="createDate" column="create_date" jdbcType="DATE"/><result property="finishDate" column="finish_date" jdbcType="DATE"/></association>
</resultMap>

我们来解释下“userOrderContainPayOrderMap”的配置。
首先是 resultMap 元素中出现的 extends 属性,resultMap 元素中的 extends 属性与 Java 中的关键字 extends 的作用是一样的,用于继承父类(映射规则)。
接着是 association 元素,association 元素表示一个复杂 Java 对象的关联,我们来逐一解释 association 元素中出现的属性:

  • property 属性,用于配置该类型在 Java 对象中字段名,在我们的例子中,即 PayOrderDO 对象在 UserOrderDO 对象中的字段名;
  • javaType 属性,用于生命 association 元素关联的 Java 对象类型
  • columnPrefix 属性,用于配置数据库查询字段的前缀,使用 columnPrefix 属性后,association 元素中配置的字段可以省略前缀,即 SQL 语句中使用了别名“po_pay_order_id”,在配置时可以直接使用“pay_order_id”。

接着我们来定义 Mapper 接口中的方法:

UserOrderDO selectUserOrderAndPayOrderByOrderNo(@Param("orderNo")String orderNo);

然后是编写映射器中对应的 SQL 语句:

<select id="selectUserOrderAndPayOrderByOrderNo" resultMap="userOrderContainPayOrderMap">select uo.order_id,uo.user_id,uo.order_no,uo.order_price,uo.order_status,uo.create_date,uo.pay_date,po.pay_order_id as po_pay_order_id,po.order_id     as po_order_id,po.pay_order_no as po_pay_order_no,po.pay_amount   as po_pay_amount,po.pay_channel  as po_pay_channel,po.pay_status   as po_pay_status,po.create_date  as po_create_date,po.finish_date  as po_finish_datefrom user_order uo,pay_order powhere uo.order_no = #{orderNo,jdbcType=VARCHAR}and uo.order_id = po.order_id;
</select>

最后我们来写单元测试:

public void selectUserOrderAndPayOrderByOrderNo() {UserOrderDO userOrder = userOrderMapper.selectUserOrderAndPayOrderByOrderNo("D202405082208045788");System.out.println("查询结果:");System.out.println(JSON.toJSONString(userOrder, JSONWriter.Feature.PrettyFormat));
}

执行单元测试,我们来看控制台输出的内容:

可以看到,控制台输出的结果中,联表查询的结果能够正常的映射到 UserOrderDO 对象中组合的 PayOrderDO 对象上。

进阶用法:使用 association 元素实现嵌套查询

最后我们来看一种使用 association 元素实现嵌套查询的方法。
association 元素可以使用简单的 SQL 语句进行嵌套查询,这与我们最开始想到的分步查询,组合结果的想法是一样的。
首先我们定义嵌套查询的 Mapper 接口中的方法:

UserOrderDO selectUserOrderAndPayOrderByOrderNoNest(@Param("orderNo")String orderNo);

Tips:千万不要诟病我起的方法名啊~~
接着我们来写映射器文件中对应的 SQL 语句:

<select id="selectUserOrderAndPayOrderByOrderNoNest" resultMap="userOrderContainPayOrderNestMap">select order_id,user_id,order_no,order_price,order_status,create_date,pay_datefrom user_orderwhere order_no = #{orderNo,jdbcType=VARCHAR}
</select>

注意看,这里的 SQL 语句中只是很简单的 user_order 表的单表查询,那么我是如何将 pay_order 表中的数据填充到 UserOrderDO 对象中的呢?
这里我们要先为 PayOrderMapper 补充一个非常简单的接口方法,如下:

PayOrderDO selectPayOrderByOrderId(@Param("orderId") Integer orderId);

接着来完善对应的映射器文件内容,如下:

<resultMap id="BaseResultMap" type="com.wyz.entity.PayOrderDO"><id property="payOrderId" column="pay_order_id" jdbcType="INTEGER"/><result property="orderId" column="order_id" jdbcType="INTEGER"/><result property="payOrderNo" column="pay_order_no" jdbcType="VARCHAR"/><result property="payAmount" column="pay_amount" jdbcType="DECIMAL"/><result property="payChannel" column="pay_channel" jdbcType="INTEGER"/><result property="payStatus" column="pay_status" jdbcType="INTEGER"/><result property="createDate" column="create_date" jdbcType="DATE"/><result property="finishDate" column="finish_date" jdbcType="DATE"/>
</resultMap><select id="selectPayOrderByOrderId" resultMap="BaseResultMap">select * from pay_order where order_id = #{orderId,jdbcType=INTEGER}
</select>

注意,因为没有开启插件“mapUnderscoreToCamelCase”,所以自动映射无法完成下划线与驼峰命名法的转换,所以这里也使用了 resultMap 进行映射。
做完了这些准备工作后,我们在 UserOrderMappe.xml 定义新的映射规则“userOrderContainPayOrderNestMap”,如下:

<resultMap id="userOrderContainPayOrderNestMap" type="com.wyz.entity.UserOrderDO" extends="BaseResultMap"><association property="payOrder" javaType="com.wyz.entity.PayOrderDO" select="com.wyz.mapper.PayOrderMapper.selectPayOrderByOrderId"column="{orderId=order_id}" />
</resultMap>

来解释下这里 association 元素中出现的两个陌生属性:

  • select 属性,用于配置嵌套查询的 SQL 语句,在这个例子中就是使用订单 id 查询支付订单信息的 SQL 语句;
  • column 属性,配置查询语句中所用到的参数,即PayOrderMapper#selectPayOrderByOrderId方法中使用的参数,如果有多个参数的话使用英文逗号分隔,例如:{orderId=order_id, payOrderId=pay_order_id}

最后我们编写单元测试代码:

public void selectUserOrderAndPayOrderByOrderNoNest() {UserOrderDO userOrder = userOrderMapper.selectUserOrderAndPayOrderByOrderNoNest("D202405082208045788");System.out.println("查询结果:");System.out.println(JSON.toJSONString(userOrder, JSONWriter.Feature.PrettyFormat));
}

执行单元测试后,我们来观察控制台的数据结果:

先来看控制台最后输出的查询结果,依旧符合我们的预期,接着来看 MyBatis 打印的 SQL 语句日志,可以看到这里执行了两条 SQL 语句,分别是通过订单号查询用户订单信息的 SQL 语句和通过用户订单 Id 查询支付订单信息的 SQL 语句,这说明在 association 元素中使用嵌套查询,执行了两次 SQL 语句。

附录:SQL 语句

用户表

建表语句:

create table user (user_id   int         not null comment '用户Id' primary key,name      varchar(50) not null comment '用户名',age       int         not null comment '年龄',gender    varchar(50) not null comment '性别',id_type   int         not null comment '证件类型',id_number varchar(50) not null comment '证件号'
) comment '用户表';

初始化语句:

INSERT INTO mybatis.user (user_id, name, age, gender, id_type, id_number)
VALUES (1, '刘一', 17, 'M', 1, '1101012000808186530');

用户订单表

建表语句:

create table user_order (order_id     int auto_increment comment '订单表主键' primary key,user_id      int            not null comment 'user表的主键',order_no     varchar(50)    null comment '订单号',order_price  decimal(18, 2) not null comment '订单价格',order_status int            null comment '订单状态',create_date  date           null comment '订单创建时间',pay_date     date           null comment '订单支付时间'
) comment '用户订单表';

初始化语句:

INSERT INTO user_order (order_id, user_id, order_no, order_price, order_status, create_date, pay_date)
VALUES (1, 1, 'D202405082208045788', 10000.00, 1, '2024-05-14', '2024-05-14');INSERT INTO user_order (order_id, user_id, order_no, order_price, order_status, create_date, pay_date) 
VALUES (2, 1, 'D202405131542336954', 9900.00, 1, '2024-05-01', '2024-05-01');

订单明细表

建表语句:

create table order_item (item_id         int            not null comment '订单商品表主键' primary key,order_id        int            null comment '订单表主键',commodity_id    int            null comment '商品表主键',commodity_price decimal(18, 2) null comment '商品价格',commodity_count int            null comment '商品数量'
) comment '订单明细表';

初始化语句:

INSERT INTO order_item (item_id, order_id, commodity_id, commodity_price, commodity_count)
VALUES (1, 1, 350071, 100.00, 10);INSERT INTO order_item (item_id, order_id, commodity_id, commodity_price, commodity_count)
VALUES (2, 1, 350083, 500.00, 10);INSERT INTO order_item (item_id, order_id, commodity_id, commodity_price, commodity_count)
VALUES (3, 1, 360302, 400.00, 10);

支付订单表

建表语句:

create table pay_order (pay_order_id int            not null comment '支付订单表主键' primary key,order_id     int            null comment '订单表主键',pay_order_no varchar(50)    null comment '支付订单号',pay_amount   decimal(18, 2) null comment '支付金额',pay_channel  int            null comment '支付渠道',pay_status   int            null comment '支付状态',create_date  date           null comment '支付订单创建时间',finish_date  date           null comment '支付订单完成时间'
) comment '支付订单表';

初始化语句:

INSERT INTO pay_order (pay_order_id, order_id, pay_order_no, pay_amount, pay_channel, pay_status, create_date, finish_date) 
VALUES (1, 1, 'Z202405082208557945', 10000.00, 37, 1, '2024-05-15', '2024-05-15');INSERT INTO pay_order (pay_order_id, order_id, pay_order_no, pay_amount, pay_channel, pay_status, create_date, finish_date) 
VALUES (2, 2, 'Z202405131543079921', 9900.00, 98, 1, '2024-05-01', '2024-05-01');

附录:数据库别名的“骚”操作

使用数据库别名实现自动映射

实际上,使用数据库别名也可以在不使用插件“mapUnderscoreToCamelCase”时,实现自动映射,例如:

<select id="selectByOrderNoUseAlias" resultType="com.wyz.entity.UserOrderDO">select order_id as orderId,user_id as userId,order_no as orderNo,order_price as orderPrice,order_status as orderStatus,create_date as createDate,pay_date as payDatefrom user_orderwhere order_no = #{orderNo,jdbcType=VARCHAR}
</select>

使用数据库表名实现一对一关联自动映射

前面我们借助了 resultMap 元素和其子元素 association 实现了一对一关联映射,但实际上,这种场景我们依旧可以借助数据库别名来实现自动映射。
先来写一个 Mapper 接口:

UserOrderDO selectUserOrderAndPayOrderByOrderNoUseAlias(@Param("orderNo")String orderNo);

接着我们来写映射器文件中的 SQL 语句:

<select id="selectUserOrderAndPayOrderByOrderNoUseAlias" resultType="com.wyz.entity.UserOrderDO">select uo.order_id     as orderId,uo.user_id      as userId,uo.order_no     as orderNo,uo.order_price  as orderPrice,uo.order_status as orderStatus,uo.create_date  as createDate,uo.pay_date     as payDate,po.pay_order_id as "payOrder.payOrderId",po.order_id     as "payOrder.orderId",po.pay_order_no as "payOrder.payOrderNo",po.pay_amount   as "payOrder.payAmount",po.pay_channel  as "payOrder.payChannel",po.pay_status   as "payOrder.payStatus",po.create_date  as "payOrder.createDate",po.finish_date  as "payOrder.finishDate"from user_order uo, pay_order powhere uo.order_no = #{orderNo,jdbcType=VARCHAR}and uo.order_id = po.order_id
</select>

最后你可以写一个单元测试来测试下结果。


尾图(二维码).png

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

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

相关文章

AMBA-CHI协议详解(四)

《AMBA 5 CHI Architecture Specification》 AMBA-CHI协议详解&#xff08;一&#xff09; AMBA-CHI协议详解&#xff08;二&#xff09; AMBA-CHI协议详解&#xff08;三&#xff09; AMBA-CHI协议详解&#xff08;四&#xff09; 文章目录 2.3.3 Atomic transactions2.3.4 S…

MySql进阶:深入理解MySQL语句执行逻辑

深入理解MySQL语句执行逻辑 一、前言 本文源自微博客(www.microblog.store),且以获得授权 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。   本文将从MySQL总体架构—&…

plc如何接线

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「plc的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;PLC自动化控制在电气自动化和…

Adobe Premiere 视频编辑软件下载安装,pr 全系列资源分享!

Adobe Premiere以其强大的功能、灵活的操作和卓越的性能&#xff0c;成为视频编辑领域的佼佼者。 在剪辑方面&#xff0c;Adobe Premiere提供了强大而灵活的工具集。用户可以在直观的时间线上对视频进行精细的裁剪、剪辑和合并操作。无论是快速剪辑短片&#xff0c;还是精心打造…

springboot心理健康线上咨询系统APP-计算机毕业设计源码031539

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对心理健康咨询等问题&#xff0c;对其进行研…

钡铼BL102应用智能电网配电柜PLC转MQTT无线接云服务

在当今智能电网的发展浪潮中&#xff0c;配电系统的智能化升级是提升电网效率与稳定性的重要环节。随着物联网技术的飞速发展&#xff0c;实现配电柜的远程监控与管理成为了可能&#xff0c;而这一转变的关键在于如何有效地将传统配电柜中的PLC数据接入到云端进行分析与处理。 …

大数据关联规则算法

关联性&#xff08;Association&#xff09; 定义&#xff1a;指一个变量能够提供有关另一个变量的信息。特点&#xff1a;关联性是一个广泛的概念&#xff0c;它可以包括直接的、间接的、强的或弱的联系。 相关性&#xff08;Correlation&#xff09; 定义&#xff1a;指两个…

AI视频智能监管赋能城市管理:打造安全有序的城市环境

一、方案背景 随着城市化进程的加速和科技的飞速发展&#xff0c;街道治安问题日益凸显&#xff0c;治安监控成为维护社会稳定和保障人民安全的重要手段。当前&#xff0c;许多城市已经建立了较为完善的治安监控体系&#xff0c;但仍存在一些问题。例如&#xff0c;监控设备分…

window 卸载应用商店程序

# 使用Get-AppxPackage获取所有应用程序 # 使用Remove-AppxPackage PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0

【Linux 基础】目录结构

Linux 的目录结构&#xff08;也称为文件系统结构&#xff09;是组织文件和目录的一种逻辑方式。每个文件和目录在文件系统中都有一个唯一的位置或路径。 Linux文件系统是整个操作系统的基础架构&#xff0c;对于系统的稳定运行、数据安全以及用户操作便捷性至关重要&#xff0…

webhook-k8s API和apimachinery版本高于Client-go

1. 问题 使用go mod tidy 存在丢弃的版本 go: downloading github.com/josharian/intern v1.0.0 go: finding module for package k8s.io/api/flowcontrol/v1alpha1 go: simple-webhook/types importsk8s.io/client-go/rest tested byk8s.io/client-go/rest.test importsk8s.…

场外个股期权通道业务是什么意思?

今天带你了解场外个股期权通道业务是什么意思&#xff1f;场外个股期权业务是指在沪深交易所之外进行的个股期权交易。它是一种非标准化的合约&#xff0c;不在交易所内进行交割。 场外个股期权通道业务&#xff0c;是指投资者通过与场外个股期权机构通道签订合约&#xff0c;购…

uni-app中使用富文本rich-text个人经验

rich-text是在uni-app一个内置组件&#xff0c;用于高性能地渲染富文本内容。先贴一下官方的属性列表&#xff1a; 先说一下“selectable” 长按选择区域复制&#xff0c;这个我在APP项目中 不起作用&#xff0c;可能像文档说的&#xff0c;只支持“百度小程序”吧。在APP端起作…

CUDA系列-Mem-9

这里写目录标题 Static Architecture.Abstractions provided by CUSW_UNIT_MEM_MANAGERMemory Object (CUmemobj) Memory Descriptor(CUmemdesc)Memory Block(CUmemblock)Memory BinsSuballocations in Memory BlockFunctional description Memory Manager 你可能觉得奇怪&…

使用SQLite

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 与许多其他数据库管理系统不同&#xff0c;SQLite不是一个客户端/服务器结构的数据库引擎&#xff0c;而是一种嵌入式数据库&#xff0c;它的数据库就…

Centos 配置安装Mysql

linux安装配置mysql的方法主要有yum安装和配置安装两种&#xff0c;由于yum安装比较简单&#xff0c;但是会将文件分散到不同的目录结构下面&#xff0c;配置起来比较麻烦&#xff0c;这里主要研究一下配置安装mysql的方法 1、环境说明 centos 7.9 mysql 5.7.372、环境检查 …

反激式开关电源是如何工作的

反激的变压器可以看作一个带变压功能的电感&#xff0c;是一个buck-boost电路。 反击式开关变压器 反激式开关电源是指使用反激高频变压器隔离输入输出回路的开关电源。“反激”指的是在开关管接通的情况下&#xff0c;当输入为高电平时输出线路中串联的电感为放电状态&#x…

ABAP-03基础数据类型

基本数据类型 数据类型默认大小&#xff08;byte&#xff09;有效大小初始值说明示例C11-65535SPACE文本字符&#xff08;串&#xff09;‘Name’N11-65535‘00…0’数字文本‘0123’T66‘000000’时间(HHMMSS)‘123010’D88‘00000000’日期(yyyymmdd)‘20090901’I4-231~232…

算法基础精选题单 动态规划(dp)(递推+线性dp)(个人题解)

前言&#xff1a; 一些简单的dp问题。 正文&#xff1a; 题单&#xff1a;237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) 递推&#xff1a; NC235911 走楼梯&#xff1a; #include<bits/stdc.h> using na…

在k8s上部署一个简单的应用

部署一个简单的应用 实验目标&#xff1a; 部署一个简单的 web 应用&#xff0c;比如 Nginx 或者一个自定义的 Node.js 应用。 实验步骤&#xff1a; 创建一个 Deployment。创建一个 Service 来暴露应用。验证应用是否可以通过 Service 访问。 今天我们来做一下昨天分享的可…