day29_jdbc

news2024/9/22 19:32:02

今日内容

零、 复习昨日
一、JDBC
二、登录
三、ORM

零、 复习昨日

  • DDL (针对结构,库,表,列,索引)

    • 最重要建表语句

      create table emp(
      	empno int primary key auto_increment,
          ename varchar(10) not null,
          sal double(10,2) default 3000,
          hiredate date unique
      )
      
  • DML

    • 增删改

      insert into 表名 (字段,...) values (,...)
      update 表名 set 字段 =delete from 表名 where 字段 =-- 以上增删改的结果是 受影响行数!!!
      
  • DQL

    • 查询

      select 字段 from 表名
      -- 结果是一张虚拟表
      
  • 顺序

    • 书写 select * from 表,表2 where … group by … having … order by … limit …
    • 执行 from…where…group by…having…select … order by… limit
  • 约束

    • 外键约束又叫引用完整性约束/参照完整性约束
    • 主键约束又叫实体完整性约束

一、引言


1.1 如何操作数据库

使用客户端工具访问数据库,需要手工建立连接,输入用户名和密码登录,编写 SQL 语句,点击执行,查看操作结果(结果集或受影响行数)。

客户端操作数据库步骤
image-20230316181353316

1.2 实际开发中,会采用客户端操作数据库吗?

在实际开发中,当用户的数据发生改变时,不可能通过客户端操作执行 SQL 语句,因为操作量过大,无法保证效率和正确性。

二、JDBC


2.1 什么是 JDBC?

JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作。

2.2 JDBC 核心思想

Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)。

核心思想
image-20230316181411600

2.2.1 MySQL 数据库驱动

  • mysql-connector-java-5.1.X.jar 适用于 5.X 版本
  • mysql-connector-java-8.0.X.jar 适用于 8.X版本

ps: 常识

jar包其实就是一种压缩包,其中就是一个java项目

mysql-connector-java-5.1.X.jar 中就是mysql厂商根据jdbc协议提供一些实现代码

2.3 环境搭建

mysql厂商提供的jdbc规范的实现,要想完成JDBC操作,就需要将驱动包加入到当前项目中.

2.3.1 方式1:复制粘贴

  • 在项目下新建 lib 文件夹,用于存放 jar 文件。
  • 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
  • 选中 lib 文件夹右键 Add as Library,点击 OK。
在项目名下创建文件夹lib
image-20221121105646545
命名为lib
image-20221121105703497
将mysql驱动包复制粘贴到此处
image-20221121105753513
添加驱动包为当前项目的类库
image-20221121110032950

2.3.2 方式2:idea导入类库

打开项目结构(Project Structure)
image-20230320105013907
选择libraries,添加jar包
image-20221121111310058
本地磁盘选择jar包
image-20221121111402075
应用生效
image-20221121111442727
下方,External查看导入类库
image-20221121111616446

2.3.3 测试

public class TestJDBC {

    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * 这个是java反射机制
         * 通过类路径将字节码文件加载到jvm
         */
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("OK" );// 只要不报错,就说明jar包导入成功
    }
}

三、JDBC编程

JDBC编程有标准步骤(八股文)

  • 注册驱动
    • 将sql语句的运行环境加载到JVM
  • 连接数据库
  • 获得执行SQL的对象
  • 执行SQL语句,获得结果
  • 关流

3.1 注册驱动

使用 Class.forName(“com.mysql.jdbc.Driver”);手动加载字节码文件到 JVM 中。
或者MySQL8版本 Class.forName(“com.mysql.cj.jdbc.Driver”);

Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.7版本 加载驱动

3.2 连接数据库

  • 通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象
    • URL:jdbc:mysql://localhost:3306/database
      • ?useUnicode=true&characterEncoding=utf8 // 解决数据编码格式乱码
      • &useSSL=false // 解决执行时控制台红色警告
      • &serverTimezone=UTC // mysql8版本需要加时区
    • username:root
    • password:123456
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC   ", "root","1234");
  • URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成

3.3 获取发送 SQL 的对象

通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。

Statement statement = conn.createStatement();

3.4 执行SQL 语句

执行 SQL 语句并接收执行结果。

String sql ="INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',4000,10000);";

int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
  • 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’
  • DML 语句:增删改时,返回受影响行数(int 类型)。
  • DQL 语句:查询时,返回结果数据(ResultSet 结果集)。

3.5 处理结果

接受处理操作结果。

if(result == 1){
	System.out.println("Success");
}
  • 受影响行数:逻辑判断、方法返回。
  • 查询结果集:迭代、依次获取。

3.6 释放资源

遵循先开后关原则,释放所使用到的资源对象。

statement.close();
conn.close();

3.7 案例

准备数据库表,进行CRUD.

create table tb_user(
 id int(11) primary key auto_increment comment '用户编号',
 username varchar(10) comment '用户名',
 password varchar(10) comment '密码',
 phone varchar(11) comment '手机号',
 createTime date comment '注册时间',
 money double(10,2) comment '账户余额',
 sex int(1) comment '性别 1男2女'
);

需求: 使用JDBC完成对tb_user表插入数据


package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示JDBC
 */
public class Demo1_insert {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        // 1 加载驱动
        // ps: 利用反射技术,将驱动类加载到JVM
        Class.forName("com.mysql.jdbc.Driver");

        // 2 通过驱动管理对象获得连接对象
        /**
         * 参数1 url: 数据库连接的地址
         *    协议://ip:端口/库名
         * 参数2 username: 数据库用户名
         * 参数3 password: 数据库密码
         */
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3 通过连接对象,创建执行sql语句的对象
        Statement statement = conn.createStatement();

        // 4 通过执行语句对象,执行sql,获得结果
        String sql = "insert into tb_user (id,username,password,phone,createTime,money,sex) values (2,'root','123456','1122200','2022-11-21',2000.0,2)";
        // 执行查询,是executeQuery()
        // 执行增删改,是executeUpdate(),返回受影响的行数
        int num = statement.executeUpdate(sql);

        if (num > 0) {
            System.out.println("插入成功!!" );
        }

        // 5 关流
        statement.close();
        conn.close();

    }
}

四、完成增删改

4.1 插入

参考入门案例

4.2 更新

任何的JDBC都是那5个步骤.

package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 更新
 */
public class Demo2_update {

    public static void main(String[] args) throws Exception {

        // 1 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2 通过驱动管理对象获得连接对象
        String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 3 通过连接对象创建执行语句对象
        Statement statement = conn.createStatement( );

        // 4 通过执行语句对象执行sql,获得结果
        String sql = "update tb_user set username = '小孟', phone = '666666' where id = 3";
        int num = statement.executeUpdate(sql);

        if (num > 0) {
            System.out.println("更新成功!" );
        }

        // 5 将对象的流关闭
        statement.close();
        conn.close();
    }
}

4.3 删除

package com.qf.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo3_delete {

    public static void main(String[] args) {
        Statement statement = null;
        Connection conn = null;
        try {
            // 1 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2 获得连接
            String url = "jdbc:mysql://localhost:3306/java2307?useSSL=false";
            String username = "root";
            String password = "123456";
            conn = DriverManager.getConnection(url, username, password);

            // 3 获得语句对象
            statement = conn.createStatement( );

            // 4 执行sql
            int num = statement.executeUpdate("delete from tb_user where id = 3");

            if (num > 0) {
                System.out.println("删除成功" );
            }
        }catch (Exception e) {
            // 如果有异常,要打印出来,因为要根据异常解决问题
            e.printStackTrace();
        } finally {
            try {
                // 5 关闭连接
                statement.close( );
                conn.close( );
            }catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

五、查询结果集ResultSet【重要】

查询返回的是一种虚拟表,Java的JDBC中是使用结果集(ResultSet)来封装这个虚拟表,结果集就是一个集合,内部就存储了列名和每行数据,那么学习查询的重点是

  • 从结果集取值
package com.qf.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.*;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo4_select {
    public static void main(String[] args) throws Exception{

        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2307?useSSL=false", "root", "123456");
        Statement statement = conn.createStatement( );
        /**
         * 执行查询方法 executeQuery()
         * 返回值是 ResultSet 结果集,其中就包含查询返回的所有数据(一张虚拟表)
         * ResultSet结果集中包含列和行数据,其中有个光标指向表头
         * next() 方法会向下移动一行,返回boolean,为true即有下一行数据,false该行没数据
         * 当指向该行后,有方法可以获取该行列值
         * getXxx()   ps:xxx是各种数据类型
         * 可以通过列索引或者列名称来获得列值
         * getXxx(int columnIndex) 下标从1开始,与虚拟表列序号有关
         * getXxx(String columnLabel) 通过列名取值,如果有别名要使用别名
         */
        String sql = "select birthday,money,username,password,id,sex,age from tb_user";
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            // int id = rs.getInt(1);
            // String username = rs.getString(2);
            // String password = rs.getString(3);
            // String sex = rs.getString(4);
            // int age = rs.getInt(5);
            // Date birthday = rs.getDate(6);
            // double money = rs.getDouble(7);

            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String sex = rs.getString("sex");
            int age = rs.getInt("age");
            Date birthday = rs.getDate("birthday");
            double money = rs.getDouble("money");
            System.out.println(id+"-"+username+"-"+password+"-"+sex+"-"+age+"-"+birthday+"-"+money);
        }
        rs.close();
        statement.close();
        conn.close();
    }
}

image-20221121164359945

六、登录案例【重要】

需求:

  • 通过控制台用户输入用户名和密码。
  • 用户输入的用户名和密码作为条件,编写查询 SQL 语句。
    • select * from user where username = xxx and password = xxx
  • 如果该用户存在,提示登录成功,反之提示失败。
package com.qf.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo5_Login {

    public static void main(String[] args) {

        // 1 输入用户名和密码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:" );
        String username = scanner.nextLine( );

        System.out.println("请输入密码:" );
        String password = scanner.nextLine( );

        // 2 根据用户名和密码查人
       boolean isOk =  findUserByLogin(username,password);

        // 3 结果
        if (isOk) {
            System.out.println("登录成功!" );
        } else {
            System.out.println("用户名或密码错误!" );
        }
    }

    // 使用捕获代码完成
    private static boolean findUserByLogin(String username, String password) {
        Connection conn = null;
        Statement statement = null;
        boolean isOk = false;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useSSL=false", "root", "123456");

            statement = conn.createStatement( );

            // 根据用户名和密码查询,注意字符串拼接.特别注意单引号
            ResultSet rs = statement.executeQuery("select * from tb_user where username = '"+username+"' and password = '"+password+"'");

            // 只要有值,就说明数据库有这个信息,登录成功
            if (rs.next()) {
               // System.out.println("登录成功!" );
                int id = rs.getInt("id");
                String uname= rs.getString("username");
                // ...

                System.out.println(id+"-"+username);
                isOk = true;
            } else {
               // System.out.println("用户名或密码错误!!" );
            }
        }catch (Exception e) {
            System.out.println("SQL操作出错!" );
            e.printStackTrace();// 打印异常
        } finally {
            try{
                statement.close();
                conn.close();
            }catch (Exception e) {
                System.out.println("关流异常" );
                e.printStackTrace();// 打印异常
            }
        }
        return isOk;
    }
}

七、ORM【重要】

7.1 什么是ORM

目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回.


在实际开发中,我们需要将零散的数据封装到对象处理.

ORM (Object Relational Mapping) 对象关系映射

是指数据库表Java的实体类有关系,可以进行映射

  • 数据库表 --> Java的类
    • tb_user —> User.java
  • 字段 --> 类的属性
    • id int --> private int id;
    • username varchar --> private String username;
  • 一行数据 --> 类的对象
  • 一行数据内每个列的值 --> 对象的属性值

7.2 实体类

实体类: 数据表中零散数据的载体,用来封装数据.

  • 表名 设计 类名
  • 将列名设计成属性名
    • id --> id
    • create_time --> createTime (下划线转驼峰)
  • 将列的数据类型设计成属性的数据类型
  • 给类提供对应set get

一般项目中一个表就会对应一个实体类,所有的实体类都会放在model/entity/pojo/javabeen包结构中


将来写项目,数据库设计完,搭建完项目,第一件事件就是根据表结构,创建实体类

package com.qf.model; // 包
public class User {   // 实体类,是表名
	// 属性是字段名
    private int id;
    private String username;
    private String password;
    private String phone;
    private Date createTime;
    private double money;
    private int sex;
    
    // setter getter...
}

image-20221122160619448

7.3 ORM改造登录案例

package com.qf.jdbc;

import com.qf.model.User;

import java.sql.*;
import java.util.Scanner;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 使用orm改造login登录案例
 */
public class Demo6_login_orm {
    public static void main(String[] args) {
        input();
    }
    // 1 键盘输入
    public static void input() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine( );

        System.out.println("请输入密码:");
        String password = scanner.nextLine( );

        // 调用方法执行查询
        User user = findUserByUsernameAndPassword(username, password);

        if (user != null) {
            System.out.println("用户登录成功" );
            System.out.println("用户信息: " + user );
        } else {
            System.out.println("用户名或密码错误!" );
        }
    }

    // 2 执行登录
    public static User findUserByUsernameAndPassword(String username, String password) {
        Connection conn = null;
        Statement s = null;
        ResultSet rs = null;
        // 声明user,赋值为null,下方如果登录成功,创建user对象
        // 即将来,可以通过user是否为空判断是否登录成功
        User user = null;
        try {
            // 1 驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2 连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");
            // 3 语句
            s = conn.createStatement( );

            // 4 查询
            String sql = "select * from tb_user where username = '"+username+"' and password = '"+password+"'";

            // 执行
            rs = s.executeQuery(sql);

            // 判断成功,说明查询到用户
            if (rs.next()) {
                // 取出数据
                int id = rs.getInt("id");
                String username1 = rs.getString("username");
                String password1 = rs.getString("password");
                String phone = rs.getString("phone");
                Date createTime = rs.getDate("createTime");
                double money = rs.getDouble("money");
                int sex = rs.getInt("sex");

                // 封装数据
                user = new User();
                user.setId(id);
                user.setUsername(username1);
                user.setPassword(password1);
                user.setPhone(phone);
                user.setCreateTime(createTime);
                user.setMoney(money);
                user.setSex(sex);
            }

        } catch (Exception e) {
            System.out.println("出错了!" + e.getMessage( ));
        } finally {

            // 5 关流
            try {
                rs.close();
                s.close( );
                conn.close( );

            } catch (SQLException e) {
                System.out.println("关流时有异常" + e.getMessage( ));
            }
        }
        return user;
    }
}

7.4 ORM完成注册

package com.qf.jdbc;

import com.qf.model.User;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Demo7_insert_orm {

    public static void main(String[] args) {

        User user = new User( );
        user.setUsername("王五");
        user.setPassword("123456");
        user.setPhone("110");
        user.setCreateTime(new Date( ));
        user.setMoney(2800.0);
        user.setSex(2);

        insert(user);

    }

    // 注册
    public static void insert(User user) {
        Connection conn = null;
        Statement s = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");
            s = conn.createStatement( );

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String date = sdf.format(user.getCreateTime( ));

            String sql = "insert into tb_user (username,password,phone,createTime,money,sex) " +
                    "values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+date+"',"+user.getMoney()+","+user.getSex()+")";

            System.out.println("拼接后的sql ---> " + sql );
            int num = s.executeUpdate(sql);
            System.out.println(num > 0 ? "插入成功":"插入失败" );

        } catch (Exception e) {
            e.printStackTrace( );
        }
    }
}

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

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

相关文章

TIA博途中FC和FB的区别与应用

TIA博途中FC和FB的区别与应用 从程序运行过程的角度看,FC、FB的区别在于传递参数方式不同: FC:通过L堆栈区传递参数 FB:通过背景DB传递参数 FC与FB具有不同的特性:  FC自身不能存储过程状态  FB可以通过静态变量存储中间过程状态  FB可以包含调用其他的FB及其背景D…

【Go编程语言】流程控制

流程控制 文章目录 流程控制一、if 语句1.if 嵌套语句 二、switch 语句三、for 循环四、string 程序的流程控制结构一具有三种:顺序结构,选择结构,循环结构 顺序结构:从上到下,逐行执行。默认的逻辑 选择结构&#xf…

C4D云渲染平台哪家好?

Cinema 4d(简称C4D)作为CG业内一款人人皆知的三维制作软件,操作界面简单清爽是它的亮点之一。此外,具有建模、灯光、材质、绑定、动画、渲染等强大功能的C4D的应用范围也十分广泛,包括电商海报、时尚设计、影视后期、广…

Java系统环境变量配置

PATH环境变量 PATH环境变量用于保存一系列命令(可执行程序)的路径,每个路径之间以分号分隔。当在命令行窗口运行一个命令时,操作系统首先会在当前目录下查找是否存在该命令对应的可执行文件,如果未找到,操作…

最新一键将网站DEDECMS 迁移到 WordPress脚本

DEDECMS宣布开始对运营类网站收费了,一年5800元,如果不想付费,那就需要转到其他网站了,就是一个不错的选择。 最近大神wordpress果酱牛逼闪闪的Denis和几个程序员制作了一个转Wordpress的,有需要的可以去下载使用,完全免费! 经过几个夜晚通宵的努力,我们终于搞定了一键…

开发必备,开源 or 免费的 AI 编程助手

AI 大模型的火热,让开发圈近来如虎添翼,各种各样基于 AI 技术的开发者工具和新范式不断涌现,尤其是 Github 和 OpenAI 共同推出的 Copilot X ,更是一骑绝尘。本文推荐一些开源 or 免费的 AI 编程工具,不妨试着用起来。…

基于stm32物联网开发板(1)

基于stm32物联网开发板(1) 本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram。本开发平台外设模块有ESP8266 WIFI模块、1.3寸LCD彩屏、SYN6288语音模块、MAX30102心率血氧传感器、AD8232心电图监测模块、BH1750环…

mysql的高级查询语句

1.本文前言 数据库是用来存储数据,更新,查询数据的工具,而查询数据是一个数据库最为核心的功能,数据库是用来承载信息,而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查…

Figma中文网?比Figma更懂你的设计网站!

一个比 Figma 更懂你的设计网站的 Figma 中文网 —— 即时设计是一个非常有用的设计资源平台,它提供了大量的免费设计素材,包括来自各大厂商的 UI 组件库、精美的模板、插画设计和矢量图标素材等等。设计师可以从中学习到大师的设计技巧和规范&#xff0…

Ubuntu18.04 下安装 MATLAB 2021a

1、MATLAB 软件获取 南开大学软件之家:http://ca.nankai.edu.cn,非南开大学校园IP无法登陆该平台。 点击浏览更多,找到 R2021a_Linux,开始下载,下载 R2021a_Linux.iso 镜像文件。 参考该网页下的个人版在线安装指南&a…

基于git的开发规范总结

文章目录 各分支命名规范gitee基本开发流程及定义gitflow工作流gitflow工作流常用分支主要工作流程命名规则gitflow工作流程图 Git分支开发管理策略主分支Master开发分支DevelopGit创建Develop分支的命令:将Develop分支发布到Master分支的命令: 临时性分…

【windows编程之对话框】对话框原理,对话框的创建

文章目录 引言一.对话框原理1.对话框的分类2.对话框的基本使用2.自定义对话框窗口消息处理函数 二.模式对话框- 1.创建对话框- 2.对话框的关闭- 3.对话框消息 三.模式对话框创建过程实践四.无模式对话框 引言 在本章节中我们来讲解Windows/Win32编程中对话框的原理和对话框的创…

Ajax请求,基于JSON的数据交换 实例

前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>发送Ajax GET请求 展示学生信息列表</title> <script type"text/javascript"> w…

camunda任务监听器如何使用

在Camunda工作流引擎中&#xff0c;任务监听器是一种机制&#xff0c;用于在业务任务执行期间捕获特定事件并执行相应的操作。它们可以帮助您实现一些重要的任务&#xff0c;例如&#xff1a; 1、记录或更新业务数据&#xff1a;当任务完成或取消时&#xff0c;您可以使用任务…

本地搭建wamp服务器并内网穿透实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 转载自cpolar极点云的文章&#xff1a;无公网IP&#xff1f;教你在外远程访问本地Wamp服务器「…

【C++】入门基础

文章目录 1、命名空间1.1、命名空间的概念1.2、命名空间的定义1.3、命名空间的使用 2、初识cout和cin2.1、标准输入输出对象简介2.2、缓冲区2.3、cout2.4、cin 3、缺省参数3.1、全缺省参数3.2、半缺省参数3.3、注意事项 4、函数重载4.1、函数重载的概念4.2、函数重载的定义4.3、…

OpenCV实战——根据立体图像计算深度信息

OpenCV实战——根据立体图像计算深度信息 0. 前言1. 立体视觉系统2. 计算深度信息3. 完整代码相关链接 0. 前言 人类可以用两只眼睛构建三个维度世界&#xff0c;而为机器人配备两个摄像头时&#xff0c;机器人同样也可以做到这一点&#xff0c;这称为立体视觉 (stereo vision…

exe4j

exe4j是一种用于将Java程序打包成可执行文件&#xff08;.exe&#xff09;的软件工具。使用exe4j&#xff0c;开发人员可以将Java程序打包成可独立运行的.exe文件&#xff0c;并将所需的Java虚拟机&#xff08;JVM&#xff09;包含在内。exe4j提供了许多配置选项&#xff0c;可…

五、FM1288调试方案-调试原理

本篇只讲述调试原理,侧重流程、理论,不涉及细节,比如应该调哪一块、哪些寄存器这些。 文章目录 1. 结构框图1.1 回声消除原理1.2 硬件结构2. 调试方案2.1 uart串口调试2.2 I2C调试1. 结构框图 1.1 回声消除原理 回声消除的详细原理,牵涉到算法相关的东西,不太了解,只描…

二项分布的参数p的检验

设某事件发生的概率为p&#xff0c;做m次的独立检验&#xff0c;以X为发生的次数&#xff0c;则X服从二项分布B(m, p)&#xff0c;则针对X可以做出假设 定义一个合理的检验,&#xff0c;设置一个阈值C&#xff1a; F : 当 X < C时&#xff0c;接受H0&#xff0c;否则拒绝H0 …