Springboot项目搭建(3)-更改用户信息与文件上传
1.概要
前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。
这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等...
而后接触到了本地上传和云上传,其二者区别:
选择本地上传还是云上传取决于具体的业务需求、预算、数据量、以及对速度和可靠性的要求。对于需要高可靠性和可扩展性的大规模数据存储,云上传通常是更好的选择。而对于小型项目或对成本敏感的场景,本地上传可能更加合适。
借助阿里云的OSS对象存储服务,更方便的使网站,去进行静态内容托管、备份和归档。
2.更新用户信息
2.1 映射类UserMapper
文件地址:org/example/mapper/UserMapper.java
now():获得数据库的系统时间
package org.example.mapper;
import ...
@Mapper
public interface UserMapper {......//更新用户表,设计昵称邮箱等数值@Update("update user set nickname=#{nickname},email=#{email},update_time=#{updateTime} where id=#{id}")void update(User user);//更新用户头像@Update("update user set user_pic=#{avatarUrl},update_time=now() where id=#{id}")//创建updateAvatar接口,Integer规范数据为整型void updateAvatar(String avatarUrl,Integer id);//更新用户密码@Update("update user set password=#{rePassword},update_time=now() where id=#{id}")void updatePassword(String rePassword,Integer id);
}
2.2 业务层UserService
2.2.1 创建接口
文件地址:org/example/service/UserService.java
//更新用户信息
void update(User user);
//更新用户头像
void updateAvatar(String avatarUrl);
//更新用户密码
void updatePassword(String rePassword);
2.2.2 实现接口
文件地址:org/example/service/impl/UserServiceImpl.java
package org.example.service.impl;
import ...
@Service
public class UserServiceImpl implements UserService {............//实现用户信息更新@Overridepublic void update(User user) {//设置用户更新时间为当前系统时间//LocalDateTime.now()获得系统时间user.setUpdateTime(LocalDateTime.now());userMapper.update(user);}//实现用户头像更新@Overridepublic void updateAvatar(String avatarUrl) {//由于请求后,线程池中将会存放该用户的信息,包含ID值Map<String,Object> map = ThreadLocalUtil.get();Integer id = (Integer) map.get("id");userMapper.updateAvatar(avatarUrl, id);}//实现用户密码更新@Overridepublic void updatePassword(String rePassword) {Map<String,Object> map = ThreadLocalUtil.get();Integer id = (Integer) map.get("id");String md5String = Md5Util.getMD5String(rePassword);userMapper.updatePassword(md5String, id);}
}
2.3 控制层UserController
文件地址:org/example/controller/UserController.java
@RequestBody:将前端传来的数据自动转换成JSON格式的字符串,并且为对象User赋值
@Validate:开启参数校验
//更新用户信息@PutMapping("/update")public Result update(@RequestBody @Validated User user){//调用业务层的更新用户方法userService.update(user);return Result.success();}@PutMapping("/updateavatar")//更新用户头像信息public Result updateAvatar(@RequestParam String avatarUrl){userService.updateAvatar(avatarUrl);return Result.success();}//更新用户密码信息@PostMapping("/updatePwd")public Result updatePwd(@RequestBody Map<String,String> params){// 获得前端传来的旧密码,新密码,确认密码// 校验数据String oldPwd = params.get("old_Pwd");String newPwd = params.get("new_Pwd");String rePwd = params.get("re_Pwd");// 各密码不能为null// StringUtils.hasLength(oldPwd)判断字符中的个数,返回Boolean,// 如果变量中没有值则返回falseif (!StringUtils.hasLength(oldPwd)||!StringUtils.hasLength(newPwd)||!StringUtils.hasLength(rePwd)){return Result.error("缺少必要の参数");}//验证原密码是否正确Map<String,Object> map = ThreadLocalUtil.get();String username = (String)map.get("username");User user = userService.findUserByUsername(username);//判断输入的旧密码,与数据库的密码是否一致if (!user.getPassword().equals(Md5Util.getMD5String(oldPwd))){return Result.error("旧密码输入错误");}//判断新密码和确认密码是否一致if (!rePwd.equals(newPwd)){return Result.error("新密码和确认密码不一致");}//更新数据中的密码userService.updatePassword(newPwd);return Result.success();}
2.4 校检数据格式
@JsonIgnore:配置springmvc把当前对象转换成json字符串的时候忽略password
@Email:校验数据为邮箱格式
@NotEmpty:校验不能为空
@Pattern(regexp = "^\\S{1,10}$"):校验内容为字符型,且在1-10位之间
package org.example.entity;
import ...
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer id;private String username;@JsonIgnoreprivate String password;@NotEmpty@Emailprivate String email;@NotEmpty@Pattern(regexp = "^\\S{1,10}$")private String nickname;private String userPic;private LocalDateTime createTime;private LocalDateTime updateTime;
}
2.5 实验效果
2.5.1 更新用户信息
2.5.2 更新用户头像
2.5.3 更改用户密码
3.文件上传&本地储存FileUploadController
文件地址:org/example/controller/FileUploadController.java
使用 @PostMapping
注解来映射 POST 请求到 /upload
路径。
这个方法接收一个 MultipartFile
类型的参数 file
,用于处理上传的文件。
MultipartFile:用于传输二进制文件,如图片、视频等
originalFilename.lastIndexOf("."):获取上传文件的扩展名,如jpg、png
UUID.randomUUID().toString():随机获得一个唯一id值作为名字
package org.example.controller;
import org.example.entity.Result;
import org.example.utils.AliOssUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件内容存储到本地磁盘上String originalFilename = file.getOriginalFilename();System.out.println(originalFilename);//保证文件名唯一性String filename = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));//向目标传递图片的二进制值file.transferTo(new File("D:\\workspace\\images\\"+filename));return Result.success("url访问地址");}
}
4.文件上传&阿里云OSS
步骤:
注册登录-开通对象储存服务-创建bucket-获取AccessKey-参照SDK编写程序-集成OSS
Bucket:是一种用于存储数据的基本容器
AccessKey:用于身份验证和访问控制的一种机制
SDK(Software Development Kit,软件开发工具包):是一套工具、库、文档和代码样本的集合,用于帮助开发者为特定的软件包、软件框架、硬件平台、操作系统等创建应用程序或库。
4.1 注册登录
略
4.2 开通对象储存服务
释放数据激情,云存储新纪元!极速、安全、经济,一切尽在掌控!
立即加入,快来领取吧!让数据飞起来!
4.3 创建bucket
开通过后,回到主页,拉至最下方。有权益中心-免费试用按键。
进入免费试用后,可查看我的试用。
在费用与成本中进入管理关联实例,抵达OSS管理控制台。
其中可查看与创建自己的"bucket"
自定义创建-填写bucket名称-其余默认(所属资源组:空)-完成创建
设置bucket使用权限:
1.进入bucket 2.权限控制-阻止公共访问:关闭 3.权限控制-读写权限:公共读写
4.4 获取AccessKey
在此地可创建属于自己的密钥
4.5 参照SDK编写程序pom.xml
安装SDK:在MAVEN项目pom.xml中加入SDK依赖
<!--阿里云OSS服务-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
4.6 测试OSS-uploadTest
文件地址:src/test/java/uploadTest.java
执行文件测试文件后,可在阿里云bucket列表中,
访问到个人电脑中D:\\workspace\\images\\1.jpg(为例)地址上的图片。
云上的图片名为:"wagaga.jpg"(String objectName的值)。
点击wagaga.jpg处可复制到图片的下载地址,在浏览器中打开可直接下载到本地。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
public class uploadTest {//测试上传文件至阿里云的OSSpublic static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-beijing.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。// EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "new-system-622";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "wagaga.jpg";// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。String region = "cn-beijing";//填写AccesskeyString ACCESS_KEY_ID="LTAI5t798Q7kyDGjn3emtKUy";String ACCESS_KEY_SECRET="Pn4LIt2AQw04jIvorcdF62dJSVqO67";// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = new OSSClientBuilder().build(endpoint,ACCESS_KEY_ID,ACCESS_KEY_SECRET);try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new FileInputStream("D:\\workspace\\images\\1.jpg"));// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}
4.7 联系自身代码集成OSS-AliOssUtils
新建文件:org/example/utils/AliOssUtils.java
private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com":
- private 私有的
- static 静态的,只加载一次
- final 不允许被修改
- String 声明数据类型
- ENDPOINT 常量名,通常大写
package org.example.utils;
import com.aliyun.oss.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;
public class AliOssUtils {//常量是在程序中固定不会变的数据private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";private static final String ACCESS_KEY_ID="LTAI5t798Q7kyDGjn3emtKUy";private static final String ACCESS_KEY_SECRET="Pn4LIt2AQw04jIvorcdF62dJSVqO67";private static final String BUCKET_NAME = "new-system-622";private static final String REGION = "cn-beijing";public static String uploadFile(String objectName, InputStream in){// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET);String url = ""; //创建变量作用域在try体外try {// 填写字符串。String content = "Hello OSS,你好世界";// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);// 上传字符串。PutObjectResult result = ossClient.putObject(putObjectRequest);//获得上传文件的地址url = "http://"+BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}return url;}
}
4.8 返回FileUploadController
文件地址:org/example/controller/FileUploadController.java
更改当初自定义的固态图片地址,换成云上的链接:
package org.example.controller;
import org.example.entity.Result;
import org.example.utils.AliOssUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@RestController
public class FileUploadController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {String originalFilename = file.getOriginalFilename();System.out.println(originalFilename);String filename = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));//向目标传递图片的二进制值👇// file.transferTo(new File("D:\\workspace\\images\\"+filename));👆String url = AliOssUtils.uploadFile(filename, file.getInputStream());👇return Result.success(url);👆}
}
相关文章:

Springboot项目搭建(3)-更改用户信息与文件上传
1.概要 前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。 这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等... 而后接触到了本地上传和云上传,其二者区别: 选择本地上传还是云上…...

Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …...
android 如何获取当前 Activity 的类名和包名
其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…...
Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...

uniapp 城市选择插件
uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...

测试工程师如何在面试中脱颖而出
目录 1.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程ÿ…...

Mesh路由组网
Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...
LeetCode131:分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码如下: class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...
详细解析 devmem 命令:在 Linux 系统中直接访问内存的利器
目录 什么是 devmem?为什么需要 devmem?devmem 命令的基本语法devmem 在硬件调试中的应用安全性与风险devmem 的常见应用示例结论 在嵌入式系统开发和硬件调试中,开发者经常需要直接与硬件打交道,访问和修改内存中某些特定区域的内…...

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时,突然发现它的一个接口,被另一个服务ip频繁的请求。 按理说,之前设置的是,每隔1分钟请求一次接口。但从日志来看,则是1秒钟请求一次ÿ…...
【前端知识】nodejs项目配置package.json深入解读
package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件,它位于项目的根目录下,并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...

XGBOOST算法Python实现(保姆级)
摘要 XGBoost算法(eXtreme Gradient Boosting)在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…...

JDK、MAVEN与IDEA的安装与配置
1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境,使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载: MAVEN下载传送…...

输出比较简介
输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…...

什么是反向 DNS 查找以及它的作用是什么?
反向DNS查询(rDNS)是一种技术,用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时,实际上是向域名系统(DNS)的特殊部分请求信息,这部分被称为PTR记录。PTR记录会返回与这个I…...

集群聊天服务器(13)redis环境安装和发布订阅命令
目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…...

[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
问题log /tmp/ccByifPx.o: In function main: read.c:(.text0x1a): undefined reference to shm_open read.c:(.text0xd9): undefined reference to shm_unlink collect2: error: ld returned 1 exit status 程序代码 #include <stdio.h> #include <stdlib.h> #…...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装
Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一,结合Miniconda可以轻松管理安装和依赖项。在这篇文章中,我们将详细介绍如何使用Miniconda在Linux、mac…...

DimensionX 部署笔记
目录 生成视频用CogVideoX-5b-I2V 推理代码: DimensionX 生成视频用CogVideoX-5b-I2V 推理代码: 可以生成,从左向右旋转的,也可以生成从上往下旋转的: import torch from diffusers import CogVideoXImageToVideo…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...