01_JDBC

news2025/5/9 15:56:37

文章目录

    • 一、概述
      • 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、新建项目
  1. 新建Java项目;
  2. 在项目下新建lib目录;
  3. 将MySQL驱动jar包拷贝到lib目录下;
  4. 选中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";
        //连接数据库的url
        String 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";
        //连接数据库的url
        String 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";
        //连接数据库的url
        String 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";
        //连接数据库的url
        String 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";
        //连接数据库的url
        String 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";
        //连接数据库的url
        String 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);

        //创建PreparedStatement
        PreparedStatement 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";
        //连接数据库的url
        String 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);

        //创建PreparedStatement
        PreparedStatement 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";
        //连接数据库的url
        String 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);

        //创建PreparedStatement
        PreparedStatement 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";
        //连接数据库的url
        String 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);
    }
}

通过使用工具类,我们的代码变得简洁更容易维护。

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

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

相关文章

Spring Boot 热部署详解,包含详细的配置项说明

Spring Boot 热部署详解 1. 热部署简介 热部署(Hot Deployment)允许在应用运行时修改代码或配置文件,无需重启应用即可使更改生效。Spring Boot 通过 spring-boot-devtools 模块实现这一功能,其核心依赖于 LiveReload 技术和自动…

剑指Offer(数据结构与算法面试题精讲)C++版——day12

剑指Offer(数据结构与算法面试题精讲)C版——day12 题目一:小行星碰撞题目二:每日温度题目三:直方图最大矩形面积附录:源码gitee仓库 题目一:小行星碰撞 题目:输入一个表示小行星的数…

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相关程序案例,秉着开源精神的…

【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服务器…

Java 企业级应用:SOA 与微服务的对比与选择

企业级应用开发中,架构设计是决定系统可扩展性、可维护性和性能的关键因素。SOA(面向服务的架构)和微服务架构是两种主流的架构模式,它们各自有着独特的和设计理念适用场景。本文将深入探讨 SOA 和微服务架构的对比,并…

Zookeeper的典型应用场景?

大家好,我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助; Zookeeper的典型应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务,主要用于管理和协调大…

数据分析不只是跑个SQL!

数据分析不只是跑个SQL! 数据分析五大闭环,你做到哪一步了?闭环一:认识现状闭环二:原因分析闭环三:优化表现闭环四:预测走势闭环五:主动解读数据 数据思维:WHY-WHAT-HOW模…

Dify智能体平台源码二次开发笔记(4) - 多租户的SAAS版实现

前言 Dify 的多租户功能是其商业版的标准功能,我们应当尊重其盈利模式。只有保持良性的商业运作,Dify 才能持续发展,并为用户提供更优质的功能。因此,此功能仅限学习使用。 我们的需求是:实现类似 SaaS 版的账号隔离&a…

layui中transfer两个table展示不同的数据列

在项目的任务开发中需要达到transfer右侧table需要有下拉框可选择状态,左侧table不变 使用的layui版本为2.4.5,该版本没有对transfer可自定义数据列的配置,所以改动transfer.js中的源码 以下为transfer.js部分源码 也是transfer.js去render的…

【机器学习】机器学习笔记

1 机器学习定义 计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。 eg:跳棋程序 E: 程序自身下的上万盘棋局 T: 下跳棋 P: 与新对手下跳棋时赢的概率…

STM32 BOOT设置,bootloader,死锁使用方法

目录 BOOT0 BOOT1的配置含义 bootloader使用方法 芯片死锁解决方法开发调试过程中,由于某种原因导致内部Flash锁死,无法连接SWD以及JTAG调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。修改为BOOT01,BOOT10…

【Redis】string类型

目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作:【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式,…

PostgreSQL全平台安装指南:从入门到生产环境部署

一、PostgreSQL核心特性全景解析 1.1 技术架构深度剖析 graph TDA[客户端] --> B(连接池)B --> C{查询解析器}C --> D[优化器]D --> E[执行引擎]E --> F[存储引擎]F --> G[物理存储]G --> H[WAL日志]H --> I[备份恢复] 1.2 特性优势对比矩阵 特性维度…

UE5 物理模拟 与 触发检测

文章目录 碰撞条件开启模拟关闭模拟 多层级的MeshUE的BUG 触发触发条件 碰撞 条件 1必须有网格体组件 2网格体组件必须有网格,没有网格虽然可以开启物理模拟,但是不会有任何效果 注意开启的模拟的网格体组件会计算自己和所有子网格的mesh范围 3只有网格…

做仪器UI用到的颜色工具网站

https://color.adobe.com/zh/create/color-wheel 1. 图片取颜色工具 2. 对比度工具,煤矿井下设备,光线暗,要求背景与文字有合适的对比度,可以用这个软件 3. 颜色生成ARGB的值工具,这三个工具,都在上面这…

网络安全·第三天·ICMP协议安全分析

一、ICMP功能介绍 ICMP(Internet Control Message Protocal)是一种差错和控制报文协议,不仅用于传输差错报文, 还传输控制报文,但是ICMP只是尽可能交付,提供的服务是无连接、不可靠的,并不能保…