Mybatis之动态SQL及映射结果(带你了解动态SQL的魅力)

目录

前言

一、Mybatis之动态SQL

1. 简介

2. 作用及重要性

 3. 应用场景

二、动态SQL讲解

1. 原生使用工具类(BaseDao)的SQL

2. 运用动态SQL编写方法

2.1 Mybatis动态SQL的常用标签

2.2 Mybatis动态SQL的常用函数

2.3 案例展示

if标签的运用

foreach标签的运用

三、动态SQL之模糊查询

1. 模糊查询的三种写法

BookMapper.xm

在接口类和接口实现编写方法

测试类代码

测试结果

2.#符和$符的区别(面试题)

四、Mybatis中的结果映射

(1)场景模拟及使用的结果映射

1.返回单表的对应的实体类,仅又一个查询结果(可以用resultType/resultMap)

2.返回单表的对应的实体类,有多个查询结果(可以用resultType/resultMap)

3.返回多表的对应结果,仅有一个查询结果(通常用resultType,也可以用resultMap)

4.返回多表的对应结果,有多个查询结果(通常用resultType,也可以用resultMap)

5.返回单个列段,仅有一个查询结果(就用resultType)

6.返回单个列段,有多个查询结果(就用resultType)

(2)resultType与resultMap的区别


前言

在前面的一期博客中我们分享了有关Mybatis入门简介及用Mybatis模拟测试一些相关数据库数据操作的功能,这一期博客我继续为大家分享有关Mybatis的相关知识点,今天我分享的内容是Mybatis之动态SQL及映射结果。请老铁们仔细阅读。

一、Mybatis之动态SQL

1. 简介

  • MyBatis中的动态SQL是一种在SQL语句中根据条件动态生成不同部分的技术。它允许我们根据不同的条件来构建不同的SQL语句,从而实现更灵活的查询和更新操作。
  • 在MyBatis中,我们可以使用动态SQL来处理各种情况,例如根据不同的条件拼接WHERE子句、根据条件选择不同的列、根据条件判断是否包含某个元素等等。
  • MyBatis提供了一些标签和函数来实现动态SQL,其中最常用的是if、choose、when、otherwise和foreach标签。通过使用这些标签,我们可以根据条件来动态生成SQL语句的不同部分。

2. 作用及重要性

  1. 生成SQL语句具有灵活性:动态SQL允许根据不同的条件来生成不同的SQL语句,从而实现动态查询和更新操作。这样我们可以根据项目框架需求灵活地构造所需的SQL语句,避免了不需要硬编码的情况出现。

  2. 使SQL语句清晰易懂(可读性):使用动态SQL可以使SQL语句更加清晰易读。通过使用内置携带的函数与标签,根据条件组织SQL语句的不同部分,从而避免大量的SQL嵌套与重复。它使SQL语句更加直观,更有利于开发人员理解及维护

  3. 具有较强的扩展性:动态SQL提供了一种扩展SQL语句的方式,允许我们根据需求加、修改或删除查询条件。这种扩展性使得我们能够轻松地改变和优化SQL语句,而不需要修改大量的固定SQL代码。这样大大减少了开发使用的时间,提高了开发效率及后期的维护效率。

  4. 性能优化:通过使用动态SQL,我们可以根据不同的条件动态生成SQL语句,从而避免不必要的查询或更新操作。例如,我们可以根据用户的选择动态生成查询条件, 只查询真正需要的数据,减少了不必要的数据库操作,提高了系统性能

 3. 应用场景

Mybatis的应用场景
应用场景说明
条件查询当需要根据不同的条件进行查询时,可以使用动态SQL来根据条件动态拼接WHERE子句。比如在一个用户管理系统中,可以根据用户的姓名、性别、年龄等条件来进行灵活的查询。
动态排序当需要根据不同的字段进行排序时,可以使用动态SQL来动态生成ORDER BY子句。比如在一个商品列表中,用户可以选择按照价格、销量等字段进行排序。
动态更新当需要根据不同的条件来进行更新操作时,可以使用动态SQL来根据条件动态生成UPDATE语句。比如在一个订单系统中,可以根据订单状态、支付状态等条件来更新订单信息。
动态插入当需要根据不同的条件来进行插入操作时,可以使用动态SQL来根据条件动态生成INSERT语句。比如在一个用户注册系统中,可以根据用户的选择来插入不同的用户信息。
复杂逻辑处理当需要根据复杂的业务逻辑来生成SQL语句时,可以使用动态SQL来处理复杂的逻辑判断和条件拼接。比如在一个电商系统中,根据不同的促销活动和用户等级来生成不同的优惠查询条件。 
批量操作当需要对多个对象进行批量操作时,可以使用动态SQL来生成批量操作的SQL语句。比如批量插入多个用户数据或批量删除多个订单数据。

二、动态SQL讲解

1. 原生使用工具类(BaseDao)的SQL

//模拟原生编写数据库访问方法
BaseDao.javaexcuteUpdate(sql,book,attrs)String sql=update t_mvc_book set bname =?,price = ? where bid =?
//  此时假如前台jsp传参到后台,没有传递bname值,那么造成的结果如下update t_mvc_book set bname =null price =33 where bid =3

弊端:会将没有传参的字段值改为null,违背了我们编码的初衷。

2. 运用动态SQL编写方法

2.1 Mybatis动态SQL的常用标签

常用标签
标签使用说明
<if>条件判断标签,根据指定的条件来决定是否生成对应的SQL语句片段
<choose><when><otherwise>类似于Java中的switch语句,根据不同的条件来选择生成不同的SQL语句片段。
<trim>用于去除或补齐SQL语句片段的开头和结尾的空格,可以用于拼接包含可选条件的SQL语句。
<where>用于拼接WHERE子句,自动处理WHERE关键字和添加适当的AND或OR连接条件。
<set>用于拼接UPDATE语句的SET子句,自动处理SET关键字和添加适当的逗号分隔更新字段。
<foreach>用于循环遍历集合或数组,并在SQL语句中插入对应的元素作为参数。可以指定开始位置、结束位置、分隔符等属性。
<bind>用于将一个常量绑定到一个变量上,在后续的SQL语句中使用该变量。 这些标签在Mybatis中可以帮助我们根据不同的条件动态生成SQL语句,使得我们可以更加灵活地构建查询和更新语句。

2.2 Mybatis动态SQL的常用函数

常用函数
函数函数说明
trim()去除字符串的开头或结尾指定字符(默认为空格)。 例子:<trim prefixOverrides="AND |OR ">...</trim>
concat()拼接多个字符串。 例子:${param1} + ' ' + ${param2}
substring()截取字符串的一部分。 例子:SUBSTRING(column_name, start_index, length)
lower()将字符串转换为小写。 例子:LOWER(column_name)
upper()将字符串转换为大写。 例子:UPPER(column_name)
replace()替换字符串中的某个字符或字符串。 例子:REPLACE(column_name, old_string, new_string)
length()获取字符串的长度。 例子:LENGTH(column_name)
now()获取当前时间。 例子:NOW()
date_format()格式化日期。 例子:DATE_FORMAT(column_name, pattern)

2.3 案例展示

if标签的运用

foreach标签的运用

场景

//假设编写的SQL语句如下所示delete* from t_oa_permission where id in (...)
//其中括号里的是条件,也是前台需要传过来的参数
//有些时候我们前台会传一个字符串过来(如下所示)1,2,3,4,5,6
//像我们在删除购物车的时候,我们一般会这样写for int id : idsorderItemsDao.delete(id);
//这么写的目的只是懒得拼接SQL语句delete* from t_oa_permission where id in ( 1,2,3,4,5,6)
//  如果我们要上上面那样去编写代码的话
//  首先实例化Stringbuffer类来读取字符串Stringbuffer sb=new Stringbuffer();// 然后对其进行一系列操作sb.append(",").append(id)//进行选择性的截取sb.substring(1)//由此而知,我们如果按照上述方式编写代码的话会需要花费人力资源和时间精力,
//这并不利于我们大大提高我们自身的开发效率;
//而且该方式对SQL语句处理较为复杂,过程繁琐。

BookMapper.xml(编写方法)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yx.mapper.BookMapper" ><resultMap id="BaseResultMap" type="com.yx.model.Book" ><constructor ><idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" /><arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" /><arg column="price" jdbcType="REAL" javaType="java.lang.Float" /></constructor></resultMap><sql id="Base_Column_List" >bid, bname, price</sql><select id="selectByBids" resultType="com.yx.model.Book" parameterType="java.util.List" >select<include refid="Base_Column_List" />from t_mvc_bookwhere bid in<foreach collection="bids" item="bid" open="(" close=")" separator=",">#{bid}</foreach></select></mapper>

在接口类和接口实现编写方法

package com.yx.biz;import com.yx.model.Book;import java.util.List;public interface BookBiz {List<Book> selectByBids(List bids);
}//========================以上是接口类的代码=====================
//==========================以下是接口实现类的代码==========================package com.yx.biz.Impl;import com.yx.biz.BookBiz;
import com.yx.mapper.BookMapper;
import com.yx.model.Book;import java.util.List;/*** @author 君易--鑨* @site www.yangxin.com* @company 木易* @create  2023-08-21 10:15*/
public class BookBizImpl implements BookBiz {@Overridepublic List<Book> selectByBids(List bids) {return bookMapper.selectByBids(bids);}}//==========================以下是BookMapper 的代码==========================package com.yx.mapper;import com.yx.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {List<Book> selectByBids(@Param("bids") List bids);}

测试类代码

 @Test//   测试方法public void testByid(){System.out.println("测试使用foreach标签的方法...");List<Integer> bids = Arrays.asList(new Integer[]{55, 56, 57, 58, 59, 60});bookBiz.selectByBids(bids).forEach(System.out::println);//jdk1.8的新特性。
//       打印输出}

输出结果

三、动态SQL之模糊查询

1. 模糊查询的三种写法

BookMapper.xm

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yx.mapper.BookMapper" ><resultMap id="BaseResultMap" type="com.yx.model.Book" ><constructor ><idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" /><arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" /><arg column="price" jdbcType="REAL" javaType="java.lang.Float" /></constructor></resultMap><sql id="Base_Column_List" >bid, bname, price</sql><!--  #字符号--><select id="like01" resultType="com.yx.model.Book" parameterType="java.lang.String">select <include refid="Base_Column_List" />from t_mvc_bookwhere bname like #{bname}</select><!--  $符号--><select id="like02" resultType="com.yx.model.Book" parameterType="java.lang.String">select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like ${bname}</select><!--  concat--><select id="like03" resultType="com.yx.model.Book" parameterType="java.lang.String">select<include refid="Base_Column_List" />from t_mvc_bookwhere bname like concat('%',#{bname},'%')</select></mapper>

在接口类和接口实现编写方法

package com.yx.mapper;import com.yx.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {//#List<Book> like01(@Param("bname") String bname);
//$List<Book> like02(@Param("bname") String bname);
//concatList<Book> like03(@Param("bname") String bname);
}
//===============以上是BookMapper的代码========================
//===============以下是方法接口的代码========================
package com.yx.biz;import com.yx.model.Book;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookBiz {//#List<Book> like01(@Param("bname") String bname);//$List<Book> like02(@Param("bname") String bname);//concatList<Book> like03(@Param("bname") String bname);}//===============以下是方法接口实现类的代码========================
package com.yx.biz.Impl;import com.yx.biz.BookBiz;
import com.yx.mapper.BookMapper;
import com.yx.model.Book;import java.util.List;/*** @author 君易--鑨* @site www.yangxin.com* @company 木易* @create  2023-08-21 10:15*/
public class BookBizImpl implements BookBiz {
//    调用代码生成器的接口BookMapper bookMapper;public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic List<Book> like01(String bname) {return bookMapper.like01(bname);}@Overridepublic List<Book> like02(String bname) {return bookMapper.like02(bname);}@Overridepublic List<Book> like03(String bname) {return bookMapper.like03(bname);}
}

测试类代码

package com.yx.Demo;import com.yx.biz.BookBiz;
import com.yx.biz.Impl.BookBizImpl;
import com.yx.mapper.BookMapper;
import com.yx.model.Book;
import com.yx.untils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.Arrays;
import java.util.List;/*** @author 君易--鑨* @site www.yangxin.com* @company 木易* @create  2023-08-21 10:26* 测试增删改查的方法*/
public class Dmeo1 {
//    实例化工具类和业务层类private SqlSession sqlSession;private BookBiz bookBiz;@Beforepublic void a(){System.out.println("执行测试代码块之前会执行的初始化代码块......");
//        获取session对象sqlSession=SessionUtil.openSession();BookBizImpl bookBiz=new BookBizImpl();
//        获取BookMapper对象BookMapper mapper=sqlSession.getMapper(BookMapper.class);
//        将获取到的BookMapper对象添加到bookBiz中bookBiz.setBookMapper(mapper);
//        扩大作用权限this.bookBiz=bookBiz;}@Afterpublic void b(){System.out.println("执行测试代码块之后会执行的初始化代码块......");
//   提交数据库提交事务sqlSession.commit();}@Test//   测试方法public void testlike01(){System.out.println("测试like01方法...");bookBiz.like01("%圣墟%").forEach(System.out::println);//jdk1.8的新特性。}@Test//   测试方法public void testlike02(){System.out.println("测试like01方法...");bookBiz.like02("%圣墟%").forEach(System.out::println);//jdk1.8的新特性。}@Test//   测试方法public void testlike03(){System.out.println("测试like01方法...");bookBiz.like03("%圣墟%").forEach(System.out::println);//jdk1.8的新特性。}
}

测试结果

#字符编写方法的测试效果

$字符编写方法的测试效果

运用concat编写的方法测试结果

注意事项:

  • 如果运用了$字符编写了模糊查询的方法,在方法语句体中${参数字段}未用单引号包裹则会报错,SQL编写错误如下图所示

2.#符和$符的区别(面试题)

  1. $是占位符传参,#是预处理SQL
  2. 在外在形式,$传参不带引号,#传参自带引号     
  3. $传参存在SQL注入,#不存在
  4. $可以用来做动态列,完成动态SQL开发

四、Mybatis中的结果映射

使用mybatis的各种场景,返回的结果是多样的,resultType与resultMap有什么区别 请看下面模拟。

(1)场景模拟及使用的结果映射

1.返回单表的对应的实体类,仅又一个查询结果(可以用resultType/resultMap)

2.返回单表的对应的实体类,有多个查询结果(可以用resultType/resultMap)

3.返回多表的对应结果,仅有一个查询结果(通常用resultType,也可以用resultMap)

4.返回多表的对应结果,有多个查询结果(通常用resultType,也可以用resultMap)

5.返回单个列段,仅有一个查询结果(就用resultType)

6.返回单个列段,有多个查询结果(就用resultType)

(2)resultType与resultMap的区别

  • resultType:对应的是返回类型
  • resultMap:对应的是返回映射关系,指的是实体类与数据库表字段的关系。

通常而言,单表查询,返回单列,返回多表查询结果,使用resultType。

如果查询的结果,需要使用关联属性的体现,那么使用resultMap。

resultType适用于简单的映射需求,而resultMap适用于更复杂的映射需求,可以定义更灵活的映射规则。根据具体的需求和情况,选择合适的映射方式非常重要。

我的分享到这里就结束了,感兴趣的老铁点赞加关注,后续我会继续与老铁们分享 

一波三连,拜托拜托

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

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

相关文章

angular中如何定义一个全局组件?

需求&#xff0c;我们需要新建一个navBreadcrumb的全局组件。这是一个面包屑导航&#xff0c;在不同的页面引入时传入一个路由数组即可。 第一步&#xff1a;我们新建这个组件&#xff1a; ng g c navBreadcrumb ng g m navBreadcrumb----------nav-breadcrumb.module-------…

AMBA总线协议(8)——AHB(六):分割传输

一、前言 在之前的文章中&#xff0c;我们重点介绍了AHB传输的仲裁&#xff0c;首先介绍了仲裁相关的信号&#xff0c;然后分别介绍了请求总线访问&#xff0c;授权总线访问&#xff0c;猝发提前终止&#xff0c;锁定传输和默认主机总线&#xff0c;在本文中我们将继续介绍AHB的…

论文《LoRA: Low-Rank Adaptation of Large Language Models》阅读

论文《LoRA: Low-Rank Adaptation of Large Language Models》阅读 BackgroundIntroducitonProblem StatementMethodology Δ W \Delta W ΔW 的选择 W W W的选择 总结 今天带来的是由微软Edward Hu等人完成并发表在ICLR 2022上的论文《LoRA: Low-Rank Adaptation of Large Lan…

交叉编译 libzdb

参考博客&#xff1a;移植libzdb3.2.2到arm_configure: error: no available database found or s_酣楼驻海的博客-CSDN博客 编译时间 2023-08-23 libzdb 下载&#xff1a; 源码访问如下&#xff1a; https://bitbucket.org/tildeslash/libzdb/src/master/ git 下载链接 …

低代码开发ERP:精打细算,聚焦核心投入

企业数字化转型已经成为现代商业环境中的一项关键任务。如今&#xff0c;企业面临着日益激烈的竞争和不断变化的市场需求。在这样的背景下&#xff0c;数字化转型不仅是企业生存的必然选择&#xff0c;也是取得竞争优势和实现可持续发展的关键因素。 在数字化转型的过程中&…

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务 Intel DevCloud for oneAPI 和 Intel Optimization for PyTorch基于BERT预训练模型的英文文本蕴含任务语料介绍数据集构建 模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0…

3D数据转换工具HOOPS Exchange概览

HOOPS Exchange SDK是一组C软件库&#xff0c;使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据&#xff0c;包括边界表示&#xff08;BREP&#xff09;、产品制造信息&#xff08;PMI&#xff09;、模型树、视图、持久ID、样式、构造…

使用 MATLAB 和 Simulink 对雷达系统进行建模和仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Redis多机实现

Background 为啥要有多机--------------1.容错 2.从服务器分担读压力。 主从结构一大难题------------如何保障一致性&#xff0c;对这个一致性要求不是很高&#xff0c;因为redis是用来做缓存的 同时我们要自动化进行故障转移-------哨兵机制&#xff0c;同时哨兵也可能cra…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 拉取mysql:5.6和owncloud的镜像和生成实例 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull ownclound [rootlocalhost ~]# docker run -d --name mydb1 --env MYSQL_ROOT_PASSWO…

智慧工地:安防监控EasyCVR智慧工地视频监管风险预警平台的应用

智慧工地方案是一种结合现代化技术与工地管理实践的创新型解决方案。它通过实时监控、数据分析、人工智能等技术手段&#xff0c;使工地管理更加高效、智能化。在建设智慧工地的过程中&#xff0c;除了上述提到的利用物联网技术实现设备互联、数据采集及分析以外&#xff0c;还…

python - 编程中【工厂模式】和【单例模式】区别以及代码示例详解

一. 概念 工厂模式和单例模式都是面向对象编程中常用的设计模式。 工厂模式&#xff08;FactoryPattern&#xff09;&#xff1a;是一种创建型模式&#xff0c;它提供了一种方法来创建对象&#xff0c;而不需要暴露对象的创建逻辑。这种模式通过定义一个工厂类&#xff0c;通…

远程端口转发 实践 如何将物理机某一端口的服务转发到vps上,使得外网能访问到

以本机1470端口&#xff08;我的sqli-labs&#xff09;与vps的9023端口为例。 SSH基本的连接命令是&#xff1a; ssh usernamehostname这里牵扯到了两台主机&#xff0c;一是执行命令、运行SSH客户端的主机&#xff0c;我们称为本地主机A【Host A】&#xff1b;二是接收连接请…

小程序运营方式有哪些?如何构建小程序运营框架?

​如今&#xff0c;每个企业基本都做过至少一个小程序&#xff0c;但由于小程序本身不具备流量、也很少有自然流量&#xff0c;因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些&#xff1f; 在正式运营小程序前&#xff0c;了解小程序的功能与企业实际经…

Heikin Ashi最简单的一种烛台移动平均线

是不是每次进行交易的时候&#xff0c;市场上的各种新闻真真假假&#xff0c;搞的交易者每次都分不清楚&#xff0c;今天FPmarkets澳福给各位投资者推荐一种交易策略——“Heikin Ashi” “Heikin Ashi”只通过四个参数构建&#xff1a;开盘价、收盘价、最高价和最低价(最大和…

ssm汽车养护管理系统源码和论文

ssm汽车养护管理系统038 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 开题报告内容&#xff1a;&#xff08;研究现状、目的意义&#xff1b;基本内容、研究方法、参考文献等。&#xff09; 研究现状 国外…

chapter 3 Free electrons in solid - 3.1 自由电子模型

3.1 自由电子模型 Free electron model 研究晶体中的电子&#xff1a; 自由电子理论&#xff1a;不考虑离子实能带理论&#xff1a;考虑离子实&#xff08;周期性势场&#xff09;的作用 3.1.1 德鲁德模型 Drude Model - Classical Free Electron Model (1)德鲁德模型 德鲁…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

React(7)

1.React Hooks 使用hooks理由 1. 高阶组件为了复用&#xff0c;导致代码层级复杂 2. 生命周期的复杂 3. 写成functional组件,无状态组件 &#xff0c;因为需要状态&#xff0c;又改成了class,成本高 1.1 useState useState();括号里面处的是初始值&#xff1b;返回的是一个…

2023年大数据与区块链国际会议 | EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与区块链国际会议&#xff08;ICBDB 2023&#xff09; 会议时间&#xff1a;2023年11月17 -19日 召开地点&#xff1a;中国西安 大会官网&#xff1a;www.icobdb.org 2023年大数据与区块链国际会议&#xff08;ICBDB 2023&#xff09;…