01_JDBC
文章目录
- 一、概述
- 1.1、什么是JDBC
- 1.2、JDBC原理
- 二、JDBC入门
- 2.1、准备工作
- 2.1.1、建库建表
- 2.1.2、新建项目
- 2.2、建立连接
- 2.2.1、准备四大参数
- 2.2.2、加载驱动
- 2.2.3、准备SQL语句
- 2.2.4、建立连接
- 2.2.5、常见问题
- 2.3、获取发送SQL的对象
- 2.4、执行SQL语句
- 2.5、处理结果
- 2.6、释放资源
- 2.7、完整代码
- 2.8、上面的程序改进
- 2.9、改进后的完整代码
- 三、查询操作
- 3.1、获取结果集
- 3.2、处理结果集
- 3.3、查询操作完整代码
- 四、PreparedStatement
- 4.1、SQL注入
- 4.1.1、什么是SQL注入
- 4.1.2、SQL注入案例
- 4.1.2、如何避免SQL注入
- 4.2、PreparedStatement使用
- 4.2.1、预编译SQL语句
- 4.2.2、设置参数
- 4.2.3、完整代码
- 五、使用JDBC进行CRUD操作(掌握)
- 5.1、添加操作
- 5.2、删除操作
- 5.3、修改操作
- 5.4、查询操作
- 六、封装工具类
- 6.1、工具类
- 6.2、工具类使用
一、概述
1.1、什么是JDBC
JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。
简单说就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
1.2、JDBC原理
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API实现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动。
JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
JDBC – Java官方提供 – 一系列接口 – 规范
驱动 – 数据库厂商提供 – JDBC接口的实现类 – 实现
二、JDBC入门
2.1、准备工作
2.1.1、建库建表
DROP DATABASE IF EXISTS mydbjdbc;CREATE DATABASE mydbjdbc;
USE mydbjdbc;CREATE TABLE tb_stu ( sid INT PRIMARY KEY auto_increment, sname VARCHAR (50), sage INT, sgender VARCHAR (10)
);
INSERT INTO tb_stu(sname, sage, sgender) VALUES('John', 20, "male");
INSERT INTO tb_stu(sname, sage, sgender) VALUES('bob', 20, "male");CREATE TABLE USER(username VARCHAR (20), password VARCHAR (20)
);
INSERT INTO USER VALUES('Peter', '123');
INSERT INTO USER VALUES('John', '123');
2.1.2、新建项目
- 新建Java项目;
- 在项目下新建lib目录;
- 将MySQL驱动jar包拷贝到lib目录下;
- 选中lib目录右键Add as Library–单击OK。
2.2、建立连接
2.2.1、准备四大参数
//驱动名
String driverName = "com.mysql.jdbc.Driver";
//连接数据库的url
String url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";
//用户名
String username = "root";
//密码
String password = "root";
2.2.2、加载驱动
//手动加载字节码文件到JVM中
Class.forName(driverName);
2.2.3、准备SQL语句
//SQL语句
String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('Peter', 20, 'male')";
2.2.4、建立连接
//建立连接
Connection connection = DriverManager.getConnection(url, username, password);//验证是否成功建立连接
System.out.println(connection);
如果能够正常输出连接信息,说明连接建立成功,这是后续一切操作的基础。
2.2.5、常见问题
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver原因:项目中没有添加MySQL驱动或驱动的名字写错
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)原因:用户名或密码错误
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'mydbjdbc1'原因:数据库名称不正确
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago原因:MySQL服务没有启动或网络故障
2.3、获取发送SQL的对象
Statement statement = connection.createStatement();
2.4、执行SQL语句
//使用Statement发送SQL语句,返回受影响的行数
int i = statement.executeUpdate(sql);
增、删、改使用
executeUpdate查询使用
executeQuery
2.5、处理结果
if(i == 1) {System.out.println("添加成功");
}
2.6、释放资源
遵循先开后关原则,释放所使用到的资源对象。
//释放资源
statement.close();
connection.close();
资源对于系统来说非常重要,而且是有限的,用完之后一定要释放。
2.7、完整代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class TestJdbc1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//SQL语句String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('Peter', 20, 'male')";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//System.out.println(connection);Statement statement = connection.createStatement();//发送SQL语句int i = statement.executeUpdate(sql);//处理结果if(i == 1) {System.out.println("添加成功");}//释放资源statement.close();connection.close();}
}
举一反三,我们可以按照上面的套路进行删除、修改操作。
2.8、上面的程序改进
我们在进行添加或其他操作时,SQL语句中的内容是不可能在程序中写死的,在数据库中操作的数据一定是能够变化的。我们对程序进行如下修改,其他部分不变。
//假设用户输入的数据
String name = "zs";
int age = 10;
String gender = "male";//SQL语句
//String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('Peter', 20, 'male')";
String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('" + name + "', " + age + ", '" + gender + "')";
通过上面的修改,我们就可以通过Java代码向数据库中添加变化的数据而不是在代码中写死。
同理,删除和修改操作也可以按照这样的套路进行操作。
2.9、改进后的完整代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class TestJdbc2 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//假设用户输入的数据String name = "zs";int age = 10;String gender = "male";//SQL语句//String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('Peter', 20, 'male')";String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES('" + name + "', " + age + ", '" + gender + "')";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//System.out.println(connection);Statement statement = connection.createStatement();//发送SQL语句int i = statement.executeUpdate(sql);//处理结果if(i == 1) {System.out.println("添加成功");}//释放资源statement.close();connection.close();}
}
三、查询操作
查询操作和增删改操作在结果处理上有很大区别,我们有必要深入研究一下。
3.1、获取结果集
//假设用户输入的数据
int stuid = 1;//SQL语句
String sql = "SELECT * FROM tb_stu WHERE sid=" + stuid;
//建立连接
Connection connection = DriverManager.getConnection(url, username, password);//System.out.println(connection);
Statement statement = connection.createStatement();
//发送SQL语句,获取结果集
ResultSet resultSet = statement.executeQuery(sql);
查询使用
executeQuery
3.2、处理结果集
ResultSet 以表(table)结构进行临时结果的存储,需要通过JDBC API将其中数据进行依次获取。
- 数据行指针:初始位置在第一行数据前,每调用一次
boolean next()方法ResultSet的指针向下移动一行,结果为 true,表示当前行有数据;resultSet.getXxx(整数):代表根据列的编号顺序获得,从1开始(一定要注意);resultSet.getXxx("列名"):代表根据列名获得。
int getInt(int columnIndex) throws SQLException //获得当前行第N列的int值
int getInt(String columnLabel) throws SQLException //获得当前行columnLabel列的int值double getDouble(int columnIndex) throws SQLException //获得当前行第N列的double值
double getDouble(String columnLabel) throws SQLException //获得当前行columnLabel列的double值String getString(int columnIndex) throws SQLException //获得当前行第N列的String值
String getString(String columnLabel) throws SQLException //获得当前行columnLabel列的String值//处理结果
while(resultSet.next()) {int id = resultSet.getInt("sid");String sname = resultSet.getString("sname");int sage = resultSet.getInt("sage");String sgender = resultSet.getString("sgender");System.out.println(id);System.out.println(sname);System.out.println(sage);System.out.println(sgender);
}
3.3、查询操作完整代码
import java.sql.*;public class TestJdbc3 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//假设用户输入的数据int stuid = 1;//SQL语句String sql = "SELECT * FROM tb_stu WHERE sid=" + stuid;//建立连接Connection connection = DriverManager.getConnection(url, username, password);//System.out.println(connection);Statement statement = connection.createStatement();//发送SQL语句ResultSet resultSet = statement.executeQuery(sql);//处理结果while(resultSet.next()) {int id = resultSet.getInt("sid");String sname = resultSet.getString("sname");int sage = resultSet.getInt("sage");String sgender = resultSet.getString("sgender");System.out.println(id);System.out.println(sname);System.out.println(sage);System.out.println(sgender);}//释放资源resultSet.close();statement.close();connection.close();}
}
四、PreparedStatement
4.1、SQL注入
4.1.1、什么是SQL注入
用户输入的数据中有SQL关键字或语法并且参与了SQL语句的编译,导致SQL语句编译后的条件含义为true,一直得到正确的结果。这种现象称为SQL注入。
4.1.2、SQL注入案例
import java.sql.*;public class TestJdbc4 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//假设用户输入的数据String n = "abc' OR 1=1 OR '1=1";String p = "123";//SQL语句String sql = "SELECT * FROM user WHERE username='" + n + "' AND password='" + p + "'";System.out.println(sql);//建立连接Connection connection = DriverManager.getConnection(url, username, password);//System.out.println(connection);Statement statement = connection.createStatement();//发送SQL语句ResultSet resultSet = statement.executeQuery(sql);//处理结果while(resultSet.next()) {System.out.println(resultSet.getString("username"));System.out.println(resultSet.getString("password"));}//释放资源resultSet.close();statement.close();connection.close();}
}
4.1.2、如何避免SQL注入
由于编写的SQL语句是在用户输入数据,整合后再进行编译。所以为了避免SQL注入的问题,我们要使SQL语句在用户输入数据前就已进行编译成完整的SQL语句,再进行填充数据。
使用PreparedStatement。
4.2、PreparedStatement使用
PreparedStatement继承了Statement接口,执行SQL语句的方法无异。
作用:
- 预编译SQL 语句,效率高。
- 安全,避免SQL注入 。
- 可以动态的填充数据,执行多个同构的 SQL 语句。
4.2.1、预编译SQL语句
//SQL语句
String sql = "SELECT * FROM user WHERE username=? AND password=?";//预编译SQL语句
PreparedStatement statement = connection.prepareStatement(sql);
4.2.2、设置参数
String n = "abc' OR 1=1 OR '1=1";
String p = "123";//设置参数
statement.setString(1, n);
statement.setString(2, p);
4.2.3、完整代码
import java.sql.*;public class TestJdbc5 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//假设用户输入的数据String n = "abc' OR 1=1 OR '1=1";String p = "123";//SQL语句String sql = "SELECT * FROM user WHERE username=? AND password=?";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//预编译SQL语句PreparedStatement statement = connection.prepareStatement(sql);//设置参数statement.setString(1, n);statement.setString(2, p);//发送SQL语句ResultSet resultSet = statement.executeQuery();//处理结果while(resultSet.next()) {System.out.println(resultSet.getString("username"));System.out.println(resultSet.getString("password"));}//释放资源resultSet.close();statement.close();connection.close();}
}
五、使用JDBC进行CRUD操作(掌握)
在项目实战中,推荐使用PreparedStatement而不是使用Statement。
以下的代码必须熟练掌握,能够举一反三,这是后续学习的基础。
5.1、添加操作
import java.sql.*;public class TestJdbc6 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//SQL语句String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES(?, ?, ?)";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//创建PreparedStatementPreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setString(1, "zhangsan");pstmt.setInt(2, 20);pstmt.setString(3, "male");//发送SQL语句int i = pstmt.executeUpdate();//处理结果if(i == 1) {System.out.println("添加成功");}//释放资源pstmt.close();connection.close();}
}
5.2、删除操作
import java.sql.*;public class TestJdbc7 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//SQL语句String sql = "DELETE FROM tb_stu WHERE sid=?";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//创建PreparedStatementPreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setInt(1, 5);//发送SQL语句int i = pstmt.executeUpdate();//处理结果if(i == 1) {System.out.println("删除成功");}//释放资源pstmt.close();connection.close();}
}
5.3、修改操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestJdbc8 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//SQL语句String sql = "UPDATE tb_stu SET sage=? WHERE sid=?";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//创建PreparedStatementPreparedStatement pstmt = connection.prepareStatement(sql);pstmt.setInt(1, 25);pstmt.setInt(2, 1);//发送SQL语句int i = pstmt.executeUpdate();//处理结果if(i == 1) {System.out.println("修改成功");}//释放资源pstmt.close();connection.close();}
}
5.4、查询操作
import java.sql.*;public class TestJdbc9 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//驱动名String driverName = "com.mysql.jdbc.Driver";//连接数据库的urlString url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";//用户名String username = "root";//密码String password = "root";//加载驱动Class.forName(driverName);//SQL语句String sql = "SELECT * FROM tb_stu WHERE sgender=?";//建立连接Connection connection = DriverManager.getConnection(url, username, password);//预编译SQL语句PreparedStatement statement = connection.prepareStatement(sql);//设置参数statement.setString(1, "male");//发送SQL语句ResultSet resultSet = statement.executeQuery();//处理结果while(resultSet.next()) {int sid = resultSet.getInt("sid");String sname = resultSet.getString("sname");int sage = resultSet.getInt("sage");String sgender = resultSet.getString("sgender");System.out.println(sid + "---" + sname + "---" + sage + "---" + sgender);}//释放资源resultSet.close();statement.close();connection.close();}
}
六、封装工具类
上面的代码大部分是重复的,我们有必要把重复的代码进行提取。
6.1、工具类
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtil {//定义成员变量用来保存四大参数private static String driverName;private static String url;private static String username;private static String password;static {try {//读取配置文件到输入流InputStream in = JdbcUtil.class.getResourceAsStream("/jdbc.properties");Properties properties = new Properties();//加载配置文件中的数据到Properties中properties.load(in);//获取四大参数driverName = properties.getProperty("jdbc.driverName");url = properties.getProperty("jdbc.url");username = properties.getProperty("jdbc.username");password = properties.getProperty("jdbc.password");//加载驱动Class.forName(driverName);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}//获取连接public static Connection getConnection() {Connection connection = null;try {connection = DriverManager.getConnection(url, username, password);} catch (SQLException throwables) {throwables.printStackTrace();}return connection;}//释放资源public static void close(Connection connection, Statement statement, ResultSet rSet) {try {if(rSet != null) {rSet.close();}if(statement != null) {statement.close();}if(connection != null) {connection.close();}} catch (SQLException throwables) {throwables.printStackTrace();}}
}
6.2、工具类使用
在src下创建jdbc.properties文件
jdbc.driverName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false
jdbc.username=root
jdbc.password=root
在Java代码中使用工具类
import tech.code2048.utils.JdbcUtil;import java.sql.*;public class TestJdbc10 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//SQL语句String sql = "SELECT * FROM tb_stu WHERE sgender=?";//建立连接 --- 使用工具类Connection connection = JdbcUtil.getConnection();//预编译SQL语句PreparedStatement statement = connection.prepareStatement(sql);//设置参数statement.setString(1, "male");//发送SQL语句ResultSet resultSet = statement.executeQuery();//处理结果while(resultSet.next()) {int sid = resultSet.getInt("sid");String sname = resultSet.getString("sname");int sage = resultSet.getInt("sage");String sgender = resultSet.getString("sgender");System.out.println(sid + "---" + sname + "---" + sage + "---" + sgender);}//释放资源 --- 使用工具类JdbcUtil.close(connection, statement, resultSet);}
}
通过使用工具类,我们的代码变得简洁更容易维护。
相关文章:
01_JDBC
文章目录 一、概述1.1、什么是JDBC1.2、JDBC原理 二、JDBC入门2.1、准备工作2.1.1、建库建表2.1.2、新建项目 2.2、建立连接2.2.1、准备四大参数2.2.2、加载驱动2.2.3、准备SQL语句2.2.4、建立连接2.2.5、常见问题 2.3、获取发送SQL的对象2.4、执行SQL语句2.5、处理结果2.6、释…...
STM32 HAL库 HC - SR04 超声波测距模块驱动实现
一、引言 在现代嵌入式系统开发中,传感器技术起着至关重要的作用。超声波测距模块作为一种常用的距离测量传感器,因其成本低、精度较高、使用方便等优点,被广泛应用于机器人避障、液位检测、工业自动化等领域。HC - SR04 超声波测距模块是一…...
Spring Boot 热部署详解,包含详细的配置项说明
Spring Boot 热部署详解 1. 热部署简介 热部署(Hot Deployment)允许在应用运行时修改代码或配置文件,无需重启应用即可使更改生效。Spring Boot 通过 spring-boot-devtools 模块实现这一功能,其核心依赖于 LiveReload 技术和自动…...
剑指Offer(数据结构与算法面试题精讲)C++版——day12
剑指Offer(数据结构与算法面试题精讲)C版——day12 题目一:小行星碰撞题目二:每日温度题目三:直方图最大矩形面积附录:源码gitee仓库 题目一:小行星碰撞 题目:输入一个表示小行星的数…...
贪心算法(18)(java)距离相等的条形码
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入:barco…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具
🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的…...
STM32 HAL库 ADC+TIM+DMA 3路 1S采样一次电压
一、引言 在很多嵌入式系统应用中,需要对多路模拟信号进行周期性采样,例如在工业控制、环境监测等领域。STM32F407 是一款高性能的微控制器,其丰富的外设资源可以方便地实现这样的功能。通过结合 ADC(模拟 - 数字转换器ÿ…...
汉诺塔问题——用贪心算法解决
目录 一:起源 二:问题描述 三:规律 三:解决方案 递归算法 四:代码实现 复杂度分析 一:起源 汉诺塔(Tower of Hanoi)问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…...
【Python爬虫】简单介绍
目录 一、基本概念 1.1 什么是爬虫 1.2 Python为什么适合爬虫 1.3 Python爬虫应用领域 (1)数据采集与分析 市场调研 学术研究 (2)内容聚合与推荐 新闻聚合 视频内容聚合 (3)金融领域 股票数据获…...
使用MCP服务通过自然语言操作数据库(vscode+cline版本)
使用MCP服务操纵数据库(vscodecline版本) 本文主要介绍,在vscode中使用cline插件调用deepseek模型,通过MCP服务器 使用自然语言去操作指定数据库。本文使用的是以己经创建号的珠海航展数据库。 理解MCP服务: MCP(Model Context…...
Vue 3 + TypeScript 实现一个多语言国际化组件(支持语言切换与内容加载)
文章目录 一、项目背景与功能概览二、项目技术架构与依赖安装2.1 技术栈2.2 安装依赖 三、国际化组件实现3.1 创建 i18n 实例3.2 配置 i18n 到 Vue 应用3.3 在组件中使用国际化内容3.4 支持语言切换 四、支持类型安全4.1 添加类型支持4.2 自动加载语言文件 一、项目背景与功能概…...
PhalApi 2.x:让PHP接口开发从“简单”到“极简”的开源框架
—— 专为高效开发而生,助你轻松构建高可用API接口 一、为什么选择PhalApi 2.x? 1.轻量高效,性能卓越 PhalApi 2.x 是一款专为接口开发设计的轻量级PHP框架,其核心代码精简但功能强大。根据开发者实测,在2核2G服务器…...
库magnet使用指南
Magnet 多线程控制库使用指南 目录 库功能概述环境配置核心类与接口基础使用示例代码生成工具高级功能与改进建议完整示例代码常见问题解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 库功能概述 Magnet 库提供以下核心功能: 多线程…...
Oracle数据库数据编程SQL<9.3 数据库逻辑备份和迁移Data Pump (EXPDP/IMPDP) 导出、导入补充>
Oracle Data Pump 是 Oracle 10g 引入的高效数据迁移工具,相比传统的 EXP/IMP 工具,它提供了更强大的功能和显著的性能提升。以下是对 EXPDP 和 IMPDP 工具的全面讲解。 目录 一、高级功能扩展 1. 数据过滤与转换 2. 加密与安全 二、性能调优进阶 1. 并行处理优化 2. …...
Java 企业级应用:SOA 与微服务的对比与选择
企业级应用开发中,架构设计是决定系统可扩展性、可维护性和性能的关键因素。SOA(面向服务的架构)和微服务架构是两种主流的架构模式,它们各自有着独特的和设计理念适用场景。本文将深入探讨 SOA 和微服务架构的对比,并…...
Linux LED驱动(设备树)
Linux LED驱动(设备树) 之前的LED驱动直接在驱动文件中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。 但也可以先在设备树文件中创…...
Zookeeper的典型应用场景?
大家好,我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助; Zookeeper的典型应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务,主要用于管理和协调大…...
数据分析不只是跑个SQL!
数据分析不只是跑个SQL! 数据分析五大闭环,你做到哪一步了?闭环一:认识现状闭环二:原因分析闭环三:优化表现闭环四:预测走势闭环五:主动解读数据 数据思维:WHY-WHAT-HOW模…...
面试篇 - GPT-3(Generative Pre-trained Transformer 3)模型
GPT-3(Generative Pre-trained Transformer 3)模型 模型结构 与GPT-2一样,但是应用了Sparse attention: Dense attention:每个token之间两两计算attention,复杂度为O(n2)。 Sparse attention:…...
Dify智能体平台源码二次开发笔记(4) - 多租户的SAAS版实现
前言 Dify 的多租户功能是其商业版的标准功能,我们应当尊重其盈利模式。只有保持良性的商业运作,Dify 才能持续发展,并为用户提供更优质的功能。因此,此功能仅限学习使用。 我们的需求是:实现类似 SaaS 版的账号隔离&a…...
C# 13新特性 - .NET 9
转载: C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能:Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…...
【Code】《代码整洁之道》笔记-Chapter9-单元测试
第9章 单元测试 过去十年以来,编程专业领域进步很大。1997年时,没人听说过测试驱动开发。对于我们之中的大多数人来说,单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法,再弄出一些特殊代码来测…...
java -jar 如何持久化运行
在 Linux 中,直接通过 java -jar 启动服务后关闭 SSH 客户端(如 Xshell)会导致服务终止,因为进程默认与当前终端会话绑定。以下是几种解决方案,确保服务在后台持久运行: (1)使用nohup命令,让进程忽略挂断信号,并在后台运行。 ps -ef | grep xxx.jar 或者 ps -ef …...
layui中transfer两个table展示不同的数据列
在项目的任务开发中需要达到transfer右侧table需要有下拉框可选择状态,左侧table不变 使用的layui版本为2.4.5,该版本没有对transfer可自定义数据列的配置,所以改动transfer.js中的源码 以下为transfer.js部分源码 也是transfer.js去render的…...
如何通过Radius认证服务器实现虚拟云桌面安全登录认证:安当ASP身份认证系统解决方案
引言:虚拟化时代的安全挑战 随着云计算和远程办公的普及,虚拟云桌面(如VMware Horizon、Citrix)已成为企业数字化办公的核心基础设施。然而,传统的用户名密码认证方式暴露了诸多安全隐患:弱密码易被暴力破…...
如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析
如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析 MySQL DBA(数据库管理员)的工作涉及数据库监控、SQL优化、故障排查、备份恢复等复杂任务,传统方式依赖手动操作和经验判断,效率较低。而DeepSeek大模型可以结…...
【机器学习】机器学习笔记
1 机器学习定义 计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。 eg:跳棋程序 E: 程序自身下的上万盘棋局 T: 下跳棋 P: 与新对手下跳棋时赢的概率…...
CFD中的动量方程非守恒形式详解
在计算流体力学(CFD)中,动量方程可以写成守恒形式和非守恒形式,两者在数学上等价,但推导方式和应用场景不同。以下是对非守恒形式的详细解释: 1. 动量方程的守恒形式 首先回顾守恒形式的动量方程ÿ…...
如何在本地修改 Git 项目的远程仓库地址
✅ 场景说明 你当前的 Git 项目地址是: http://192.168.0.16/xxx.git你希望把它改成: http://192.168.0.22:8099/xxx.git🧩 操作步骤 步骤 ①:进入项目所在目录 你已经在正确路径下了: cd C:\Develop\xxx确认这个…...
