JAVA 之 JDBC

news2024/11/19 2:49:49

JDBC概述

基本介绍

1.JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。

2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。

3.JDBC的基本原理[  重要 ]

4.模拟JDBC com.lmbc.myjdbc

  • JDBC

1.如果Java直接访问数据库(示意图)

2.JDBC带来的好处(示意图)

3.说明:JDBC是Java提供一套用于数据库操作的APIzz,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同的实现。

JDBC快速入门

  • JDBC程序编写步骤

  1. 注册驱动 - 加载Driver类
  2. 获取连接 - 得到Connection
  3. 执行增删改查 - 发送SQL给mysql执行
  4. 释放资源 -关闭相关连接
package com.lmrxx.jdbc;



import com.mysql.cj.jdbc.Driver;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Jdbc01 {
    public static void main(String[] args) throws SQLException {
        //在项目下创建一个文件夹比如libs
        //将mysql.jar 拷贝到该目录下,点击
        //1.注册驱动
        Driver driver=new Driver();
        //2.得到连接
        //jdbc:mysql://规定好表示协议,通过jdbc的连接方式连接mysql
        //localhost  主机,可以是IP地址
        //3306 表示mysql监听的端口
        // customer_manage连接到mysql dbms的哪个数据库
        //mysql 连接本质就是前面学过的socket连接
        String url="jdbc:mysql://localhost:3306/customer_manage?characterEncoding=UTF-8";
        // 将用户名和密码放入Properties对象
        Properties properties=new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","123456");

        //网络连接
        Connection conect =driver.connect(url,properties);


        //3.执行sql
        String sql="delete from actor where id=1";
       //statement 用于执行静态sql语句并返回其生成的结果对象
        Statement statement=conect.createStatement();
        int rows=statement.executeUpdate(sql);//如果是dml语句,返回的就是影响行数

        System.out.println(rows>0? "成功" : "失败");

        //4.关闭连接资源
        statement.close();
        conect.close();

    }
}

获取数据库连接的5种方式

方式一:

    //方式一
    @Test
    public  void connect01() throws SQLException{
        Driver driver=new Driver(); //创建driver对象
        String url="jdbc:mysql://localhost:3306/customer_manage";
        Properties properties=new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","123456");
        Connection connect=driver.connect(url,properties);
        System.out.println(connect);
    }

方式2

  //方式二
    @Test
    public void connect02 () throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver类,动态加载,更加灵活,减少依赖
        Class<?> aClass =Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver) aClass.newInstance();

        String url="jdbc:mysql://localhost:3306/customer_manage";
        //将用户名和密码放入到properties对象
        Properties properties=new Properties();
        //说明user和password是规定好,后面的值根据实际情况写
        properties.setProperty("user","root");
        properties.setProperty("password","123456");

        Connection connect=driver.connect(url,properties);
        System.out.println("方式2="+connect);


    }

方式三

  //方式三 使用DriverManager 替代driver进行统一管理
    @Test
    public  void connect03() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        //使用反射加载Driver类
        Class<?> aClass =Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver=(Driver) aClass.newInstance();
        String url="jdbc:mysql://localhost:3306/customer_manage";
        String user="root";
        String password="123456";

        DriverManager.registerDriver(driver);//注册Driver驱动
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第三种方式:"+connection);

    }

方式四:

1.mysql驱动5.1.6 可以无需Class.forName(" com.mysql.Driver");

2.从jdk1.5 以后使用了jdbc4 ,不需要显式调用class.firName()注册驱动而是自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册

3.建议还是写上Class.forName("com.mysql.cj.jdbc.Driver")

    //方式四:使用class.forName 自动完成注册驱动,简化代码
    @Test
    public void connect04() throws ClassNotFoundException, SQLException {
        //使用反射加载了Driver
        //在加载Driver类时,完成注册
        /*
           源码 1.静态代码块,在类加载时,会执行一次。
           2.DirverManager.registerDriver(new Driver())
           3.因此注册driver工作已经完成的
                        static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
         */
       // Class.forName("com.mysql.cj.jdbc.Driver");

        //创建url和 user 和 password
        String url="jdbc:mysql://localhost:3306/customer_manage";
        String user="root";
        String password="123456";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第四种方式~:"+connection);
    }

方式五:

mysql.properties文件

user=root
password=123456
url=jdbc:mysql://localhost:3306/customer_manage
driver=com.mysql.cj.jdbc.Driver
//方式5,在方式四的基础上改进,增加配置文件,让连接mysql更加灵活
    @Test
    public void connect05() throws IOException, ClassNotFoundException, SQLException {
        //通过Properties对象获取配置文件信息
        Properties properties=new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        //获取值
        String user=properties.getProperty("user");
        String password=properties.getProperty("password");
        String url=properties.getProperty("url");
        String driver=properties.getProperty("driver");

        Class.forName(driver);

        Connection connection=DriverManager.getConnection(url,user,password);

        System.out.println("方式五:"+connection);


    }

ResultSet 结果集

  • 基本介绍

1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成

2.ResultSet对象保持一个光标指向当前的数据行。最初,光标位于第一行之前

3.next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集。


Interface Statement

用于执行静态SQL语句并返回生成的结果的对象

PreparedStatement(预处理)

  • 预处理好处

1.不再使用+拼接sql语句,减少语法错误

2.有效的解决了sql注入问题

3.大大减少了编译次数,效率较高

不能有未知符

jdbc API 

JDBCUtils类

package com.lmrxx.jdbc.utils;

import jdk.internal.dynalink.beans.StaticClass;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * 这是一个工具类,完成mysql连接和关闭资源
 */
public class JDBCUtils {
    //定义相关的属性,因为只需要一 份,我们做出static
    private static String user;
    private static String password;
    private static String url;
    private static String driver;

    //在static模块去初始化
    static {
        Properties properties=new Properties();
        try {
            properties.load(new FileInputStream("src\\mysql.properties"));
            //读取相关的数据值
            user= properties.getProperty("user");
            password= properties.getProperty("password");
            url= properties.getProperty("url");
            driver= properties.getProperty("driver");
        } catch (IOException e) {
            //在实际开发中,我们可以这样处理
            //1.将编译异常转成运行异常
            //2.调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便。
            throw new RuntimeException(e);
        }
    }

    //连接数据库,返回Connection
    public  static Connection getConnection(){


        try {
            return DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            //1.将编译异常转成运行异常
            //2.调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便。
            throw new RuntimeException(e);
        }
    }

    //关闭相关资源
    /*
    1.ResultSet 结果集
    2.Statement 或者 PreparedStatement
    3.Connection
     */

    public static void close(ResultSet set,Statement statement,Connection connection){

        //判断是否为null
        try {
            if (set != null) {
                set.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e){
            throw new RuntimeException(e);
        }
    }




}

使用该类

package com.lmrxx.jdbc.utils;

import com.lmrxx.jdbc.PreparedStatement_.PreparedStatement_;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *该类演示如何使用JDBCUtils工具类,完成dml和selec
 */
public class JDBCUtils_Use {
    public static void main(String[] args) {

    }

    @Test
    public void tesSelect(){
        //1.得到连接
        Connection connection=null;

        //2.组织一个sql
        String sql="select * from actor where id=?";
        ResultSet set=null;
        PreparedStatement preparedStatement=null;

        //3.创建PreparedStatement对象
        try {
            connection=JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,2);

            //执行,得到结果集
           set= preparedStatement.executeQuery();
           //遍历该结果集
            while (set.next()){
                int id=set.getInt("id");
                String name=set.getString("name");
                String  sex=set.getString("sex");
                String phone=set.getString("phone");
                System.out.println(id+"\t"+name+"\t"+sex+"\t"+phone);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }


    @Test
    public void tesDML(){
        //1.得到连接
        Connection connection=null;

        //2.组织一个sql
       // String sql="update actor set name =? where id= ?";
        //测试delete语句和insert语句
        String sql1="delete from actor where id=?";


        PreparedStatement preparedStatement=null;

        //3.创建PreparedStatement对象
        try {
            connection=JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql1);
            //给占位符赋值
          //  preparedStatement.setString(1,"周星驰");
            preparedStatement.setInt(1,2);
            //执行
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }

}

事务

  • 基本介绍
  1. JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务,每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
  2. JDBC程序中为了让多个SQL语句作为一个整体执行,需要使用事务
  3. 调用Connection的setAutoCommit(false)可以取消自动提交事务
  4. 在所有的SQL语句都 成功执行后,调用Connection的commit();方法提交事务
  5. 在其中某个操作失败或出现异常时,调用Connection的rollback();方法回滚事务

应用实例(有事务与没有事务的对比)

package com.lmrxx.jdbc.transaction_;

import com.lmrxx.jdbc.utils.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Transaction_ {

    @Test
    public void noTransaction(){

        //操作转账的业务
        //1.得到连接
        Connection connection=null;
        //2.组织一个sql
        String sql="update account set balance=balance-100 where id=1";
        String sql2="update account set balance=balance+100 where id=2";

        //3.创建PreparedStatement对象
        PreparedStatement preparedStatement=null;
        try {
            connection= JDBCUtils.getConnection();//在默认情况下,connection是自动提交的
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.executeUpdate();//执行第一条sql

   //         int i=1/0;//抛出异常
            preparedStatement= connection.prepareStatement(sql2);
            preparedStatement.executeUpdate();
            //给占位符赋值
            //  preparedStatement.setString(1,"周星驰");
            //preparedStatement.setInt(1,2);
            //执行
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null,preparedStatement,connection);
        }




    }


    //事务来解决
    @Test
    public void noTransaction2(){

        //操作转账的业务
        //1.得到连接
        Connection connection=null;
        //2.组织一个sql
        String sql="update account set balance=balance-100 where id=1";
        String sql2="update account set balance=balance+100 where id=2";

        //3.创建PreparedStatement对象
        PreparedStatement preparedStatement=null;
        try {
            connection= JDBCUtils.getConnection();//在默认情况下,connection是自动提交的
            //将connection设置为不自动提交
            connection.setAutoCommit(false);
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.executeUpdate();//执行第一条sql

            //int i=1/0;//抛出异常
            preparedStatement= connection.prepareStatement(sql2);
            preparedStatement.executeUpdate();

            //这里提交事务
            connection.commit();

        } catch (SQLException e) {
            //这里我们可以进行回滚即撤销执行的sql,默认回滚到事务开始的状态
            System.out.println("执行发生了异常,撤销执行的sql");
            try {
                connection.rollback();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
            e.printStackTrace();
        } finally {
            JDBCUtils.close(null,preparedStatement,connection);
        }




    }
}

批处理

基本介绍:

1. 当需要成批插入或更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。

2. JDBC的批处理语句包括下面方法:

  addBatch():添加需要批量处理的SQL语句或参数

  executeBatch():执行批量处理语句;

  clearBatch():清空批处理包的语句

3. JDBC连接MySQL时,如果要使用批处理功能,请在url中加参数?rewruteBatchedStatements=true

4. 批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高。

package com.lmrxx.jdbc.batch;

import com.lmrxx.jdbc.utils.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 演示java的批处理
 */

public class Batch_ {

    @Test
    public void noBatch() throws SQLException {
        Connection connection= JDBCUtils.getConnection();
        String sql="insert into admin values (null,?,?)";
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        System.out.println("开始执行");
        long start=System.currentTimeMillis();//开始时间
        for (int i=0;i<5000;i++){
            preparedStatement.setString(1,"jack"+i);
            preparedStatement.setString(2,"666");
            preparedStatement.executeUpdate();
        }
        long end=System.currentTimeMillis();//结束时间
        System.out.println("传统的方式 耗时="+(end-start));//耗时=11741
        JDBCUtils.close(null,preparedStatement,connection);
    }

    @Test
    public void batch() throws SQLException {
        Connection connection= JDBCUtils.getConnection();
        String sql="insert into admin2 values (null,?,?)";
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        System.out.println("开始执行");
        long start=System.currentTimeMillis();//开始时间
        for (int i=0;i<5000;i++){
            preparedStatement.setString(1,"jack"+i);
            preparedStatement.setString(2,"666");
            //将sql语句加入到批处理包中 -> 看源码
            preparedStatement.addBatch();
            //当有1000条记录时,在批量执行
            if((i+1) % 1000==0){//满1000条sql
                preparedStatement.executeBatch();
                //清空一把
                preparedStatement.clearBatch();
            }
        }
        long end=System.currentTimeMillis();//结束时间
        System.out.println("传统的方式 耗时="+(end-start));//耗时=145
        JDBCUtils.close(null,preparedStatement,connection);
    }
}

数据库连接池

  • 传统获取Connection问题分析

  1. 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址、用户名和密码(0.05s~1s时间)  需要数据库连接的时候,就向数据库要求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易造成服务器崩溃。
  2. 每一次数据库连接,使用后都要断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终将导致重启数据库。
  3. 传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃。
  4. 解决传统开发中的数据库连接问题,可以采用数据库连接池技术。(connection pool)
  • 数据连接池基本介绍

  1. 预先在缓冲池中放入一定数量的连接,当需要建立数据库时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
  2. 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
  3. 当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
  • 数据库连接池种类

  1. JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现
  2. C3P0 数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)
  3. DBCP数据库连接池,速度相对c3p0较快,但不稳定
  4. Proxool数据库连接池,有监控连接池状态的功能,稳定性c3p0差一点
  5. BoneCP数据库连接池,速度快
  6. DRuid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3P0、Proxool优点集一身的数据库连接池
  • 将JDBCUtils工具类改成Druid(德鲁伊)实现

        通过德鲁伊数据库连接池获取对象。

  • apache-DBUtils

数据库在返回resultSet时

问题:1.结果集和connection是关联的,即如果关闭连接,就不能使用结果集

2.结果集不利于数据管理(只能用一次)。

3.使用返回信息也不方便。

将结果集记录,封装到ArrayList<Actor>中

Java类Actor ==> JavaBean,PoJO,Domain

class Actor{

属性,id,name,sex,borndate,phone

},一个Actor对象对应actor记录。

一个Actor对象,对应一条actor表记录,actor对象放入到ArrayList集合

  • 基本介绍
  1. common-dbutils是Apache组织提供给的一个开源JDBC工具类库,它是对JDBC的封装,使用dbutils能极大简化jdbc编码的工作量。
  • DbUtils类
  1. QueryRunner类:该类封装了SQL的执行,是线程安全的。可以实现增、删、查、改、批处理
  2. 使用QueryRunner类实现查询。
  3. ResultSetHandler接口,该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式 。

DAO和增删改查通用方法-BasicDao

apache-dbutils +Druid 简化了JDBC开发,但还有不足:

  1. SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行 增删改查
  2. 对于select操作,如果有返回值,返回类型不能固定,需要使用泛型
  3. 将来的表很多,业务需求复杂,不可能只靠一个java类完成
  4. 引出=》 BasicDAO画出示意图

  • 基本说明
  1. DAO:data access object 数据访问对象
  2. 这样的通用类,称为BasicDao,是专门和数据库交互的,即完成对数据库(表)的crud操作。
  3. 在BasicDao基础上,实现一张表 对应一个Dao,更好的完成功能,比如Customer表-Customer.java 类(javabean)-CustomerDao.java

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

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

相关文章

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

Redis做分布式锁

&#xff08;一&#xff09;为什么要有分布式锁以及本质 在一个分布式的系统中&#xff0c;会涉及到多个客户端访问同一个公共资源的问题&#xff0c;这时候我们就需要通过锁来做互斥控制&#xff0c;来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…

阿里云引领智算集群网络架构的新一轮变革

阿里云引领智算集群网络架构的新一轮变革 云布道师 11 月 8 日~ 10 日在江苏张家港召开的 CCF ChinaNet&#xff08;即中国网络大会&#xff09;上&#xff0c;众多院士、教授和业界技术领袖齐聚一堂&#xff0c;畅谈网络未来的发展方向&#xff0c;聚焦智算集群网络的创新变…

预处理(1)(手绘)

大家好&#xff0c;今天给大家分享一下编译器预处理阶段&#xff0c;那么我们来看看。 上面是一些预处理阶段的知识&#xff0c;那么明天给大家讲讲宏吧。 今天分享就到这里&#xff0c;谢谢大家&#xff01;&#xff01;

ZYNQ程序固化——ZYNQ学习笔记7

一、ZYNQ启动过程 二、 SD卡启动实操 1、对ZYNQ进行配置添加Flash 2、添加SD卡 3、重新生成硬件信息 4、创建vitis工程文件 5、勾选板级支持包 6、对系统工程进行整体编译&#xff0c;生成两个Debug文件&#xff0c;如图所示。 7、插入SD卡&#xff0c;格式化为 8、考入BOOT.…

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

Mongo数据库集群搭建

目录 1、Mongo集群优势 1.1 高可用性 1.2 水平扩展性 1.3 高性能 1.4 灵活的架构设计 1.5 数据安全 1.6 管理与监控 2、下载指定操作系统版本包 3、部署和验证工作 3.1 准备配置文件及依赖 3.2 启动第一个节点 3.3 部署更多的节点 3.4 初始化副本集 3.5 设置管理…

创建vue3项目步骤

脚手架创建项目&#xff1a; pnpm create vue Cd 项目名称安装依赖&#xff1a;Pnpm iPnpm Lint&#xff1a;修复所有文件风格 &#xff0c;不然eslint语法警告报错要双引号Pnpm dev启动项目 拦截错误代码提交到git仓库&#xff1a;提交前做代码检查 pnpm dlx husky-in…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

nfs服务器--RHCE

一&#xff0c;简介 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计 算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/IP网络共享资源&#xff0c;主要在unix系…

自动化运维(k8s):一键获取指定命名空间镜像包脚本

前言&#xff1a;脚本写成并非一蹴而就&#xff0c;需要不断的调式和修改&#xff0c;这里也是改到了7版本才在 生产环境 中验证成功。 该命令 和 脚本适用于以下场景&#xff1a;在某些项目中&#xff0c;由于特定的安全或政策要求&#xff0c;不允许连接到你的镜像仓库。然而…

HuggingFace:基于YOLOv8的人脸检测模型

个人操作经验总结 1、YOLO的环境配置 github 不论base环境版本如何&#xff0c;建议在conda的虚拟环境中安装 1.1、创建虚拟环境 conda create -n yolov8-face python3.9conda create &#xff1a;创建conda虚拟环境&#xff0c; -n &#xff1a;给虚拟环境命名的…

Unet++改进28:添加PPA(2024最新改进方法)|多分支特征提取策略,捕获不同尺度和层次的特征信息。

本文内容:添加PPA 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 红外小目标检测是一项重要的计算机视觉任务,涉及对红外图像中通常只有几个像素的微小目标进行识别和定位。然而,由于红外图像中物体的体积小,背景一般比较复杂,这给红外图像的识别带来…

CTF攻防世界小白刷题自学笔记13

1.fileinclude,难度&#xff1a;1,方向&#xff1a;Web 题目来源:宜兴网信办 题目描述:无 给一下题目链接&#xff1a;攻防世界Web方向新手模式第16题。 打开一看给了很多提示&#xff0c;什么language在index.php的第九行&#xff0c;flag在flag.php中&#xff0c;但事情显…

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C&#xff08;手机/平板等&#xff09;视频信号输入1路MIC1路LINE OUT,带1路HDMI环出&#xff0c;USB免驱&#xff0c;分辨率4K60&#xff0c;可采集3路信号中其中1路&#xff0c;按钮切换&#xff0c;可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

小程序如何完成订阅

小程序如何完成订阅 参考相关文档实践问题处理授权弹窗不再触发引导用户重新授权 参考相关文档 微信小程序实现订阅消息推送的实现步骤 发送订阅消息 小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 实践 我们需要先选这一个模板&#xff0c;具体流程参考…

解决Xeyes: Error can‘t open display,远程X无法连通问题。

一、问题分析 提前申明&#xff1a; 本次实验使用REHL 8 进行操作&#xff01; 客户机 A 为X-Client &#xff0c;即远程X的客户端。 服务机 B 为X-Server&#xff0c;即远程X的服务端。 问题的所有操作均在已经配置好Xorg的前提下进行的&#xff0c;不知道不配置会有什么影响&…

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

基于YOLOv8深度学习的智慧课堂学生专注度检测系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习的智慧课堂学生专注度检测系统&#xff0c;旨在实现对课堂中学生专注度的实时分析与评估。随着智慧教育的快速发展&#xff0c;学生的课堂表现和专注度成为评估学习效果的重要因素之一。然而&#xff0c;传统的专注度评估方法往往依赖于主观…