JDBC编程详细教程与示例源码

news2024/11/17 16:03:51

版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

在这里插入图片描述

JDBC概述

为了在Java语言中提供对数据库访问的支持,Sun公司于1996年提供了一套访问数据库的标准Java类库JDBC。JDBC的全称是Java数据库连接(Java Database Connectivity)它是一套用于执行 SQL语句的Java API。应用程序可通过这套API连接到关系数据库完成对数据库中数据的査询、更新和删除等操作。

关于JDBC与数据库驱动的关系,请参见下图:
在这里插入图片描述

Sun公司在JDBC中定义数据库操作的相关接口而各数据库厂商在其数据库驱动中实现了这些接口。也就是说:Sun公司并没有提供Java语言与各数据打交道的具体API;而是制定了相关的标准和规范;各数据库厂商(比如MySQL,Oracle,DB2等)在其数据库驱动中实现了这些接口(规范)。所以,JDBC屏蔽了Java与不同数据库打交道的细节问题。假如,项目原本使用的是MySQL,在某段时间后换成了Oracle,那我们基本不用去修改原来项目中的SQL语句,只需要把项目中MySQL的数据库驱动切换成Oracle对应的数据库驱动即可。

JDBC操作步骤与核心API

在此介绍在开发过程中使用JDBC常见操作步骤。

第一步:添加jar包

请添加MySQL所需jar包(例如:mysql-connector-java-5.1.7-bin.jar)至Java项目lib文件夹中;图示如下:

在这里插入图片描述

关于普通Java项目添加jar包,可另行参考:https://blog.csdn.net/lfdfhl/article/details/126780581

第二步:加载驱动

利用java.sql.DriverManager.registerDriver( )方法加载驱动,例如:

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

该方式不但强烈依赖数据库的驱动jar而且会导致驱动被重复注册2次。故,不建议使用该方式而使用反射的方式加载数据库驱动,代码如下:

Class.forName(com.mysql.jdbc.Driver);

第三步: 创建连接

利用java.sql.Drivermanager类中的getConnection()方法与数据库建立连接。

语法如下:

DriverManager.getConnection(“jdbc:mysql://数据库地址:端口号/数据库名”,”用户名”, “密码”);

示例如下:

Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”, “root”);

在该语法及其示例中,jdbc表示协议,mysql表示子协议,localhost代表数据库地址,3306表示端口号,mydb表示要连接的数据库;第一个root表示用户名,第二个root表示密码。

DriverManager.getConnection()方法返回的是java.sql.Connection类型的对象。java.sql.Connection是一个接口,它用于与数据库交互;各数据库驱动中均实现了该接口。

第四步:创建PreparedStatement对象

PreparedStatement是Statement的子接口,它可以预编译 SQL 语句并将预编译后的SQL语句存储在PreparedStatement对象中。由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement对象。

在项目开发过程中通常使用java.sql.Connection创建用于执行SQL语句的PreparedStatement;示例如下:

String sql = "Your SQL";
PreparedStatement preparedStatement = connection.prepareStatement(sql);;

Connection的prepareStatement()方法返回的是实现java.sql.PreparedStatement 接口的对象。java.sql.PreparedStatement接口用于操作SQL语句并返回相应的结果集;各数据库驱动中均实现了该接口。

PreparedStatement使用步骤

  • 第一步
    编写带有?占位符的SQL语句
  • 第二步
    使用Connection的prepareStatement( )方法和包含了?占位符的SQL语句创建PreparedStatement对象并对SQL语句进行预编译
  • 第三步
    使用PreparedStatement的setXXX(index , value)方法传入实参取代之前的?占位符
  • 第四步
    使用PreparedStatement的execute( )、 executeUpdate( ) 、 executeQuery( )方法执行 SQL 语句

总的来说:较Statement而言PreparedStatement中采用的预编译策略使得SQL语句的执行不但高效而且安全。

第五步:执行SQL语句

利用java.sql.PreparedStatement 执行SQL语句,其常用方法如下:

execute( )
该方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false

executeUpdate( )
该方法常用于执行DML( INSERT、UPDATE或DELETE)和DDL语句。执行DML语句时返回受SQL语句影响的行数,执行DDL语句时返回0

executeQuery( )
该方法通常执行査询语句,执行后返回代表结果集的ResultSet对象

示例如下:

ResultSet  resultSet = preparedStatement .executeQuery( );

在该示例中statement.executeQuery( )方法返回的是实现java.sql.ResultSet接口的对象。

ResultSet接口详细介绍

java.sql.ResultSet用于保存执行SQL语句之后得到的结果集;各数据库驱动中均实现了该接口。ResultSet对外暴露一个游标,该游标默认指向结果集第一行之前。

ResultSet常见方法释义如下:

boolean next()
将游标从当前位置向下移动一行

boolean previous()
将游标从当前位置向上移动一行

void afterLast()
将光标移动到末尾,正好位于最后一行之后

void beforeFirst()
将光标移动到开头,正好位于第一行之前

Object getObject(int columnIndex)
根据序号取值,索引从1开始

Object getObject(String ColomnName);
根据列名取值

int getInt(int colIndex)
以int形式获取ResultSet结果集当前行指定列号值

int getInt(String colLabel)
以int形式获取ResultSet结果集当前行指定列名值

float getFloat(int colIndex)
以float形式获取ResultSet结果集当前行指定列号值

float getFloat(String colLabel)
以float形式获取ResultSet结果集当前行指定列名值

String getString(int colIndex)
以String形式获取ResultSet结果集当前行指定列号值

String getString(String colLabel)
以String形式获取ResultSet结果集当前行指定列名值

Date getDate(int columnIndex)
以Date形式获取ResultSet结果集当前行指定列号值

Date getDate(String columnName)
以Date形式获取ResultSet结果集当前行指定列号值

void close()
关闭ResultSet对象

第六步:处理结果

在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中。在此请注意Java的数据类型与数据库的数据类型的对应关系:
在这里插入图片描述

第七步:关闭资源

数据库资源非常宝贵,数据库允许的并发访问连接数量有限。因此,当数据库资源用完后切记释放资源。为了保证资源的释放,常在finally代码块中关闭与数据库操作相关的资源。

JDBC入门案例

在此,通过一个完整的入门案例详细介绍JDBC的使用方式及其注意事项。

创建数据库与表

在MySQL中创建数据库mydb和user表并向表中插入数据。

代码如下:

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建user表
CREATE TABLE user(
		id INT PRIMARY KEY AUTO_INCREMENT,
		username VARCHAR(40),
		password VARCHAR(40),
		email VARCHAR(40),
		birthday DATE
);
-- 插入数据
INSERT INTO user(username,password,email,birthday)  VALUES ('lili','123456','lili@sina.com','1999-12-04');
INSERT INTO user(username,password,email,birthday)  VALUES ('dodo','565678','dodo@sina.com','1997-10-07');
INSERT INTO user(username,password,email,birthday)  VALUES ('nxnx','246866','nxnx@sohu.com','1992-11-11');
INSERT INTO user(username,password,email,birthday)  VALUES ('popo','246851','popo@sohu.com','1999-11-22');

创建Java项目

请在IDEA中创建普通Java项目;图示如下:

在这里插入图片描述
请规范地分层分包并添加项目所需的jar包。

编写User类

请在bean下创建User类,该类的属性与user表的字段相对应;代码如下:

package com.cn.bean;

import java.util.Date;

/**
 *  原创作者:谷哥的小弟
 *  博客地址:http://blog.csdn.net/lfdfhl
 * 
 * 请注意:java.util.Date与java.sql.Date的关系
 * java.util.Date是父类
 * java.sql.Date是子类
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    //请注意:Date类型为java.util.Date
    private Date birthday;

    public User() {

    }

    public User(int id, String username, String password, String email, Date birthday) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email+ ", birthday=" + birthday + "]";
    }

}

图示如下:

在这里插入图片描述

编写UserDao类

请在dao下创建UserDao类,该类用于对user表进行增删改查。首先,我们来实现一个最简单的功能即查询所有用户。代码如下:

package com.cn.dao;

import com.cn.bean.User;
import com.cn.util.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UserDao {

    // 获取所有用户
    public ArrayList<User> findAll(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<User> list = new ArrayList<User>();
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
            //编写SQL语句
            String sql = "select * from user";
            //创建PreparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //执行SQL
            resultSet = preparedStatement.executeQuery();
            //处理结果
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setEmail(resultSet.getString("email"));
                //请注意:getDate()方法返回的类型为java.sql.Date
                user.setBirthday(resultSet.getDate("birthday"));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }
}

图示如下:

在这里插入图片描述

编写测试类

请在test包下创建测试类TestJDBC01,测试Dao中的方法。在此,先测试UserDao中查询所有用户的方法;代码如下:

package com.cn.test;

import com.cn.bean.User;
import com.cn.dao.UserDao;
import java.sql.Date;
import java.util.ArrayList;

/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */

public class TestJDBC01 {
    public static void main(String[] args) {
        testFindAll();
    }

    // 查找所有用户
    public static void testFindAll() {
        UserDao userDao = new UserDao();
        ArrayList<User> userList = userDao.findAll();
        for (User u : userList) {
            System.out.println(u);
        }
    }

}

图示如下:

在这里插入图片描述

测试结果如下:

在这里插入图片描述
至此,我们完成了JDBC最基本的操作。

JDBC工具类

通过之前的学习我们对MySQL数据库和JDBC有了一定的了解。但是,在之前的示例中,我们每次操作数据库时都需要加载数据库驱动、建立数据库连接以及关闭数据库连接。为了避免代码的重复书写,我们需利用工具类对JDBC常见操作进行封装方便后续的调用。

请在util包下,创建JDBCUtils类;代码如下:

package com.cn.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class JDBCUtils {
    // 加载驱动并建立数据库连接
    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        // 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 数据库地址。请注意:请依据实际情况填写数据库名称
        String databaseUrl = "jdbc:mysql://localhost:3306/mydb";
        // 数据库用户名。请注意:请依据实际情况填写数据库用户名
        String username = "root";
        // 数据库密码。请注意:请依据实际情况填写数据库密码
        String password = "root";
        // 获取数据库连接
        Connection connection = DriverManager.getConnection(databaseUrl, username, password);
        return connection;
    }

    // 关闭数据库连接释放资源
    public static void release(Connection connection,Statement statement, ResultSet resultSet) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
    }
}

图示如下:

在这里插入图片描述
接下来,我们利用此工具类再次查询user表中的所有用户,UserDao中的findAllByUtils( )方法如下:

    // 结合数据库操作工具类获取所有用户
    public ArrayList<User> findAllByUtils(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<User> list = new ArrayList<User>();
        try {
            //建立连接
            connection = JDBCUtils.getConnection();
            //编写SQL语句
            String sql = "select * from user";
            //创建PreparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //执行SQL
            resultSet = preparedStatement.executeQuery();
            //处理结果
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setEmail(resultSet.getString("email"));
                //请注意:getDate()方法返回的类型为java.sql.Date
                user.setBirthday(resultSet.getDate("birthday"));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.release(connection, preparedStatement, resultSet);
        }
        return list;
    }

JDBC增删改查操作

在此,结合JDBC工具类实现对于user表的增删改查操作;UserDao代码如下:

package com.cn.dao;

import com.cn.bean.User;
import com.cn.util.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class UserDao {

    // 获取所有用户
    public ArrayList<User> findAll(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<User> list = new ArrayList<User>();
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //建立连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
            //编写SQL语句
            String sql = "select * from user";
            //创建PreparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //执行SQL
            resultSet = preparedStatement.executeQuery();
            //处理结果
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setEmail(resultSet.getString("email"));
                //请注意:getDate()方法返回的类型为java.sql.Date
                user.setBirthday(resultSet.getDate("birthday"));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }

    // 结合数据库操作工具类获取所有用户
    public ArrayList<User> findAllByUtils(){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<User> list = new ArrayList<User>();
        try {
            //建立连接
            connection = JDBCUtils.getConnection();
            //编写SQL语句
            String sql = "select * from user";
            //创建PreparedStatement
            preparedStatement = connection.prepareStatement(sql);
            //执行SQL
            resultSet = preparedStatement.executeQuery();
            //处理结果
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setEmail(resultSet.getString("email"));
                //请注意:getDate()方法返回的类型为java.sql.Date
                user.setBirthday(resultSet.getDate("birthday"));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.release(connection, preparedStatement, resultSet);
        }
        return list;
    }

    // 添加用户
    public boolean insert(User user) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "INSERT INTO user(username,password,email,birthday) VALUES (?,?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, user.getUsername());
            preparedStatement.setString(2, user.getPassword());
            preparedStatement.setString(3, user.getEmail());
            //请注意: setDate()方法第二参数类型为java.sql.Date
            Date date = new Date(user.getBirthday().getTime());
            preparedStatement.setDate(4, date);
            int num = preparedStatement.executeUpdate();
            if (num > 0) {
                return true;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(connection, preparedStatement,null);
        }
        return false;
    }

    // 删除用户
    public boolean delete(int userid) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "DELETE FROM user WHERE id=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, userid);
            int num = preparedStatement.executeUpdate();
            if (num > 0) {
                return true;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(connection, preparedStatement,null);
        }
        return false;
    }

    // 修改用户
    public boolean update(User user) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "UPDATE user SET username=? , password=? , email=? , birthday=? WHERE id=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, user.getUsername());
            preparedStatement.setString(2, user.getPassword());
            preparedStatement.setString(3, user.getEmail());
            //请注意: setDate()方法第二参数类型为java.sql.Date
            Date date = new Date(user.getBirthday().getTime());
            preparedStatement.setDate(4, date);
            preparedStatement.setInt(5, user.getId());
            int num = preparedStatement.executeUpdate();
            if (num > 0) {
                return true;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(connection, preparedStatement,null);
        }
        return false;
    }

    // 依据id查找用户
    public User findById(int userid) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "SELECT * FROM user WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, userid);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                user.setEmail(resultSet.getString("email"));
                //请注意:getDate()方法返回的类型为java.sql.Date
                user.setBirthday(resultSet.getDate("birthday"));
                return user;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(connection, preparedStatement,resultSet);
        }
        return null;
    }
}

TestJDBC01中的测试代码如下:

package com.cn.test;

import com.cn.bean.User;
import com.cn.dao.UserDao;
import java.sql.Date;
import java.util.ArrayList;

/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class TestJDBC01 {
    public static void main(String[] args) {
        testFindAll();
    }

    // 查找所有用户
    public static void testFindAll() {
        UserDao userDao = new UserDao();
        ArrayList<User> userList = userDao.findAll();
        for (User u : userList) {
            System.out.println(u);
        }
    }

    // 利用工具类查找所有用户
    public static void testFindAllByUtils(){
        UserDao userDao=new UserDao();
        ArrayList<User> userList = userDao.findAllByUtils();
        for(User u:userList){
            System.out.println(u);
        }
    }

    // 增加用户
    public static void testInsert(){
        UserDao userDao=new UserDao();
        User user=new User();
        user.setUsername("koko");
        user.setPassword("666666");
        user.setEmail("koko@sina.com");
        //请注意Date的类型为java.sql.Date
        Date birthday= Date.valueOf("1997-07-01");
        user.setBirthday(birthday);
        boolean insertResult = userDao.insert(user);
        if(insertResult){
            System.out.println("插入操作成功");
        }else{
            System.out.println("插入操作失败");
        }
    }

    // 修改用户
    public static void testUpdate(){
        UserDao userDao=new UserDao();
        User user=new User();
        user.setId(5);
        user.setUsername("koko");
        user.setPassword("777777");
        user.setEmail("koko@sina.com");
        boolean updateResult = userDao.update(user);
        if(updateResult){
            System.out.println("修改操作成功");
        }else{
            System.out.println("修改操作失败");
        }
    }

    // 依据id查询用户
    public static void testFindById(){
        UserDao userDao=new UserDao();
        User foundUser = userDao.findById(5);
        System.out.println(foundUser);
    }

    // 删除用户
    public static void testDelete(){
        UserDao userDao=new UserDao();
        boolean deleteResult = userDao.delete(5);
        if(deleteResult){
            System.out.println("删除操作成功");
        }else{
            System.out.println("删除操作失败");
        }
    }

}

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

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

相关文章

fabric.js 组件 图片上传裁剪并进行自定义区域标记

目录 0. 前言 1. 安装fabric与引入 2. fabric组件的使用 3. 属性相关设置 4. 初始化加载 4. 方法 5. 全代码 0. 前言 利用fabric组件&#xff0c;实现图片上传、图片”裁剪“、自定义的区域标记一系列操作 先放一张效果图吧&#x1f447; 1. 安装fabric与引入 npm i …

Pytorch从零开始实战17

Pytorch从零开始实战——生成对抗网络入门 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成对抗网络入门环境准备模型定义开始训练总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch1.8cpu&#xf…

【MIdjourney】一些材质相关的关键词

1.多维剪纸(Multidimensional papercut) "Multidimensional papercut"&#xff08;多维剪纸&#xff09;是一种剪纸艺术形式&#xff0c;通过多层次的剪纸技巧和设计来创造出立体感和深度感。这种艺术形式通常涉及在不同的纸层上剪裁不同的图案&#xff0c;并将它们…

Node.js基础知识点(四)

本节介绍一下最简单的http服务 一.http 可以使用Node 非常轻松的构建一个web服务器&#xff0c;在 Node 中专门提供了一个核心模块&#xff1a;http http 这个模块的就可以帮你创建编写服务器。 1. 加载 http 核心模块 var http require(http) 2. 使用 http.createServe…

Java学习(二十一)--JDBC/数据库连接池

为什么需要 传统JDBC数据库连接&#xff0c;使用DriverManager来获取&#xff1b; 每次向数据库建立连接时都要将Connection加载到内存中&#xff0c;再验证IP地址、用户名和密码&#xff08;0.05s~1s)时间。 需要数据库连接时候&#xff0c;就向数据库要求一个&#xf…

卷积神经网络简介-AI快速进阶系列

1. 概述 在本教程中&#xff0c;我们将研究卷积神经网络背后的理论及其架构。 我们将首先讨论通常使用卷积神经网络 &#xff08;CNN&#xff09; 执行的任务和特征提取问题。然后&#xff0c;我们将讨论为什么需要CNN&#xff0c;以及为什么传统的前馈神经网络是不够的。 然…

Redis实战之-分布式锁

一、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行…

20230117-yolov5训练环境搭建

文章目录 1.参考资料2.服务器环境3.安装过程4.问题与解决5.补充6.其它技巧 1.参考资料 https://blog.csdn.net/qq_43573527/article/details/132963466 long错误解决方案 https://pytorch.org/get-started/previous-versions/ pytorch下载的位置 2.服务器环境 conda环境&…

RabbitMQ入门精讲

1. 什么是消息队列 消息指的是两个应用间传递的数据。数据的类型有很多种形式&#xff0c;可能只包含文本字符串&#xff0c;也可能包含嵌入对象。 “消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中&#xff0c;通常有生产者和消费者两个角色。…

NAT实验

一&#xff1a;实验要求 二&#xff1a;实验分析 拓扑图 三&#xff1a;实验配置 1&#xff1a;路由器配置 R1配置IP R2配置IP 2&#xff1a;缺省路由 查看路由表 3&#xff1a;端口映射 4&#xff1a;pc、HTTP配置 5:DNS、client配置 四&#xff1a;实验结果 pc可以ping…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-5 select

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>select</title> </head><body> <!--单选下拉菜单可设置默认选中项--> 所在城市&#xff08;单选&#xff09;:<br> <select>…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

第十一章 请求响应

第十一章 请求响应 1.概述2.请求-postman工具3.请求-简单参数&实体参数4.请求-数组集合参数5.请求-日期参数&JSON参数6.请求-路径参数7.响应-ResponseBody&统一响应结果8.响应-案例 1.概述 将前端发送的请求封装为HttpServletRequest对象 在通过HttpServletRespo…

JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、Java虚拟机栈 1.栈帧的组成 2.局部变量表 3.操作数栈 4.帧数据 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理…

深入解析 Java 方法引用:Lambda 表达式的进化之路

前言 方法引用是 Java 8 提供的一种新特性&#xff0c;它允许我们更简洁地传递现有方法作为参数。这项特性实际上是对 Lambda 表达式的一种补充&#xff0c;通过方法引用&#xff0c;我们可以直接引用现有方法&#xff0c;而无需编写完整的Lambda表达式。最近在使用方法引用的…

ElasticSearch扫盲概念篇[ES系列] - 第500篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…

每日一题——LeetCode1252.奇数值单元格的数目

进阶&#xff1a;你可以设计一个时间复杂度为 O(n m indices.length) 且仅用 O(n m) 额外空间的算法来解决此问题吗&#xff1f; 方法一 直接模拟&#xff1a; 创建一个n x m的矩阵&#xff0c;初始化所有元素为0&#xff0c;对于indices中的每一对[ri,ci]&#xff0c;将矩…

5W紫外激光打标机优势特点

紫外激光打标机在当今市场上备受关注&#xff0c;而5W紫外激光打标机更是其中的佼佼者。作为一种高精度、高效率的激光加工设备&#xff0c;5W紫外激光打标机在各个领域都有着广泛的应用。 首先&#xff0c;让我们来了解一下5W紫外激光打标机的基本原理。紫外激光打标机利用高能…

Springboot日志框架logback与log4j2

目录 Springboot日志使用 Logback日志 日志格式 自定义日志格式 日志文件输出 Springboot启用log4j2日志框架 Springboot日志使用 Springboot底层是使用slf4jlogback的方式进行日志记录 Logback日志 trace&#xff1a;级别最低 debug&#xff1a;调试级别的&#xff0c…

Google play 应用批量下架的可能原因及应对指南

想必大多数上架马甲包或矩阵式上架的开发者们&#xff0c;都遭遇过应用包批量被下架、账号被封的情况。这很令人苦恼&#xff0c;那造成这种情况的可能原因有哪些呢&#xff1f;以及如何降低这种情况发生&#xff1f; 1、代码问题 通常上架成功后被下架的应用&#xff0c;很可…