jdbc获取一行字符串_JDBC基础

2023-11-02

什么是JDBC?JDBC就是Java程序访问数据库的规范,是一个规范定义接口,各种数据库厂家实现了JDBC这个接口,这些实现类就是数据库驱动,使用时只需要调用接口中的方法即可,不用关注类是如何实现的。

JDBC的核心API有以下几种:

DriverManager类:管理和注册数据库驱动,获取数据库连接对象Connection接口:一个数据库连接对象,用于创建Statement和PreparedStatement对象Statement接口:一个数据库操作对象,用于执行sql语句PreparedStatement:一个数据库操作对象,用于执行sql语句,Statement的子接口ResultSet:用于封装数据库查询的结果集,返回给客户端Java程序

这些API怎么用后面会逐个介绍到。

JDBC经典6步:

public class Demo01 {    public static void main(String[] args) throws ClassNotFoundException, SQLException {        //1.加载注册驱动,省略了注册        Class.forName("com.mysql.jdbc.Driver");        //2.获取数据库连接对象        String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";        String username="root";        String password="root";        Connection connection = DriverManager.getConnection(url, username, password);        //3.获取数据库操作对象        Statement statement = connection.createStatement();        //4.执行sql语句,返回结果或者行数        String sql="SELECT * FROM users";        ResultSet resultSet = statement.executeQuery(sql);        //5.处理结果        while(resultSet.next()){            System.out.println("id="+resultSet.getObject("id"));            System.out.println("NAME="+resultSet.getObject("NAME"));            System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));            System.out.println("email="+resultSet.getObject("email"));            System.out.println("birthday="+resultSet.getObject("birthday"));        }        //6.释放连接        resultSet.close();        statement.close();        connection.close();    }}
id=1NAME=zhansanPASSWORD=123456email=zs@sina.combirthday=1980-12-04id=2NAME=lisiPASSWORD=123456email=lisi@sina.combirthday=1981-12-04id=3NAME=wangwuPASSWORD=111111email=wangwu@qq.combirthday=1996-05-22

第一步:注册、加载驱动

实际上应该是这样的:

Driver driver=new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver);

为什么这样只加载不注册也可以呢(mysql5之后)?

//1.加载注册驱动,省略了注册Class.forName("com.mysql.jdbc.Driver");

点开Driver类的源码发现:

类Driver实现了java.sql.Driver接口,在静态代码块中,DriverManager类的registerDriver方法注册了驱动,这样我们使用注解Class.forName加全类名就会自动执行静态代码块的内容,即自动注册了驱动,只需要加载即可。

7d1deada8f1ed900367858767b22011e.png

第二步:获取数据库连接对象connection

DriverManager类:管理和注册数据库驱动,获取数据库连接对象DriverManager类的getConnection方法返回一个数据库连接对象
//2.获取数据库连接对象String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";String username="root";String password="root";        Connection connection = DriverManager.getConnection(url, username, password);

第三步:获取数据库操作对象statement

Connection接口:一个数据库连接对象,用于创建Statement和PreparedStatement对象数据库连接对象connection的createStatement方法可以创建数据库操作对象Statementconnection还可以管理事务:connection.setAutoCommit(false);//开启事connection.commit();//提交事务connection.rollback();//回滚事务
Statement statement = connection.createStatement();

第四步:执行sql语句,返回结果或者行数

boolean execute(String sql):可以执行任意sqlint executeUpdate(String sql):执行DML语句(insert、delete、update),返回影响的行数ResultSet executeQuery(String sql):执行DQL(select)语句,返回结果集
//4.执行sql语句,返回结果或者行数String sql="SELECT * FROM users";ResultSet resultSet = statement.executeQuery(sql);

第五步:处理结果

如果执行的是DML语句则返回行数大于0表示执行成功,如果执行的是DQL语句,则返回结果集。

ResultSet:用于封装数据库查询的结果集,返回给客户端Java程序boolean next():游标向下移动一行,判断当前行是否有数据getXxx():获取数据,Xxx表示不同数据类型
while(resultSet.next()){      System.out.println("id="+resultSet.getObject("id"));      System.out.println("NAME="+resultSet.getObject("NAME"));      System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));      System.out.println("email="+resultSet.getObject("email"));      System.out.println("birthday="+resultSet.getObject("birthday"));}

第六步:释放连接

从小到大释放连接。

//6.释放连接resultSet.close();statement.close();connection.close();

以上六步只是最基本的,为了避免空指针异常,改进如下:

public class Demo02 {    public static void main(String[] args) {        Connection conn=null;        Statement st=null;        ResultSet rs=null;        try {            //1.加载驱动            Class.forName("com.mysql.jdbc.Driver");            //2.获取数据库连接对象            conn= DriverManager.getConnection();            //3.获取数据库操作对象            st= conn.createStatement();            //4.执行sql语句,返回结果或者行数            String sql="SELECT * FROM users";            ResultSet resultSet = st.executeQuery(sql);            //5.处理结果            while(resultSet.next()){                System.out.println("id="+resultSet.getObject("id"));                System.out.println("NAME="+resultSet.getObject("NAME"));                System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));                System.out.println("email="+resultSet.getObject("email"));                System.out.println("birthday="+resultSet.getObject("birthday"));            }        } catch (SQLException throwables) {            throwables.printStackTrace();        }finally {            if(rs!=null) {        try {            rs.close();        } catch (Exception e) {            e.printStackTrace();        }        }       if(st!=null) {           try {               st.close();           } catch (Exception e) {               e.printStackTrace();           }       }       if(conn!=null) {           try {               conn.close();           } catch (Exception e) {               e.printStackTrace();           }       }        }    }}

上面的代码重复的太多,因此进行封装。

首先是数据库的注册与连接写入db.properties文件。

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=falseusername=rootpassword=root

接着是获取连接对象和释放资源的代码抽取在jdbcutils中。

public class jdbcutils {    private static String driver=null;    private static String url=null;    private static String username=null;    private static String password=null;    static{        try {            InputStream in = jdbcutils.class.getClassLoader().getResourceAsStream("db.properties");            Properties properties = new Properties();            properties.load(in);            driver=properties.getProperty("driver");            url=properties.getProperty("url");            username=properties.getProperty("username");            password=properties.getProperty("password");            Class.forName(driver);        }catch (Exception e) {            e.printStackTrace();        }    }    //获取连接    public static Connection getConnection() throws SQLException {        return DriverManager.getConnection(url,username,password);    }    //释放连接资源   public static void release(Connection conn, Statement st, ResultSet rs){    if(rs!=null) {        try {            rs.close();        } catch (Exception e) {            e.printStackTrace();        }        }       if(st!=null) {           try {               st.close();           } catch (Exception e) {               e.printStackTrace();           }       }       if(conn!=null) {           try {               conn.close();           } catch (Exception e) {               e.printStackTrace();           }       }    }}

将注册驱动、获取连接对象和释放连接的代码抽取后,以上代码就可以写成如下,以后只需修改db.properties配置文件即可。

public class Demo02 {    public static void main(String[] args) {        Connection conn=null;        Statement st=null;        ResultSet rs=null;        try {            conn= jdbcutils.getConnection();            st= conn.createStatement();            String sql="SELECT * FROM users";            ResultSet resultSet = st.executeQuery(sql);            while(resultSet.next()){                System.out.println("id="+resultSet.getObject("id"));                System.out.println("NAME="+resultSet.getObject("NAME"));                System.out.println("PASSWORD="+resultSet.getObject("PASSWORD"));                System.out.println("email="+resultSet.getObject("email"));                System.out.println("birthday="+resultSet.getObject("birthday"));            }        } catch (SQLException throwables) {            throwables.printStackTrace();        }finally {            jdbcutils.release(conn,st,rs);        }    }}

工具齐全之后,开始看JDBC中存在的问题了:sql注入问题。

看一个sql语句:

select * from user where name="zhulin" and password='a' or '1'=1name="zhulin" and password='a'为假,'1'=1为真,or拼接之后,相当于select * from user where true;

这就是sql注入问题:用户输入的内容作为了SQL语句中的一部分,改变了原SQL的真正意义。

如何解决呢?还记得:

Connection接口:一个数据库连接对象,用于创建Statement和PreparedStatement对象

PreparedStatement对象正是用于解决这一问题。

public class Demo03 {    public static void main(String[] args) {        Connection conn=null;        PreparedStatement pstm=null;        try {            conn=jdbcutils.getConnection();            String sql="delete from users where id=?";            pstm=conn.prepareStatement(sql);//预编译             pstm.setInt(1,3);             int i=pstm.executeUpdate();             if(i>0){                 System.out.println("删除成功");             }        } catch (SQLException throwables) {            throwables.printStackTrace();        }finally {            jdbcutils.release(conn,pstm,null);        }    }}

mysql数据库产商在实现PreparedStatement接口的实现类中的setString(int parameterIndex, String x)函数中做了一些处理,把单引号做了转义(只要用户输入的字符串中有单引号,那mysql数据库产商的setString()这个函数,就会把单引号做转义)。

PreparedStatement会将SQL先发给数据库预编译,引用预编译后的结果,可以多次传入不同的参数给PreparedStatement对象并执行,减少SQL编译次数,提高效率,虽然多了几行代码,但安全性更高,解决了sql注入的隐患,提高了程序的可读性。

在前面提到Connection还可以管理事务,接着就简单介绍一下JDBC控制事务。

void setAutoCommit(false);//开启事void commit();//提交事务void rollback();//回滚事务

以一个转账的例子介绍:Navicat中建account表

a27a5de862c8e8898f970f67175407e7.png

public class DemoTrasaction {    public static void main(String[] args) {        Connection conn = null;        PreparedStatement pstmt1 = null;        PreparedStatement pstmt2 = null;        try {            //1.获取连接            conn = jdbcutils.getConnection();            //开启事务            conn.setAutoCommit(false);            //2.定义sql            //2.1 张三 - 500            String sql1 = "update account set balance = balance - ? where id = ?";            //2.2 李四 + 500            String sql2 = "update account set balance = balance + ? where id = ?";            //3.获取执行sql对象            pstmt1 = conn.prepareStatement(sql1);            pstmt2 = conn.prepareStatement(sql2);            //4. 设置参数            pstmt1.setDouble(1,500);            pstmt1.setInt(2,1);            pstmt2.setDouble(1,500);            pstmt2.setInt(2,2);            //5.执行sql            pstmt1.executeUpdate();            // 手动制造异常            //int i = 3/0;            pstmt2.executeUpdate();            //提交事务            conn.commit();        } catch (Exception e) {            //事务回滚            try {                if(conn != null) {                    conn.rollback();                }            } catch (SQLException e1) {                e1.printStackTrace();            }            e.printStackTrace();        }finally {            jdbcutils.release(conn,pstmt1,null);            jdbcutils.release(null,pstmt2,null);        }    }}

正常结果如下:

51689d82762486f15dfa499532eb749f.png

如果手动制造异常,则事务回滚,转账失败。

最后,介绍一下数据库连接池JDBC Template。数据库连接池就是一个容器,存放数据库连接对象,用户访问数据库时直接从连接池中获取数据库连接对象,访问完再归还给容器。使用数据库连接池可以解决资源,提高访问效率。

连接池常用的有C3P0和Druid。两者的使用都要导入jar包。

C3P0:先导入两个jar包,然后在src目录下定义配置文件:

c3p0.properties 或者 c3p0-config.xml。

 //1.创建数据库连接池对象DataSource ds  = new ComboPooledDataSource();//2. 获取连接对象Connection conn = ds.getConnection();

Druid:先导入jar包 ,在任意目录下定义druid.properties配置文件。

#驱动加载driverClassName=com.mysql.jdbc.Driver#注册驱动url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false#连接数据库的用户名username=root#连接数据库的密码password=root#属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wallfilters=stat#初始化时池中建立的物理连接个数。initialSize=2#最大的可活跃的连接池数量maxActive=300#获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。maxWait=60000#连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断timeBetweenEvictionRunsMillis=60000minEvictableIdleTimeMillis=300000#用来检测连接是否有效的sql,要求是一个查询语句。validationQuery=SELECT 1#建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。testWhileIdle=true#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为falsetestOnBorrow=false#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flasetestOnReturn=false#是否缓存preparedStatement,也就是PSCache。poolPreparedStatements=false#池中能够缓冲的preparedStatements语句数量maxPoolPreparedStatementPerConnectionSize=200
//1.加载配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.获取连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//3.获取连接Connection conn = ds.getConnection();

同样的,为了简化书写,编写JDBCUtils来加载配置文件,初始化连接对象,释放资源。

public class JDBCUtils {    //1.定义成员变量 DataSource    private static DataSource ds ;    static{        try {            //1.加载配置文件            Properties pro = new Properties();            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));            //2.获取DataSource            ds = DruidDataSourceFactory.createDataSource(pro);        } catch (IOException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }    }    //获取连接    public static Connection getConnection() throws SQLException {        return ds.getConnection();    }    //释放资源    public static void close(ResultSet rs , Statement stmt, Connection conn){        if(rs != null){            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(stmt != null){            try {                stmt.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(conn != null){            try {                conn.close();//归还连接            } catch (SQLException e) {                e.printStackTrace();            }        }    }   //获取连接池方法    public static DataSource getDataSource(){        return  ds;    }}

这样,我们就可以方便高效的使用JDBC了。

最后,还有一个关于JDBC的知识点,前面说过Spring可以集成Mybatis,同样,Spring也可以集成JDBC!会在后面单独写一章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdbc获取一行字符串_JDBC基础 的相关文章

  • 【C语言】反序加密(非文件)

    算法集训传送门 引言 铭记于心 我唯一知道的 便是我一无所知 我们的算法之路 众所周知 作为一名合格的程序员 算法 能力 是不可获缺的 并且在算法学习的过程中我们总是能感受到算法的 魅力 短短几行代码 凝聚无数前人智慧 一个普通循环 即是解
  • 挂载nfs报错合集

    问题一 报错 VFS Unable to mount root fs via NFS trying floppy 83 929713 random fast init done 100 366640 VFS Unable to mount
  • LOL代练检测——2019腾讯游戏安全技术竞赛初赛记录

    因为想要去腾讯实习 所以参加了今年的腾讯游戏安全技术竞赛 这个比赛赢了会有一个实习的绿色通道 选了数据分析方向里面的机器学习 初赛题目很有趣 关于LOL 英雄联盟 的代练检测 Moba游戏常见的5v5模式 玩家将与其余9名玩家共同组成对局
  • python 群发邮件 亲测可用

    1 先开通邮件的POP3 SMTP IMAP 拿到授权密码 注意 不是邮箱密码 2 相关代码 里面涉及到的数据库和邮件 都是相对路径下的 可根据代码自行创建和维护 pip install PyEmail import smtplib smt
  • 瑞芯微RGMII的配置

    主要配置项 除去复位等信号 我们主要关注两大块的配置 时钟配置 MAC 采用125M时钟 PHY采用25M时钟 主要配置时钟源 这个和具体硬件连线强相关 例如125M时钟可以来源于soc内部的PLL 也可以由对端PHY 提供 由对端PHY
  • 暴力解法破解PTA L1-006 连续因子 (20分)

    L1 006 连续因子 20分 一个正整数 N 的因子中可能存在若干连续的数字 例如 630 可以分解为 3 5 6 7 其中 5 6 7 就是 3 个连续的数字 给定任一正整数 N 要求编写程序求出最长连续因子的个数 并输出最小的连续因子
  • JetBrains使用Edu邮箱免费注册

    参考 https blog csdn net qq 22070551 article details 88864870 主要需要注意的是下面的问题 有一种情况无法激活就是 提示 jetbrains account connection er
  • 将类的非静态成员函数作为函数指针传递

    项目场景 QT C C 混合编程 将类的成员函数作为函数指针传递 问题描述 无法将类的成员函数作为函数指针传递给C语言的结构体 协议由C语言开发 结构体如下所示 DLT645 环境结构体 typedef struct dlt645 uint
  • pandas dataframe 一列数据变多列

    一 问题描述 希望把dataframe 中的一列数据分割为多列追加到dataframes上 分割前示意图 分割后效果图 二 代码实现 提取出分割列的名称 或者可以自己定义分割后的列名称 feature name data columns 1
  • ChatGPT是否可以生成虚拟角色?

    ChatGPT可以生成虚拟角色 作为一种基于人工智能的自然语言处理技术 ChatGPT具有广泛的应用领域 其中包括虚拟角色生成 虚拟角色是指在虚拟世界中代表和扮演特定角色的程序或实体 可以通过软件 硬件等方式进行构造和操作 虚拟角色通常包括
  • Quoit Design ————分治与归并(平面分治模板)

    Have you ever played quoit in a playground Quoit is a game in which flat rings are pitched at some toys with all the toy
  • muduo(一):C++多线程系统编程

    目录 第1章 线程安全的对象生命期管理 对象的创建很简单 销毁太难 线程安全的Observer有多难 再论shared ptr的线程安全 shared ptr技术与陷阱 对象池 弱回调 第2章 线程同步精要 互斥器 只使用非递归的mutex
  • angular 基础命令

    运行项目 ng serve ng serve host x x x x 指定host 编译 ng build 创建模块 module ng generate module
  • 【bug】ImportError: cannot import name ‘_update_worker_pids‘

    安装对应版本 pip install torch 0 4 0 f https download pytorch org whl torch stable html pip install i https pypi tuna tsinghua
  • JAVA将ResultSet结果集遍历到List中

    原文地址 JAVA将ResultSet结果集遍历到List中 作者 我不学习没人爱 今天在使用jstl标签展示查询结果时遇到一个小问题 即如何将ResultSet对象传递给前台页面 在默认情况中我们在使用数据库查询时 Class forNa
  • Go实现简单IPC框架

    简单IPC封装通信报的编码细节 使用channel来实现模块间数据传递 这里使用json数据包 server端 package ipc import encoding json fmt type Request struct Method
  • ShaderGraph制作“红旗迎风飘扬”效果(Unity2019版)

    文章目录 零 准备 旗面 游戏物体 一 核心1 模仿旗面的 起伏 二 核心2 让旗面的 吹动 起来 三 几点改进 A 旗面的摆动幅度 改进01 前后对称 B 旗面的摆动幅度 改进02 从左往右逐渐增大 C 旗面的飘动方向 改进01 只让在X
  • springboot渲染templates

    一 引入依赖
  • pycharm安装CV2

    一开始因为我的python版本 3 9 过高 from symbol import parameters 报错 The symbol module is deprecated and will be removed in future ve

随机推荐

  • dataframe根据时间戳timestamp切分成多个dataframe

    原始数据是 dataframe 的一列 timestamp 需要按照每5分钟做一次切分 下面是切分的代码 import pandas as pd def dataframe strip dataframe pd DataFrame min
  • 【数据结构X.6】代码实现:左孩子右兄弟表示法转换为树的双亲表示法,左孩子右兄弟表示法转化为树的孩子兄弟链表表示法,树的双亲表示法转化为左孩子右兄弟的二叉树表示法

    前文提要 数据结构 树 森林的双亲表示法 左孩子右兄弟表示法 创建树的左孩子右兄弟二叉树以及二叉树到树的双亲表示法的转换思路和算法 本文主题 可执行代码和代码示例在最后 左孩子右兄弟 表示法转换为树的 双亲表示法 左孩子右兄弟 表示法转化为
  • 基于 SpringBoot+Vue+Java 的财务管理系统(附源码,数据库,教程)

    大家好 我是程序员徐师兄 六年大厂经验 今天为大家带来的是基于 SpringBoot Vue Java 的财务管理系统 附源码 教程 文章目录 一 简介 第二 主要技术 第三 部分效果图 第四章 系统设计 4 1功能结构 4 2 数据库设计
  • 电脑蓝屏日志存在哪里_记录蓝屏代码的文件在哪呀

    系统突然就蓝屏 对于普通用户来说 根本无法知道这是怎么回事 其实 windows系统每次出错 都会有相应的日志被记录下来 蓝屏也一样 只要找到日志 加以分析 找到蓝屏的原因 就好办了 1 查找日志 Windows XP和Vista的步骤差不
  • python自动发送邮件实现

    目录 1 前言 2 准备工作 2 1 电子邮件的基础知识 2 2 python邮件库 2 3 邮箱设置 3 python实现邮件自动发送 3 1 SMTP 和send 方法介绍 3 2 python实现实例 参考信息 1 前言 python
  • 【Python-Unity】基于Levenberg-Marquardt的UR3机械臂位置逆解

    摘要 Python程序实现了基于LM法计算UR3机械臂的位置逆解 并通过插补得到机器人轨迹 发送到Unity客户端 控制机械臂运动 Unity场景 操作演示 代码逻辑 源代码 一 Unity场景脚本 1 1 客户端Client cs Zer
  • mysql数据类型默认长度_mysql数据类型长度

    1个字节 8位 tinyint 为一个字节 2的8次方 256 所以最多存储到256 日期和时间数据类型 MySQL数据类型 含义 date 3字节 日期 格式 2014 09 18 time 3字节 时间 格式 08 42 30 date
  • spring boot Actuator原理详解之启动

    本文基于spring boot 2 2 0 release版本 从本文开始 我将连续几篇文章介绍Actuator的原理 本文是原理的第一篇文章 介绍Actuator是如何启动的 我们知道访问Actuator可以通过JMX web等渠道 本文
  • Jenkins拉取github库代码执行构建

    前言 上篇文章写了关于定时构建 以及构建后发送邮件的内容 但是构建时运行的代码是我们手动添加到Jenkins工作空间的 这篇文章我们说一说自动从GitHub远程库拉取代码 执行构建 废话不多说 开始 开始之前 我们需要安装GitHub插件
  • FDTD script command(结构)

    addcircle 添加圆柱体 addrect 添加长方体 addsphere 添加球体 addtriangle 添加三角柱 addmesh 添加网格 addfdtd 添加仿真区域 通用设置 设置结构名字 set name name 设置位
  • 启莱OA messageurl.aspx SQL注入

    子曰 不患人之不己知 患不知人也 漏洞复现 访问漏洞url 使用SQLmap对参数 user 进行注入 漏洞证明 文笔生疏 措辞浅薄 望各位大佬不吝赐教 万分感谢 免责声明 由于传播或利用此文所提供的信息 技术或方法而造成的任何直接或间接的
  • mysql中dml全称是什么_dml是什么?

    展开全部 DML是Data Manipulation Language的缩写 意思是数据62616964757a686964616fe4b893e5b19e31333431363566操纵语言 是指在SQL语言中 负责对数据库对象运行数据访
  • 初识消息队列(Messges Queue)

    最近在学习消息队列 因此查阅了很多资料 所以将知识做了一个总和 方便读者读完对消息队列有一个大致的了解 1 什么是消息队列 消息队列一般简称为 MQ Messges Queue 是指利用高效可靠的消息传递机制进行与平台无关的数据交流 并基于
  • LeetCode——034

    34 Search for a Range My Submissions QuestionEditorial Solution Total Accepted 80156 Total Submissions 275867 Difficulty
  • GAMES101回顾 -- 光线追踪

    Ray Tracing 光线追踪 实现步骤 发射光线 Ray Generation 光线追踪算法从观察者的视点 如相机位置 发射一条主光线 这条光线的起点是相机位置 方向是从相机位置经过像素位置的射线 光线求交 Ray Object Int
  • 【负荷预测】长短期负荷预测(Matlab代码实现)

    欢迎来到本博客 作者研究 主要研究方向是电力系统和智能算法 机器学习和深度学习 目前熟悉python网页爬虫 机器学习 群智能算法 深度学习的相关内容 希望将计算机和电网有效结合 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智
  • 如何找短视频素材?这些工具可以帮到你

    由于自媒体成本低 门槛低 越来越多的人纷纷转行加入自媒体大军 利用大数据的便利 大量产出短视频吸粉变现 那么 如何高速产出短视频作品呢 下面这几个工具超级实用 01 易撰 说起易撰 很多人都只知道易撰的自媒体库 是非常强大的爆文收集器 但其
  • 如何用pip升级python版本,python的pip升级没反应

    大家好 小编为大家解答python的pip如何更新到最新版本的问题 很多人还不知道如何用pip升级python版本 现在让我们一起来看看吧 1 pip如何升级 第一步 首先检测一下我们电脑是否安装了python 打开命令提示框 输入pyth
  • ir指令、立即数的作用_我们一起学RISC-V——05-RV32I指令集

    本期内容如下 RISC V指令格式 RV32I指令命名规则 RV32I指令集 重点指令详解 一 RISC V指令格式 RISC V按照32bit的指令不同字符的具体分布共分为6种基本格式 分别是R类型 I类型 S类型 U类型 J类型 B类型
  • jdbc获取一行字符串_JDBC基础

    什么是JDBC JDBC就是Java程序访问数据库的规范 是一个规范定义接口 各种数据库厂家实现了JDBC这个接口 这些实现类就是数据库驱动 使用时只需要调用接口中的方法即可 不用关注类是如何实现的 JDBC的核心API有以下几种 Driv