jdbc学习笔记

JDBC全部教程(原理及案例) JDBC是一种使用Java语言操作数据库的接口。使用JDBC的一般步骤是:首先注册驱动(导入jar包;其次,使用数据库连接池,获取Connection连接,定义SQL语句;第三,获取预编译PreraredStatement对象;第四,执行SQL语句;第五,处理输出的结果;第六,释放资源。对上述的代码(4.删除)展开解释://1.创建一个Properties对象,用于加载数据库连接和Druid的配置信息。//2.建立连接//定义sql语句,用String变量接收;\n"; 阅读详情

JDBC笔记

一、为什么要学习jdbc

  • jdbc是Java和数据库之间的必要纽带
    java跟数据库之间的通信要通过jdbc来实现
  • 数据库层框架底层原理
    jdbc是mybatis、hibernate、jpa等应用层框架的底层驱动

二、jdbc的相关概念

2.1 定义

JDBC : Java Database Connectivity || Java连接数据库技术
即,在java代码中,使用JDBC提供的方法,可以发生字符串类型的sql语句到数据库管理软件(Mysql、Oracle等),并且获取语句的执行结果,进而通过java代码实现数据库的crud操作的技术。

jdbc由两部分组成:
1. Java提供的jdbc规范(接口)
2. 各个数据库厂商的实现驱动jar包

2.2 核心api

  • DriverManager
    1.将第三方数据库厂商的实现驱动jar包注册到程序中
    2.根据数据库连接信息获取connection

  • Connection
    1.表示数据库建立的连接,可以在连接的对象上,多次执行数据库crud的操作
    2.可以获取到statement | preparedstatement | callablestatement对象

  • statement | preparedstatement | callablestatement
    1.具体发送sql语句到数据库软件的对象
    2.用不同方式发送过程有所不同,最主要掌握preparedstatement!
    a. 静态sql语句使用statement
    b. 有动态传参的sql语句使用preparedstatement
    c. 执行存储过程的sql语句使用callablestatement

  • result
    1.面对对象思维的产物(抽象成数据库查询的结果集)
    2.存储的是查询数据库结果的对象
    3.需要我们进行解析才能获取到其中的数据

三、核心api的使用

3.1 使用前配置

  1. 首先创建一个lib文件夹用于存放要使用的jar包,将jar包复制到该文件夹下
    在这里插入图片描述
  2. 将jar包加入到Library中
    在这里插入图片描述
  3. 数据库的准备
CREATE DATABASE atguigu;
USE atguigu;

CREATE TABLE t_user(
	id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户主键',
	account VARCHAR(20) NOT NULL UNIQUE COMMENT '账号',
	PASSWORD VARCHAR(64) NOT NULL UNIQUE COMMENT '密码',
	nickname VARCHAR(20) NOT NULL UNIQUE COMMENT '昵称'
);

INSERT INTO t_user(account,PASSWORD,nickname)
VALUES ('root','123456','经理'),('admin','777777','管理员');

3.2 jdbc执行过程

  1. 注册驱动 依赖的jar包,进行安装
  2. 建立与数据库的连接connection
  3. 创建发送sql语句的对象statement
  4. statement对象发送sql语句并且获取到结果集
  5. 解析结果集,获取到数据
  6. 销毁资源,释放connection、statement、resultSet对象
    在这里插入图片描述

3.3 通过statement查询数据库实例demo

package jdbc.com.demo.statement;

import com.mysql.cj.jdbc.Driver;

import java.sql.*;

/**
 * ClassName: StatementQueryPart
 * Package: jdbc.com.demo.statement
 * Description:
 * 使用statement查询t_user表下的全部数据
 * @Author 乌冬面
 * @Create 2023/10/29 0029 20:13
 * @Version 1.0
 */
public class StatementQueryPart {
    /**
     * todo:
     *      DriverManager
     *      Connection
     *      Statement
     *      ResultSet
     * @param args
     */
    public static void main(String[] args) throws SQLException {
        //1.注册驱动
        /**
         * 依赖:
         *      驱动版本 8+ com.mysql.cj.jdbc.Driver
         *      8以下的版本 com.mysql.jdbc.Driver
         */
        DriverManager.registerDriver(new Driver());

        //2.获取connection
        /**
         * java程序要想和数据库建立连接,肯定需要提供连接的数据库的相关信息
         *      数据库ip地址
         *      数据库端口号
         *      账号
         *      密码
         *      连接数据库的名称
         * DriverManager.getConnection(String url,String username,String password)
         *      url : jdbc:数据库厂商名://ip地址:port/数据库名
         *      username : 数据库软件账号
         *      password : 数据库软件密码
         */
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu","root","123456");

        //3.创建statement
        Statement statement = connection.createStatement();

        //4.通过statement发送sql语句返回结果集
        String sql = "select * from t_user;";
        ResultSet resultSet = statement.executeQuery(sql);

        //5.解析结果集
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String account = resultSet.getString("account");
            String password = resultSet.getString("password");
            String nickname = resultSet.getString("nickname");
            System.out.println(id + " -- " + account + " -- " + password + " -- " + nickname);
        }
        //6.销毁资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

程序运行结果如下:
在这里插入图片描述

3.4 详解statement实例

3.4.1 注册驱动

在上面的案例中,我们注册驱动时使用的方法为:

DriverManager.registerDriver(new Driver());

这样编写会出现问题,因为在registerDriver()方法调用和Driver类创建的时候都会注册驱动,驱动注册了两次,无端产生了性能的消耗,所以我们希望只注册一次驱动。因为Driver类的静态代码块始终都是要触发的,所以我们选择只触发其静态代码块。

因此,我们必须要了解什么时候静态代码块会被触发:
类加载机制的流程:

  • 加载[class文件 -> jvm虚拟机的class对象]
  • 连接[验证(检查文件类型) -> 准备(静态变量默认值) -> 解析(触发静态代码块)]
  • 初始化[静态属性赋真实值]

触发类加载的情况:

  1. new 关键字
  2. 调用静态方法
  3. 调用静态属性
  4. 接口 1.8 default默认实现
  5. 反射
  6. 子类触发父类
  7. 程序的入口main


    所以我们可以简便的使用如下代码实现注册驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
3.4.2 getConnection()方法

getConnection()是一个重载方法,允许开发者使用不同方式传入数据库连接核心参数。
其核心属性有:

  1. 数据库软件所在主机的ip地址:localhost | 127.0.0.1
  2. 数据库软件所在主机的端口号:3306
  3. 连接的具体数据库:atguigu
  4. 连接的账号:root
  5. 连接的密码:123456
  6. 可选信息

getConnection()有三种实现形式:

/**
* 三个参数
* getConnection(string url,string user,string password)
*      string url          数据库软件所在信息,连接具体库,以及其他可选信息
*                          语法: jdbc:数据库管理软件名称[mysql\oracle...]://ip地址|主机名:port端口号/数据库名?key=value&key=value...
*                          在本机的省略写法 jdbc:mysql://localhost:3306/atguigu == jdbc:mysql:///atguigu 省略本机地址和3306端口号
*                          强调:必须是本机,并且端口号为3306才可以省略
*      string user         root
*      string password     123456
*
* 两个参数
* getConnection(string url,properties info)
*      string url          同上
*      properties info     存储账号跟密码
*                          properties 类似于Map 只不过key跟value都是用字符串
形式存储的
*
* 一个参数
* getConnection(string url)
*      string url          除传入以上的信息以外,在可选信息中加入账号跟密码的信息
*
*      可选信息:   8.0.25以后会自动识别时区,默认使用utf-8版本
*      serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=true
*/

以下分别对三种方法都进行实现:

Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu","root","123456");
Properties info = new Properties();
info.put("user","root");
info.put("password","123456");
Connection connection1 = DriverManager.getConnection("jdbc:mysql:///atguigu", info);
Connection connection2 = DriverManager.getConnection("jdbc:mysql:///atguigu?user=root&password=123456");
3.4.3 resultSet解析

resultSet类是一个抽象的结果集,包含了从数据库中查询得到的所有结果。
要想进行数据解析,要做两件事情:

  1. 移动游标指定获取数据行
    1. resultSet内部包含一个游标,指定当前数据行
    2. 默认游标指定的是第一行数据之前
    3. 调用next()方法向后移动一行游标
    4. next()返回值为 true表示往后还有数据,false表示后面没有数据了
  2. 获取指定数据行的列数据
    resultSet.get类型(列名,可以是别名 | 列下标从1开始)

以下是具体resultSet解析数据的代码:

while (resultSet.next()){
    int anInt = resultSet.getInt(1);
    String account1 = resultSet.getString("account");
    String password1 = resultSet.getString(3);
    String nickname = resultSet.getString("nickname");
    System.out.println("nickname: " + nickname);
}

3.5 preparedstatement使用

使用statement会发送sql查询会产生的问题

  • sql语句需要字符串拼接,比较麻烦
  • 只能拼接字符串类型,其他类型的数据类型无法处理
  • 可能发生注入攻击(动态值充当了sql语句结构,影响了原有的查询结果)

因此,我们使用preparedStatement来进行动态传入参数的sql语句的执行

        /**
         * preparedStatement
         *    1.编写sql语句结果 不包含动态值部分的语句,动态值部分使用占位符 ? 替代
         *      注意: ?只能替代动态值
         *    2.创建preparedStatement,并且传入动态值
         *    3.动态值 占位符 赋值
         *    4.发送sql语句并且返回结果
         *
         * */
        String sql = "SELECT * FROM t_user WHERE account = ? AND password = ?;";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        /*
        * 对单独的占位符进行赋值
        *   1. 参数1 : index 占位符的位置 从左向右从1开始
        *   2. 参数2 : object 占位符的值 可以设置任何类型的数据,避免了我们拼接和类型更加丰富
        * */
        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);

        //由于sql的结构已经确定,并且占位符的值都已经赋值成功,所以在执行时不需要传入参数
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }

注意:

​ 如果想在查询之后将结果集存储到一个List集合之中,应该将结果按行的顺序取出,一行之中每一列的数据都存入到一个Map之中,然后将Map一次存入List集合即可

在这里插入图片描述

获取列信息的相关方法:

  • ResultMetaData resultSet.getMetaData()获取的是当前列的信息对象,可以通过它获取列的名称,根据下角标获取列的数量
  • resultSet.getMetaData().getColumnCount() 获取当前结果集列的数量
  • resultSet.getMetaData().getColumnLabel(i)根据下角标i获取到列的别名,如果没有写别名,则获取列的名称,推荐这种方式
  • resultSet.getMetaData().getColumnName(i)根据下角标i获取到列的名称,不会获取别名

四、jdbc拓展

4.1 主键回显

主键回显是指:在对表数据进行插入等操作时,想要获取到表自增长的主键的值,通过主键回显的方式,来获取到该值。

具体步骤

  1. 首先要在创建preparedStatement对象时,传入一个PreparedStatement.RETURN_GENERATED_KEYS参数,告知其带回主键
PreparedStatement preparedStatement = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
  1. 取回主键是在preparedStatement对象execute之后,通过PreparedStatement类的getGeneratedKeys()方法,该方法返回一个ResultSet对象,获取ResultSet结果集的方法与之前相同,先用next()方法使其指针移动一位,然后用get()发方法获取主键值
       ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
       generatedKeys.next();
       int id = generatedKeys.getInt(1);
       System.out.println("返回的主键为:" + id );
    

总体demo

    @Test
    public void test_01() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?user=root&password=123456");
        String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
        //要想使用主键回显,要在创建preparedStatement对象时,传入一个PreparedStatement.RETURN_GENERATED_KEYS参数,告知其带回主键
        PreparedStatement preparedStatement = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
        preparedStatement.setString(1, "test7");
        preparedStatement.setString(2, "1020");
        preparedStatement.setString(3, "跟韩剧");
        int rows = preparedStatement.executeUpdate();
        if (rows > 0){
            System.out.println("数据插入成功");
            //可以获取回显的主键
            ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
            generatedKeys.next();
            int id = generatedKeys.getInt(1);
            System.out.println("返回的主键为:" + id );
        } else {
            System.out.println("数据插入失败");
        }
        preparedStatement.close();
        connection.close();
    }

4.2 批量插入数据优化

按照传统的插入方式进行批量操作时,每次操作都要重新执行一次execute操作,运行的效率很慢。
因此我们在进行大量数据的插入操作时使用批量操作
使用步骤

  1. 在url中要在地址?之后加上rewriteBatchedStatements=true语句,其作用是允许批量插入操作

      Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?rewriteBatchedStatements=true&user=root&password=123456");
    
  2. 在编写sql语句时,一定要使用values而不能用value,而且sql语句最后不能添加;

    String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
    
  3. 在循环体内执行了set操作之后使用addBatch()方法,将当前插入的数据追加到values之后

    for (int i = 0; i < 10000; i++) {
                preparedStatement.setString(1, "dd" + i);
                preparedStatement.setString(2, "ww" + i);
                preparedStatement.setString(3, "xiaohong" + i);
    
                preparedStatement.addBatch(); //不执行,追加到values的后边
            }
    
  4. 当数据全部插入完成使用executeBatch()方法执行批量插入

    preparedStatement.executeBatch();//执行批量操作
    

总体demo

  @Test
    public void test_02() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        //允许批量插入操作
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?rewriteBatchedStatements=true&user=root&password=123456");
        String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
        long start = System.currentTimeMillis();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < 10000; i++) {
            preparedStatement.setString(1, "dd" + i);
            preparedStatement.setString(2, "ww" + i);
            preparedStatement.setString(3, "xiaohong" + i);

            preparedStatement.addBatch(); //不执行,追加到values的后边
        }
        preparedStatement.executeBatch();//执行批量操作

        long end = System.currentTimeMillis();
        System.out.println(end - start);
        preparedStatement.close();
        connection.close();
    }

五、druid连接池

5.1 使用连接池的原因

在传统的获取连接的方式中,每次在使用jdbc操作前都要先建立一个数据库的连接,在操作完成之后再销毁连接。当操作量特别大时,这样的方式不仅繁琐,而且每次都建立销毁连接的开销很大。因此,提出连接池,是为了将连接复用起来,提高效率。

5.2 druid连接池的使用

druid连接池的使用有两种方式:软连接和硬链接的方式,下面将依次介绍
1 硬链接方式

		//1.创建一个连接池对象
        DruidDataSource dataSource = new DruidDataSource();

        //2.设置连接池参数[必须/非必须]
        //必须 连接数据库驱动类的全限定符[注册驱动] | url | user | password
        //非必须 初始化连接数、最大连接数
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); 
        dataSource.setUrl("jdbc:mysql://localhost:3306/atguigu?user=root&password=123456"); 
        dataSource.setUsername("root");     
        dataSource.setPassword("123456");   
        dataSource.setInitialSize(5); 	//设置初始化连接数

        //3.获取连接
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println(connection);

        //4.回收连接
        connection.close();

​ 2 软连接的使用,首先要创建一个properties文件,在文件中存储创建连接池的具体参数信息

driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbd:mysql:///atguigu

​ 注意:在properties文件中的各种key关键字的名称是特定的,具体可以使用参考文档查看,不要写错了

然后要获取到这些参数信息,让然后创建连接池

		//1.读取外部配置文件 Properties
        Properties properties = new Properties();
        //src下的文件可以使用类加载器获取
        InputStream ips = 	DruidUse.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(ips);
        //2.使用连接池的工具类的工厂模式,创建连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        //3.获取连接
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println(connection);

        //4.回收连接
        connection.close();

六、工具类的封装

6.1 非DQL的封装

public int executeUpdate(String sql, Object... params) throws SQLException {
        //获取连接
        Connection connection = JdbcUtils.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i + 1, params[i]);
        }
        int rows = preparedStatement.executeUpdate();
        preparedStatement.close();
        //没有开启事务,则由dao层关闭connection
        if (connection.getAutoCommit()){
            JdbcUtils.closeConnection();
        }
        return rows;
    }

6.2 DQL的封装

/**
     * 使用泛型来返回数据
     *      <T>声明一个泛型,不确定类型
     *          确定泛型 使用参数Class<T> clazz
     *          使用反射技术为属性赋值
     * @param clazz
     * @param sql
     * @param params
     * @return
     * @param <T>
     * @throws SQLException
     */
    public <T> List<T> executeQuery(Class<T> clazz,String sql, Object... params) throws SQLException, InstantiationException, IllegalAccessException {
        Connection connection = JdbcUtils.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i + 1, params[i]);
        }
        ResultSet resultSet = preparedStatement.executeQuery();
        List<T> list = new ArrayList<>();
        while (resultSet.next()) {
            //调用类的无参构造函数实例化对象
            T t = clazz.newInstance();
            for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
                //获取对象的属性名
                String columnName = resultSet.getMetaData().getColumnLabel(i + 1);
                //获取对象的属性值
                Object value = resultSet.getObject(i + 1);
                try {
                    //使用反射给对象赋值
                    Field field = clazz.getDeclaredField(columnName);
                    //属性可以设置,打破private的修饰限制
                    field.setAccessible(true);
                    //赋值方法 , t->要赋值的对象(如果属性是静态的,第一个参数可以为null) ,value->具体的属性值
                    field.set(t, value);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            list.add(t);
        }
        return list;
    }
JDBC看这一篇就够了 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,()使用这些类库可以以一种标准的方法、方便地访问数据库资源。JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序。 阅读详情

相关推荐

JDBC深入浅出-jdbc学习笔记【入门到精通】

本文的学习笔记是根据动力节点杜聚宾杜老师,所讲的JDBC教程做的笔记(附源代码分析): 1.JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2.JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface)。 接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。 3.为什么要面向接口编程? 解耦合:降低程序的耦合度,提高程序的扩展力。 多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)

d586947的博客 478

JDBC学习笔记

文章目录1.前言2. JDBC编程六步骤2.1示例3.进阶写法4.处理查询结果集5.关于SQL注入5.1代码展示5.2关于Statement和PreparedStatement的区别6.JDBC事务自动提交机制6.1代码演示6.2手动修改事务7.JDBC工具类的封装7.1封装代码7.2使用JDBC实现模糊查询8.悲观锁和乐观锁的概念8.1悲观锁(行级锁)8.2乐观锁8.2乐观锁 1.前言 (1)JDBC概念:Java DataBase Connectivity(Java语言连接数据库) (2)本质:是SUN

少不入川。的博客 2043

JDBC学习手册完整版

JDBC编程,数据库编程,非常全面详细的JDBC学习手册JDBC 从物理结构上说就是 Java 语言访问数据库的一套接口集合。从本质上来说就是调用者 (程序员)和实现者(数据库厂商)之间的协议。JDBC 的实现由数据库厂商以驱动程序的 形式提供。JDBC API 使得开发人员可以使用纯 Java 的方式来连接数据库,并进行操作。 ODBC:基于 C 语言的数据库访问接口。  JDBC 也就是 Java 版的 ODBC。  JDBC 的特性:高度的一致性、简单性(常用的接口只有 4、5 个)。

JDBC详细介绍

前言 JDBC介绍 JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范,而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。本文代码都是采用MySQL数据库实现的。 JDBC编程步骤 1、装载相应的数据库的JDBC驱动并进行初始化 导入专用的jar包(不同的数据库可需要的j...

qq_24872841的博客 556

超声波 vs 红外 vs 激光雷达:扫地机器人避障传感器选型指南(实测对比)

本文深入对比了扫地机器人三种主流避障传感器——超声波、红外与激光雷达的核心原理与实测表现。文章基于成本、精度、环境适应性等关键指标,提供了清晰的选型决策树和典型场景配置方案,旨在帮助开发者与爱好者根据项目需求与预算,构建高效可靠的机器人避障系统。

h0i1j2k3l的博客 690

深入解析UDS 0x19服务:DTC状态掩码与故障诊断实战

本文深入解析了UDS诊断协议中的核心0x19服务(ReadDTCInformation),重点拆解了DTC状态掩码(DTCStatusMask)的八个状态位及其在故障生命周期中的联动逻辑。通过实战案例,详细说明了从故障发生、确认到清除的全过程,并介绍了如何利用该服务进行深度诊断,包括读取扩展数据(如冻结帧)和避免常见开发误区,是理解汽车ECU故障管理机制的关键。

weixin_29248313的博客 323

【Java】学JDBC看这篇文章就够了—JDBC保姆级教程

基本介绍1. JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。3. JDBC基本原理示意图4. JDBC是Java提供一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同实现。JDBC相关API✨原创不易,还希望各位大佬支持一下👍✏️ 评论,你的意见是我进步的财富!

任同学的博客 7186

基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践

贝叶斯统计学是一门基本思想与传统基于频率思想的统计学完全不同的统计学方法;它以其灵活性和先进性在现代的统计学中占据着重要的地位。贝叶斯统计学是开展科学研究不可缺少的重要手段,但是,因为其思想、技术和方法都与传统统计学有着较大区别;且其计算中涉及马尔科夫、蒙特卡罗和吉布斯采样等现代计算方法,对使用者经验和能力构成了很大的挑战。

AAIshangyanxiu的博客 679

尚硅谷JDBC学习笔记

尚硅谷JDBC学习笔记 文章目录尚硅谷JDBC学习笔记写在前面1. 通过Driver接口获取数据库连接2. 通过DriverManager获取数据库连接3. 通过Statement执行更新操作4. 通过ResultSet执行查询操作5. PreparedStatement6. 利用反射及JDBC元数据编写通用的查询7. DAO设计模式8. JDBC的元数据9. JDBC获取插入记录的主键值10. ...

李英俊小朋友 2689

STM32F103跑LVGL,用DMA加速刷屏,800*480大屏也能丝滑

本文详细介绍了如何在STM32F103芯片上通过DMA加速和内存优化,实现800*480大屏的LVGL流畅运行。通过FSMC+DMA硬件架构优化、双缓冲机制和LVGL参数调优,显著提升了界面刷新率和响应速度,适用于嵌入式GUI开发中的高性能需求场景。

weixin_30357231的博客 376

第二十一篇: `man`, `tldr`, `explain` - 授人以渔的“终极指令”

我们已经一起学习了19个(组)关键命令,从nvidia-smi到kubectl。但这只是GPU运维武器库中的一小部分。技术日新月异,新的工具、新的参数会不断涌现。这个系列的真正目的,不仅是教会你使用这19件“兵器”,更是希望你掌握学习任何一件新兵器的方法论。这套方法论就是你的“终极指令”。授人以鱼不如授人以渔。至此,《GPU运维指令集:20个关键命令的战地手册》系列已全部完结。我们从nvidia-smi出发,一路探索了监控、诊断、容器、集群、网络、性能等各个维度的命令,最后用自动化脚本将它们串联,又用。

weixin_42587823的博客 1351

[JDBC学习笔记] JDBC

摘要:JDBC是Java操作关系型数据库的标准API,通过定义统一的接口实现不同数据库的兼容操作。主要流程包括注册驱动、获取连接、执行SQL等步骤。核心API包括DriverManager(驱动管理)、Connection(连接对象)、Statement(SQL执行)和ResultSet(结果集)。PreparedStatement可预防SQL注入,提高安全性。数据库连接池(如Druid)通过复用连接提高性能,需配置DataSource获取连接。JDBC简化了Java与数据库的交互,实现了代码与数据库的解耦

qq_58547683的博客 960

工业预测性维护实战:振动分析+Transformer预警系统构建指南

摘要:本文聚焦工业设备预测性维护难题,提出基于振动分析与Transformer模型的全栈解决方案。通过低成本硬件选型(单传感器¥380)实现设备振动信号实时采集,利用边缘计算单元完成特征工程(RMS、峰度、峰值频率提取),并在云端部署Transformer时序模型进行异常预警。某风电龙头企业实践显示,系统将故障误报率从38%降至6%,维护成本降低58%,非计划停机时长减少87%。文中提供完整的边缘端特征提取代码、云端模型架构及实施流程,适配ISO 13373振动分析标准,为制造业设备健康管理提供可复用的工程

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 626

【Java基础】JDBC 学习笔记

JDBC 学习笔记 文章目录JDBC 学习笔记一、JDBC (Java Database Connectivity)1.1 JDBC数据库驱动1.2 JDBC API1.3 核心思想1.4 环境搭建二、JDBC开发步骤【重点】2.1 注册驱动2.2 连接数据库2.3 获取发送sql对象2.4 执行SQL语句2.5 处理结果2.6释放资源三、Result(结果集)3.1 接收结果集3.2 遍历ResultSet中的数据3.2.1 遍历方法四、常见错误五、PreparedStatement【重点】5.1 Pre

Tyou 316

面试官连夜整理:103道AI Agent面试题,答对一半直接加薪50%

维度AutoGPTLangGraphAutoGen控制流LLM 驱动的隐式循环代码层定义的显式状态图对话驱动的自动流转状态存储Prompt 上下文中(易丢失)结构化 State 对象(可持久化)对话历史(自动累积)分支能力依赖 LLM 的文本输出(不稳定)条件边 + 节点路由(确定性)多 Agent 对话自然分支(涌现式)回溯/回滚无原生支持,只能重新开始原生 Checkpoint 支持时间旅行无全局回滚,单 Agent 可重启人机协同仅人工在关键点介入(需要自定义)原生支持。

weixin_35774598的博客 622

一文读懂 SAP Web Dispatcher 配置参考:让 Gateway、OData 与后端服务各走各路

SAP Web Dispatcher在Fiori项目中常被低估,实际上它作为企业系统的HTTP(s)入口,承担着流量分发和安全防护双重职责。该组件通过URL路径规则(如/sap/opu/odata/转发至Gateway系统)实现多系统路由,隐藏后端复杂性,提供统一访问入口。配置要点包括HTTPS参数设置、客户端证书转发、端口定义以及系统冲突处理策略。合理的配置能确保前端统一访问、网络边界清晰可控,同时降低跨团队协作成本。生产环境需根据实际网络架构调整官方示例配置。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

JDBC(学习笔记)

JDBC就是使用Java语言· 全称:(Java DataBase Connectivity)J。

2401_87777360的博客 669

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JDBC学习笔记-自学及复习必备资料

本文是根据B站动力节点老杜的视频教程记得笔记,废话不多说直接整活!!! 1、JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2、JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface) java.sql.*; (这个软件包下有很多接口。) 接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于面向接口编程。 为什么要面向接口编程? 解耦...

d586947的博客 922

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Mybatis+JDBC学习笔记

Mybatis+JDBC学习笔记 配置文件 配置文件应该包括全局配置文件和映射文件,在编写这两个映射文件之前,必须创建mybatis环境(jar包等) 1.1全局配置文件 建议使用sqlMapConfig.xml,内容如下 加一个例子 ...

winer_jianxian的博客 244

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Java学习笔记】71 - JDBC入门

1. JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。3. JDBC的基本原理(原理)4.模拟JDBC1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成2. ResultSet对象保持一个光标指向其当前的数据行。最初,光标位于第一行之前。

qq_41891655的博客 1368

JDBC学习笔记(一)

JDBC学习笔记(一)作者:thinkersky[Email:yanghuangming@rongji.com]学习JAVA将近两个月了,前期接触的都只是关于表示层和逻辑层方面的知识,自认为对MVC三层控制模式和struts的相关设计已经有了初步的了解,所以近阶段准备就业务层相关知识进行攻关。先从JDBC着手。以下是一点心得,很多东东都是来源自网络(所以,网络绝对是好东西)。 1、

thinkersky的专栏 1576

JDBC学习笔记(二)

JDBC学习笔记(二)Thinkersky[Email:yanghuangming@rongji.com]    大家好,又过了一天,今天的福州经历了一场暴风雨的洗礼,宁静中夹带着其惯有的雍懒.调试了一天的程序,头有点晕,放松一下,听点music,写点东东.通过昨天的学习,对JDBC在JSP应用中的重要性和JDBC的概念有了一个初步的了解.为此,今天就看看如何利用JDBC API对数据

thinkersky的专栏 1512
上一篇: 一、java基础知识(oop以前)
下一篇: ubuntu18.04安装docker
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值