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


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址: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.mfbz.cn/a/332200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么样的布局是符合可制造性的PCB布局?

满足可制造性、可装配性、可维修性要求&#xff0c;方便调试的时候于检测和返修&#xff0c;能够方便的拆卸器件&#xff1a; 1&#xff09;极性器件的方向不要超过2种&#xff0c;最好都进行统一方向等要求&#xff0c;如图1-1所示&#xff1b; 图1-1 极性器件方向统一摆放 2…

CVE重要通用漏洞复现java php

在进行漏洞复现之前我们需要在linux虚拟机上进行docker的安装 我不喜欢win上安因为不知道为什么总是和我的vmware冲突 然后我的kali内核版本太低 我需要重新安装一个新的linux 并且配置网络 我相信这会话费我不少时间 查看版本 uname -a 需要5.5或以上的版本 看错了浪…

免费开源线上信息技术电子云书屋

1 概述 知命耳顺之际&#xff0c;时逢甲辰龙年到来&#xff0c;汇集半生研发积累和教育培训沉淀&#xff0c;以分布微服软件框架为基础&#xff0c;特别推出“线上电子云书屋”&#xff0c;陆续呈现编著的十余部信息技术教材和一些典型的软件架构平台&#xff0c;供给免费开源…

JVM-透彻理解字节码以及指令

一、字节码与指令概述 package ch13_bytecode;public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }生成字节码&#xff1a; cafe babe 0000 0031 0022 0a00 0600 1409 0015 0016 0800 170a 0018 0019 0700 1a…

Docker(二)安装指南

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南&#xff0c;这里主要介绍 Docker 在…

css-动画效果学习示例

阴影 x-轴 y-轴 模糊度 颜色 (正负值可以表示角度问题) 可以加多个阴影 内置阴影 transition 可以添加动画延迟效果 向z轴缩进&#xff0c;开启透视respective 触发旋转效果 学习来源 &#xff1a;动画属性_哔哩哔哩_bilibili

应用Dockerfile编写及部署使用

dockerfile内容规范&#xff1a; FROM mycentos-jdk:latest # 基础镜像 MAINTAINER # 镜像作者信息 姓名邮箱 RUN # 镜像构建的时候运行的命令 ADD # copy内容到容器&#xff08;压缩包&#xff0c;自动解压&#xff09; COPY # 类似…

C++:类与结构体的对比

2024年1月18日 内容来自The Cherno:C系列 -------------------------------------------------------------------------------------------------------------------------------- C中关于class与struct&#xff0c;几乎没有区别&#xff0c;只有一个关于“可见度”的区别…

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)

<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…

【React】组件生命周期、组件通信、setState

文章目录 React的组件化类组件render函数的返回值函数组件 认识生命周期生命周期解析生命周期函数不常用生命周期函数 认识组件间的通信父组件传递子组件 - 类组件和函数组件参数propTypes子组件传递父组件 React中的插槽&#xff08;slot&#xff09;children实现插槽props实现…

three.js 缓动算法.easing(渐入相机动画)

效果&#xff1a;淡入&#xff0c;靠近物体 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div c…

地平线旭日 X3 开发板上手体验

最近嫖到一块旭日X3开发板&#xff0c;借此熟悉地平线 AI 芯片旭日 X3 模型部署流程&#xff0c;以及算法工具链。这里基本是跟着官方的用户手册进行操作&#xff0c;其中也遇到一些奇怪的问题。 1 烧写系统 1.1 系统选择 旭日X3派开发板支持Ubuntu 20.04 Desktop、Server两…

【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现&#xff1a; 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析 代码实现&#xff1a; 一、冒泡排序 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大…

轮胎侧偏刚度线性插值方法

一、trucksim取数据 步骤一 步骤二 二、数据导入到matlab中 利用simulink的look up table模块 1是侧偏角&#xff1b;2是垂直载荷&#xff1b;输出是侧向力。 侧向力除以侧偏角就是实时的侧偏刚度。

unocss+iconify技术在vue项目中使用20000+的图标

安装依赖 npm i unocss iconify/json配置依赖 vue.config.js文件 uno.config.js文件 main.js文件 使用 <i class"i-fa:user"></i> <i class"i-fa:key"></i>class名是 i- 开头&#xff0c;跟库名:图标名&#xff0c;那都有什么库…

数据结构之dict类

dict类 dict 是字典类。什么是字典&#xff08;Dictionary&#xff09;呢&#xff1f;就是一个可以通过索引找到对象的数据类型。在Python 的dict类里&#xff0c;索引就是“键”&#xff0c;对象也叫“值”&#xff0c;二者合起来就叫“键值对”。每个“键值对”之间用逗号&a…

“深入理解 Docker 和 Nacos 的单个部署与集成部署“

目录 引言&#xff1a;Docker Nacos 单个部署1.1 什么是 Docker&#xff1f;Docker 的概念和工作原理Docker 为什么受到广泛应用和认可 1.2 什么是 Nacos&#xff1f;Nacos 的核心功能和特点Nacos 在微服务架构中的作用 1.3 Docker 单个部署 Nacos Docker Nacos 集成部署总结&a…

【从零开始学习Redis | 第七篇】利用Redis构造全局唯一ID(含其他构造方法)

目录 前言&#xff1a; 什么是全局唯一ID&#xff1f; 尝试构造全局唯一ID&#xff1a; 其他构造全局唯一ID的方法 1.基于数据库自增构造全局唯一ID&#xff1a; 2.基于UUID构造全局唯一ID&#xff1a; 3.基于雪花算法构造全局唯一ID&#xff1a; 总结&#xff1a; 前…

leetcode 013二维区域和检索---矩阵不可变

给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进…

Python数据分析案例36——基于神经网络的AQI多步预测(空气质量预测)

案例背景 不知道大家发现了没&#xff0c;现在的神经网络做时间序列的预测都是单步预测&#xff0c;即(需要使用X的t-n期到X的t-1期的数据去预测X的t期的数据)&#xff0c;这种预测只能预测一个点&#xff0c;我需要预测X的t1期的数据就没办法了&#xff0c;有的同学说可以把预…
最新文章