Java入坑之 数据库编程

一、基础概念

1.1JDBC 步骤

导入驱动jar包
注册驱动
获取数据库连接对象 Connection
DataSource dSource;
dSource.getConnection();
定义sql语句
String sql = "update account set balance = 500 where id = 1";
获取执行sql语句的对象 Statement
PreparedStatement stmt = conn. prepareStatement(sql);
执行sql,接受返回结果int count = stmt.executeUpdate(sql);
处理结果 System.out.println(count);
释放资源  stmt.close(); conn.close();

 1.2相关类介绍

1.3相关代码

在Maven中声明MySQL的JDBC实现依赖

1.3.1查询

package org.example;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SelectTest {public static void main(String[] args) {// 注册 MySQL 驱动try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建 Java 和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");System.out.println("连接数据库成功!");// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建 Statement 成功!");// 执行 SQL 语句并返回结果到 ResultSetResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");// 开始遍历 ResultSet 数据while (rs.next()) {System.out.println(rs.getInt(1) + "," + rs.getString(2) + "," + rs.getInt("price"));}rs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();System.out.println("关闭数据库连接成功!");}} catch (SQLException e) {e.printStackTrace();}}}
}

1.3.2增删改

package org.example;import java.sql.*;public class UpdateTest {public static void main(String[] args) {executeUpdate("update book set price = 300 where bookid = 1");executeUpdate("insert into book(bookid, bookname, price) values(4, '编译原理', 90)");executeUpdate("delete from book where bookid = 4");}/*** 执行数据更新操作* @param sql 要执行的 SQL 语句*/public static void executeUpdate(String sql) {// 注册 MySQL 驱动try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建 Java 和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");System.out.println("连接数据库成功!");// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建 Statement 成功!");int rs = stmt.executeUpdate(sql);stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();System.out.println("关闭数据库连接成功!");}} catch (SQLException e) {e.printStackTrace();}}}
}

1.3.3事务逻辑

package org.example;import java.sql.*;public class TransactionTest {public static void main(String[] args) throws Exception {// 构建Java和数据库之间的桥梁介质try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");conn.setAutoCommit(false);insertBook(conn, "insert into book values(101, 'aaaa', 10)");insertBook(conn, "insert into book values(102, 'bbbb', 10)");insertBook(conn, "insert into book values(103, 'cccc', 10)");Savepoint phase1 = conn.setSavepoint(); // 设置一个保存点insertBook(conn, "insert into book values(104, 'cccc', 10)");insertBook(conn, "insert into book values(105, 'cccc', 10)");conn.rollback(phase1); // 回滚到phase1保存点,即上面2行无效conn.commit();System.out.println("操作成功");} catch (SQLException e) {e.printStackTrace();conn.rollback();} finally {if (null != conn) {conn.close();}}}public static void insertBook(Connection conn, String sql) {try {// 构建数据库执行者Statement stmt = conn.createStatement();// 执行SQL语句int result = stmt.executeUpdate(sql);stmt.close();} catch (SQLException e) {e.printStackTrace();}}
}

1.3.4拼接字符串 

package org.example;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class InsertTest {public static void main(String[] a) {//concatInsertBook();unsafeConcatInsertBook();}public static void concatInsertBook() {// 构建Java和数据库之间的桥梁介质try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");// 执行SQL语句int bookid = 11;String bookName = "Effective Java";int price = 50;String sql = "insert into book(bookid,bookname,price) values("+ bookid + ", '" + bookName + "', " + price + ")";int result = stmt.executeUpdate(sql);stmt.close();System.out.println("操作成功");} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}public static void unsafeConcatInsertBook() {// 构建Java和数据库之间的桥梁介质try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");// 执行SQL语句int bookid = 13;String bookName = "Effective Java',50);delete from t_book;insert into t_book values(101, 'faked book";int price = 50;String sql = "insert into book(bookid,bookname,price) values("+ bookid + ", '" + bookName + "', " + price + ");";System.out.println(sql);int result = stmt.executeUpdate(sql);stmt.close();System.out.println("操作成功");} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

1.3.5batch函数

package org.example;import java.sql.*;public class InsertTest1 {public static void main(String[] a) {safeInsertBook();batchInsertBook();}public static void safeInsertBook() {Connection conn = null;try {// 注册 MySQL 驱动Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");String sql = "insert into book(bookid,bookname,price) values (?, ?, ?)";// 构建数据库执行者PreparedStatement pstmt = conn.prepareStatement(sql);// 设置参数int bookid = 15;String bookName = "Effective Java',50);delete from t_book;insert into t_book values(101, 'faked book";int price = 50;pstmt.setInt(1, bookid);pstmt.setString(2, bookName);pstmt.setInt(3, price);// 执行SQL语句int result = pstmt.executeUpdate();pstmt.close();System.out.println("操作成功");} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();System.out.println("关闭数据库连接成功!");}} catch (SQLException e) {e.printStackTrace();}}}public static void batchInsertBook() {Connection conn = null;try {// 注册 MySQL 驱动Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");String sql = "insert into book(bookid,bookname,price) values (?,?,?)";// 构建数据库执行者PreparedStatement pstmt = conn.prepareStatement(sql);// 设置参数String bookName = "aaaaaaaaaaaaaaaa";int price;// 执行批量插入操作for (int i = 210; i < 202; i++) {price = 50;pstmt.setInt(1, i);pstmt.setString(2, bookName);pstmt.setInt(3, price);pstmt.addBatch();}pstmt.executeBatch();pstmt.close();System.out.println("操作成功");} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();System.out.println("关闭数据库连接成功!");}} catch (SQLException e) {e.printStackTrace();}}}
}

如果有大量的sq语句,它们结构相同,仅仅差别在具体数值上,那么可以通过addBatch
方法进行批量操作。这样会提高性能,减少数据库负担。 

1.3.6ResultSetMetaData类

package org.example;import java.sql.*;public class ResultSetMetaDataTest {public static void main(String[] args) {// 构建Java和数据库之间的桥梁介质try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("注册驱动成功!");} catch (ClassNotFoundException e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";Connection conn = null;try {// 构建Java和数据库之间的桥梁:URL,用户名,密码conn = DriverManager.getConnection(url, "root", "b123456");// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");// 执行SQL语句并返回结果到ResultSetResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");// 获取结果集的元数据ResultSetMetaData meta = rs.getMetaData();int cols = meta.getColumnCount();for (int i = 1; i <= cols; i++) {System.out.println(meta.getColumnName(i) + "," + meta.getColumnTypeName(i));}rs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

 二、数据库连接池

2.1流程重述

2.2亨元模式 

享元模式, Flyweight Pattern
-  经典23个设计模式的一种,属于结构型模式。
- 一个系统中存在大量的相同的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。

 2.3 数据库连接池概念

2.4C3P0连接池

2.4.1配置文件

   <!-- https://mvnrepository.com/artifact/com.mchange/c3pθ --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

2.4.2相关代码

package org.example;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SelectTest1 {public static void main(String[] args) {Connection conn = null;try {// 从c3p0获取数据库连接conn = C3p0Factory1.getConnection();//conn = C3p0Factory2.getConnection();从Druid获取conn = DruidFactory1.getConnection();//conn = DruidFactory2.getConnection();// 构建数据库执行者Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");// 执行SQL语句并返回结果到ResultSetResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");// 开始遍历ResultSet数据while (rs.next()) {System.out.println(rs.getInt(1) + "," + rs.getString(2) + "," + rs.getInt("price"));}rs.close();stmt.close();} catch (Exception e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

2.4.3相关配置

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config>    <!--  默认配答 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property><property name="user">root</property><property name="password">123456</property><property name="initialPoolSize">5</property><property name="maxPoolSize">20</property></default-config>
</c3p0-config>

package org.example;import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;public class C3p0Factory2 {private static ComboPooledDataSource dataSource = null;public static void init() throws Exception {// 创建 ComboPooledDataSource 实例,会自动加载 c3p0-config.xml 文件的配置dataSource = new ComboPooledDataSource();// 此时 dataSource 是一个完全配置好的可用连接池 DataSource}public static Connection getConnection() throws Exception {if (null == dataSource) {init();}// 返回从连接池获取的数据库连接return dataSource.getConnection();}
}

2.4.4 DruidData类

package org.example;import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;public class DruidFactory1 {private static DruidDataSource dataSource = null;public static void init() throws Exception {dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("b123456");dataSource.setUrl("jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC");dataSource.setInitialSize(5);dataSource.setMinIdle(1);dataSource.setMaxActive(10);// 启用监控统计功能dataSource.setFilters("stat");}public static Connection getConnection() throws Exception {if (null == dataSource) {init();}return dataSource.getConnection();}
}

 2.4.6配置

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC
username=root
password=b123456
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
package org.example;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;public class DruidFactory2 {private static DruidDataSource dataSource = null;public static void init() throws Exception {Properties properties = new Properties();// 加载属性文件 druid.propertiesInputStream in = DruidFactory2.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(in);// 通过属性创建 Druid 数据源dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);in.close();}public static Connection getConnection() throws Exception {if (null == dataSource) {init();}return dataSource.getConnection();}
}

三、基于web的数据库开发

3.1配置DataSource

3.2相关类(driverClassName,驱动类)

3.3Connection接口

java.sql.Connection接口表示与特定数据库的会话。在Connection的上下文中,执行SQL语句并返回结果。Connection接口对于连接到数据库和执行SQL语句至关重要。

3.4Statement接口 

Statement接口是Java执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement接口提供了执行语句和获取结果的基本方法。PreparedStatement接口添加了处理IN参数的方法;而CallableStatement添加了处理OUT参数的方法。

​​​​​​​

3.5PreparedStatement接口

PreparedStatement接口是Java中的一个接口,它是用来执行预编译的SQL语句的。PreparedStatement是Statement的子接口,继承了Statement的所有功能。PreparedStatement接口提供了补充占位符变量的方法 

​​​​​​​ 

 

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

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

相关文章

在mac下,使用Docker安装达梦数据库

前言&#xff1a;因为业务需要安装达梦数据库 获取官网下载tar包&#xff08;达梦官网的下载页面https://www.dameng.com/list_103.html&#xff09;&#xff0c;或者通过命令 一、下载tar包 命令下载&#xff1a;wget -O dm8_docker.tar -c https://download.dameng.com/eco/…

实战:大数据Spark简介与docker-compose搭建独立集群

文章目录 前言技术积累Spark简介Spark核心功能及优势Spark运行架构 Spark独立集群搭建安装docker和docker-composedocker-compose编排docker-compose编排并运行容器 Spark集群官方案例测试写在最后 前言 很多同学都使用过经典的大数据分布式计算框架hadoop&#xff0c;其分布式…

学Python静不下来,看了一堆资料还是很迷茫是为什么

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 让我们看看蚂蚁金服的大…

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想使…

什么是卷积神经网络

目录 什么是卷积神经网络 全链接相对笨重&#xff1a;大胖子​编辑 ​编辑 参数众多&#xff1a;容易造成过拟合 ​编辑 卷积核&#xff1a;进行图像特征提取&#xff0c;源于卷积原理&#xff1a;求相交面积 卷积的作用 卷积的意义 ​编辑 通过卷积核减少参数 深度卷积…

〔016〕Stable Diffusion 之 模型工具箱和图片背景移除 篇

✨ 目录 &#x1f388; 下载插件&#x1f388; 基础使用界面&#x1f388; 高级使用界面&#x1f388; 下载背景移除插件&#x1f388; 移除插件使用 &#x1f388; 下载插件 由于模型很多&#xff0c;而且底模也非常大&#xff0c;对于空间占用比较大&#xff0c;如果想缩小模…

07-Vue基础之综合案例——小黑记事本

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

IGBT基本工作原理及IGBT的作用是什么?

IGBT 今天我们一起来了解关于IGBT&#xff08;绝缘栅双极性晶体管&#xff09;芯片。在过去的几十年中&#xff0c;我们生活的每个角落都离不开能源的驱动。然而&#xff0c;传统的功率晶体管却受限于一些方面不足。幸运的是&#xff0c;IGBT芯片的出现彻底改变了这一局面。 …

游戏出海工具都有哪些?

游戏出海是一个复杂的过程&#xff0c;需要运用多种工具来进行市场分析、推广、本地化等工作。以下是一些常用的游戏出海工具&#xff1a; 一、必备工具&#xff1a; 1、游戏平台&#xff1a;要想进行游戏出海运营&#xff0c;游戏平台时必不可少的&#xff0c;选择游戏平台时…

psycopg2 使用dbutils 工具封装

1.什么是dbutils Dbutils是一套工具&#xff0c;可为数据库提供可靠&#xff0c;持久和汇总的连接&#xff0c;该连接可在各种多线程环境中使用。 2.使用代码记录 db_config.py 数据库配置类&#xff1a; # -*- coding: UTF-8 -*- import psycopg2# 数据库信息 DB_TEST_HO…

docker 安装 redis

目录 1、下载镜像文件 2、创建实例并启动 3、使用 redis 镜像执行 redis-cli 命令连接 4、redis持久化操作 5、然后按照第3点&#xff0c;再试一试&#xff0c;看看redis持久化是否配置成功。 6、最后与redis可视化工具测试连接 大家先 su root&#xff0c;这让输入命令就…

GEE/PIE遥感大数据处理与典型案例

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

23种设计模式攻关

&#x1f44d;一、创建者模式 &#x1f516;1.1、单例模式 单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。 在某些情况下&#xff0c;我们需要确保一个类只能有一个实例&#xff0c;比如数据库连接…

LSTM模型

目录 LSTM模型 LSTM结构图 LSTM的核心思想 细胞状态 遗忘门 输入门 输出门 RNN模型 LRNN LSTM模型 什么是LSTM模型 LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LS…

SpringCloud学习笔记(四)_ZooKeeper注册中心

基于Spring Cloud实现服务的发布与调用。而在18年7月份&#xff0c;Eureka2.0宣布停更了&#xff0c;将不再进行开发&#xff0c;所以对于公司技术选型来说&#xff0c;可能会换用其他方案做注册中心。本章学习便是使用ZooKeeper作为注册中心。 本章使用的zookeeper版本是 3.6…

SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基…

国产精品:讯飞星火最新大模型V2.0

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

评测凯迪仕K70「千里眼」智能锁:不忘安全初心,便捷体验更上一层

能打败凯迪仕的&#xff0c;只有它自己。这是我们在体验过凯迪仕最新旗舰产品K70「千里眼」智能锁之后的感受。作为凯迪仕2023年最新旗舰机型&#xff0c;K70「千里眼」智能锁在配置上可以说是「机皇」般的存在。3K超高清智能锁猫眼、车规级24GHz雷达、大小双屏设计、三方可视对…

百度云BOS云存储的图片如何在访问时,同时进行格式转换、缩放等处理

前言 之前做了一个图片格式转换和压缩的服务&#xff0c;结果太占内存。后来查到在访问图片链接时&#xff0c;支持进行图片压缩和格式转换&#xff0c;本来想着先格式转换、压缩图片再上传到BOS&#xff0c;现在变成了上传后&#xff0c;访问时进行压缩和格式转换。想了想&am…

Jobs Portal求职招聘系统源码v3.5版本

Jobs Portal求职招聘系统 是为求职者和公司发布职位而开发的交互式求职招聘源码。它使求职者能够发布简历、搜索工作、查看个人工作列表。 它将提供各种公司在网站上放置他们的职位空缺资料&#xff0c;并且还可以选择搜索候选人简历。 除此之外&#xff0c;还有一个管理模块供…