Java的Mysql使用

Java的Mysql使用

说明

通过Java的方式连接Mysql中的数据库,并对数据库中的数据进行增加 查询操作

​ 使用Mysql所提供的第三方库中的类(Mysql的API) 对其进行操作

​ 将Mysql Jar包添加到lib目录后,就可以使用其中的类对其Mysql数据库进行操作

Mysql Jar包的获取以及配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后jar包添加到库即可

使用步骤

​ Mysql Jar包中提供了很多类,如何去使用?

​ SUN公司将JDBC协议作为一个规范,提供给开发者, 规范的使用套路是什么?

​ ① 加载驱动 Driver 类

​ 原因: JDBC可以连接很多数据库,那么就需要告诉jdbc当前连接的是哪一个数据库,所以需要提供Driver类

​ ② 创建连接对象 给定 URL、用户名、密码 等信息

​ ③ 通过连接对象获取操作对象

​ ④ 通过数据库操作对象,执行SQL语句获取执行结果

​ ⑤ 如果是查询语句,那么需要对执行结果进行遍历操作

​ ⑥ 将所有的连接及对象进行关闭操作

实例

package com.test.demo23;

import com.mysql.jdbc.Driver;

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

public class Demo14Mysql {
    public static void main(String[] args) throws SQLException {
        //  ① 加载驱动 Driver 类
         /*
            Interface Driver
                每个驱动程序类必须实现的接口 -> Mysql来说也实现该接口
                public class Driver extends NonRegisteringDriver implements java.sql.Driver {
            加载管理驱动
                DriverManager 用于管理一组JDBC驱动程序的基本服务
                可以通过
                DriverManager.registerDriver 注册当前需要连接的Mysql驱动
          */
        DriverManager.registerDriver(new Driver());
        /*
             ② 创建连接对象 给定 URL、用户名、密码 等信息
             DriverManager 中提供了静态方法 getConnection 获取Mysql连接
             getConnection(String url, String user, String password)
             url:
                mysql的连接路径
                IP安装mysql地址,有虚拟机看虚拟机IP
                格式: jdbc:数据库类型://IP:port/数据库?设置参数1&设置参数1
                jdbc:mysql://192.168.136.100:3306/stu
         */
        Connection connection= DriverManager.getConnection("jdbc:mysql://192.168.118.100:3306/demo1?useSSL=false","root","123456");
         /*
            ③ 通过连接对象获取操作对象
            createStatement()
                创建一个 Statement对象,用于将SQL语句发送到数据库。
         */
        Statement statement = connection.createStatement();
         /*
            ④ 通过数据库操作对象,执行SQL语句获取执行结果
         */
        String sql = "INSERT INTO Course (Cid,Cname,Tid) VALUES (04,'物理',04)";

        statement.executeUpdate(sql);

        /*
            ⑥ 将所有的连接及对象进行关闭操作
         */
        statement.close();
        connection.close();

    }
}

package com.test.demo23;

import com.mysql.jdbc.Driver;

import java.sql.*;

public class Demo14Mysql {
    public static void main(String[] args) throws SQLException {
        //  ① 加载驱动 Driver 类
         /*
            Interface Driver
                每个驱动程序类必须实现的接口 -> Mysql来说也实现该接口
                public class Driver extends NonRegisteringDriver implements java.sql.Driver {
            加载管理驱动
                DriverManager 用于管理一组JDBC驱动程序的基本服务
                可以通过
                DriverManager.registerDriver 注册当前需要连接的Mysql驱动
          */
        DriverManager.registerDriver(new Driver());
        /*
             ② 创建连接对象 给定 URL、用户名、密码 等信息
             DriverManager 中提供了静态方法 getConnection 获取Mysql连接
             getConnection(String url, String user, String password)
             url:
                mysql的连接路径
                IP安装mysql地址,有虚拟机看虚拟机IP
                格式: jdbc:数据库类型://IP:port/数据库?设置参数1&设置参数1
                jdbc:mysql://192.168.136.100:3306/stu
         */
        Connection connection= DriverManager.getConnection("jdbc:mysql://192.168.118.100:3306/demo1?useSSL=false","root","123456");
         /*
            ③ 通过连接对象获取操作对象
            createStatement()
                创建一个 Statement对象,用于将SQL语句发送到数据库。
         */
        Statement statement = connection.createStatement();
         /*
            ④ 通过数据库操作对象,执行SQL语句获取执行结果
         */
        String sql = "select * from Course ";

        ResultSet resultSet = statement.executeQuery(sql);
        while(resultSet.next()){
            System.out.println(resultSet.getInt("Cid")
                    + resultSet.getString("Cname") + resultSet.getInt("Tid"));
        }

        /*
            ⑥ 将所有的连接及对象进行关闭操作
         */
        statement.close();
        connection.close();

    }
}

结果:

1语文2
2数学1
3英语3
4物理4

数据库样式

在这里插入图片描述

JDBC中重要的接口和类

DriverManager类(驱动管理类)里面全是静态方法,我们用它来注册驱动:

DriverManager 类中的静态方法说明
static void registerDriver(Driver driver)向 DriverManager 注册驱动程序
static Connection getConnection(String url, String user, String password)建立到给定数据库 URL 的连接

Statement接口(执行sql)用于执行静态 SQL 语句并返回它所生成结果的对象:

statement中的方法说明
int executeUpdate(String sql)执行更新语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,返回值是“影响数据库中的记录条数”
ResultSet executeQuery(String sql)执行 SQL查询语句,该语句返回单个 ResultSet 对象


ResultSet接口(查询结果集),sql查询语句后可以将结果封装到ResultSet中:

ResultSet中的方法说明
boolean next()将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推(用来查询结果)
String getString(int columnIndex)不管数据库中的数据类型是什么,都以String的形式取出(columnIndex是指取列数,第一列,第二列…)
String getString(String columnLabel)不管数据库中的数据类型是什么,都以String的形式取出( columnLabel指查询语句中的列名)

反射机制注册驱动(最常用的注册驱动方法)
加载和注册数据库驱动,数据库驱动由 mysql 厂商 "com.mysql.jdbc.Driver"提供

public static void main(String[] args) {
        try {
            //1、注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","root");
            System.out.println(conn);
            
        } catch (SQLException e) {
           e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

基础操作

示例1:插入操作

import java.sql.*;

public class JDBCTest01 {
    public static void main(String[] args) {

        Connection conn = null;
        Statement stmt = null;
        try {
            //1、注册驱动的第二种方法,告诉java我要连接mysql
            Driver driver = new com.mysql.jdbc.Driver();
            DriverManager.registerDriver(driver);
            //2、获取连接,告诉java我要连接哪台机器的mysql,并写入用户和密码
            //127.0.0.1和localhost都是本地ip地址
            String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
            String user = "root";
            String password = "root";
            conn = DriverManager.getConnection(url,user,password);
            System.out.println(conn);

            //3、获取数据库操作对象(statement专门执行sql语句)
            stmt = conn.createStatement();

            //4、执行sql
            String sql = "insert into dept(deptno,dname,loc) values(50,'军部','长安');";
            //专门执行DML语句(insert、delete、update)
            //返回值是“影响数据库中的记录条数”
            int a = stmt.executeUpdate(sql);
            System.out.println(a);
            System.out.println(a == 1 ? "保存成功":"保存失败");

            //5、处理查询结果集
			//插入语句,暂时不需要查询

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //6、释放资源
            //为了保证资源一定释放,在finally语句块中关闭资源
            //分别要遵循从小到大依次关闭
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }
}

示例2:删除操作

import java.sql.*;

public class JDBCTest02 {
    public static void main(String[] args) {

        Connection conn = null;
        Statement stmt = null;
        try {
            //1、注册驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //2、获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","root");
            //3、获取数据库操作对象
            stmt = conn.createStatement();
            //4、执行sql语句
            String sql = "delete from dept where deptno = 50;";
            int count = stmt.executeUpdate(sql);
            System.out.println(count == 1 ? "删除成功":"删除失败");

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

示例3:从资源文件中读取连接数据库信息

将连接数据库的所有信息配置到配置文件jdbc.properties中:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false
user=root
password=root

/*
    JDBC工具类
 */
public class JDBCUtils {
    //1.私有构造方法
    private JDBCUtils(){};

    //2.声明配置信息变量
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;
    private static Connection conn;

    //3.静态代码块中实现加载配置文件和注册驱动
    static{
        try{
            //通过类加载器返回配置文件的字节流
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("config.properties");

            //创建Properties集合,加载流对象的信息
            Properties prop = new Properties();
            prop.load(is);

            //获取信息为变量赋值
            driverClass = prop.getProperty("driverClass");
            url = prop.getProperty("url");
            username = prop.getProperty("username");
            password = prop.getProperty("password");

            //注册驱动
            Class.forName(driverClass);

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

    //4.获取数据库连接的方法
    public static Connection getConnection() {
        try {
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;
    }

    //5.释放资源的方法
    public static void close(Connection conn, Statement stat, ResultSet rs) {
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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

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

    public static void close(Connection conn, Statement stat) {
        close(conn,stat,null);
    }
}

实际开发中不建议把来连接数据库的信息写死到java程序中,因为用户可能不会把数据库的密码给你。

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

public class JDBCTest04 {
	public static void main(String[] args) {

		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
		String driver = bundle.getString("driver");
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");

		Connection conn = null;
		Statement stmt = null;
		try {
			Class.forName(driver);

			conn = DriverManager.getConnection(url,user,password);

			stmt = conn.createStatement();

			int count = stmt.executeUpdate("insert into dept(deptno,dname,loc) values(50,'人事部','北京');");

			System.out.println(count == 1? "保存成功":"保存失败");

		} catch(SQLException e){
			e.printStackTrace();
		} catch(ClassNotFoundException e) {
			e.printStackTrace();	
		} finally {
			if(conn != null) {
				try {
					conn.close();
				} catch(SQLException e){
					e.printStackTrace();
				}
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch(SQLException e){
					e.printStackTrace();
				}
			}
		}
	}
}

示例4:处理查询结果集(遍历查询结果)

ResultSet接口中的next()方法是用于遍历结果集的方法。它将指针从当前行移动到下一行,并检查是否有更多的数据可用。该方法返回一个布尔值,表示是否成功移动到下一行。

以下是关于next()方法的一些重要信息:

  • next()方法返回一个布尔值。如果存在下一行,则返回true;否则,返回false
  • 第一次调用next()方法时,将指针移到结果集的第一行(如果有)。
  • 每次调用next()方法后,指针将根据结果集中的数据移动到下一行。
  • 如果next()方法返回true,你可以使用其他方法(如getInt()getString()等)来获取当前行的列值。
  • 如果next()方法返回false,表示已经到达结果集的末尾,没有更多的数据可用。

以下是一个示例代码片段,演示了如何使用next()方法遍历结果集:

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

public class ResultSetExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/database_name";
        String username = "your_username";
        String password = "your_password";

        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM table_name");

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");

                // 处理当前行的数据
                System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
            }

            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

释放资源时先释放查询结果集,再释放数据库操作对象,最后释放数据库连接对象。

sql注入现象

1、用户登录程序
在数据库中先建一个用户表:

create table t_user
(
   id                   bigint auto_increment,
   loginName            varchar(255),
   loginPwd             varchar(255),
   realName             varchar(255),
   primary key (id)
);

insert into t_user(loginName,loginPwd,realName) values('zhangsan','123','张三');
insert into t_user(loginName,loginPwd,realName) values('jack','123','杰克');
commit;
select * from t_user;

在这里插入图片描述

编写一个java程序,当输入的账户和密码与表中的数据一致时,显示“登录成功”,否则“登录失败”。

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

//模拟用户登录成功功能的实现
public class JDBCTest06 {
    public static void main(String[] args) {

        Map<String,String> userLoginInfo = initUI();
        System.out.println(login(userLoginInfo) ? "登录成功" : "登录失败");
    }

	//传入一个map集合,并拿它与数据进行对比,如果账户密码合法就返回“true”,否则返回“false”
    private static boolean login(Map<String, String> userLoginInfo) {
        boolean flag = false;
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1、注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","root");
            //3、获取数据库操作对象
            stmt = conn.createStatement();
            //4、执行sql语句
            //String sql = "select .* from t_user where userName = '" + userLoginInfo.get("userName") + "' and userPassword = '" + userLoginInfo.get("' userPassword;");
            String sql = "select * from t_user where loginName = '"+ userLoginInfo.get("userName")+ "' and loginPwd = '" + userLoginInfo.get("userPassword")+ "'";
            rs = stmt.executeQuery(sql);
            flag = rs.next();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return flag;
    }
	
	//输入函数,用户在此函数中输入自己的账户和密码,并存入map集合中去与数据库中的数据进行比较
    private static Map<String,String> initUI() {
        Scanner s = new Scanner(System.in);

        System.out.printf("请输入账号: ");
        String userName = s.nextLine();
        System.out.printf("请输入密码: ");
        String userPassword = s.nextLine();

        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("userName",userName);
        userLoginInfo.put("userPassword",userPassword);

        return userLoginInfo;
    }
}

执行结果:

2、演示sql注入现象

在这里插入图片描述当我输入以下账户和密码时,它也显示登录成功!!

在这里插入图片描述

这种现象称为sql注入(黑客经常使用),这是一个安全隐患。

为什么会出现sql注入现象?
用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程。导致sql语句的原意被扭曲,进而达到sql注入。
因为我们上面的sql语句被写成了 select * from t_user where loginName = ‘lll’ and loginPwd = ‘lll’ or ‘1’ = ‘1’; 这个1=1是恒成立的。

3、解决sql注入
思想:不让用户的输入信息参加编译。 要解决 SQL 注入就不能让用户输入的密码和我们的 SQL 语句进行简单的字符串拼接。

方法:使用PreparedStatement接口
(1)prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
(2)安全性更高,没有 SQL 注入的隐患。

操作请看注释,解释代码:

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

public class JDBCTest07 {
    public static void main(String[] args) {
        // 初始化界面
        Map<String,String> userLoginInfo = initUI();
        // 验证用户名和密码
        boolean loginSuccess = login(userLoginInfo);
        // 输出最后结果
        System.out.println(loginSuccess ? "登录成功" : "登录失败");
    }

    /**
     * 用户登录
     * @param userLoginInfo 用户登录信息
     * @return true表示登录成功,false表示登录失败
     */
    private static boolean login(Map<String, String> userLoginInfo) {
        boolean loginSuccess = false;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 1、注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2、获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false","root","root");
            // 3、获取预编译的数据库操作对象
            // sql语句的框架中,一个?,表示一个占位符,一个?将来接收一个值。注意:?不要用单引号括起来
            String sql = "select * from t_user where loginName = ? and loginPwd = ?";
            // 程序执行到此处,会发送sql语句框架给DBMS,DBMS对sql语句框架进行预编译。
            ps = conn.prepareStatement(sql);
            // 给占位符?传值,第一个?的下标是1,第二个?的下标是2(JDBC中下标都从1开始)
            ps.setString(1,userLoginInfo.get("userName"));
            ps.setString(2,userLoginInfo.get("userPassword"));
            // 4、执行sql语句
            rs = ps.executeQuery();
            // 5、处理结果集
            if(rs.next()) {
                loginSuccess = true;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6、释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
        return loginSuccess;
    }


    /**
     * 初试化界面
     * @return 用户输入的用户名和密码等登录信息
     */
    private static Map<String, String> initUI() {
        Scanner s = new Scanner(System.in);

        System.out.print("请输入用户:");
        String userName = s.nextLine();
        System.out.print("请输入密码:");
        String userPassword = s.nextLine();

        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("userName",userName);
        userLoginInfo.put("userPassword",userPassword);

        return userLoginInfo;
    }
}

三、JDBC事务
把注册驱动和获取连接封装到一个工具类中,以后就不用次次写代码都写那么多了:

import java.sql.*;

/*
    JDBC工具类,简化JDBC编程
*/
public class DBUtil {
/**
 * 工具类中的构造方法是私有的
 * 因为工具类中的方法都是静态的,直接通过类名去调即可。
 */
private DBUtil(){}

/**
 * 静态代码块,类加载的时候执行
 * 把注册驱动程序的代码放在静态代码块中,避免多次获取连接对象时重复调用
 */
static {
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase?useSSL=false","root","root");
}

public static void close(Connection conn, Statement ps, ResultSet rs){
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
}

在java中执行sql事务:

package ustc.java.jdbc;
import ustc.java.jdbc.DBUtil.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/*
    行级锁/悲观锁
 */
public class JDBCTest14 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;    
    try {
        conn = DBUtil.getConnection();
        // 开启事务
        conn.setAutoCommit(false);

        ps = conn.prepareStatement("select ename,job,sal from emp where job = ? for update ");
        ps.setString(1,"MANAGER");

        rs = ps.executeQuery();

        while(rs.next()) {
            System.out.println(rs.getString("ename") + "," + rs.getString("job") + "," + rs.getString("sal"));
        }
        // 提交事务(事务结束)
        conn.commit();
    } catch (SQLException throwables) {
        // 回滚事务(事务结束)
        try {
            conn.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    } finally {
   	    DBUtil.close(conn,ps,rs);
    	}
	}
}

try {
conn = DBUtil.getConnection();
// 开启事务
conn.setAutoCommit(false);

        ps = conn.prepareStatement("select ename,job,sal from emp where job = ? for update ");
        ps.setString(1,"MANAGER");

        rs = ps.executeQuery();

        while(rs.next()) {
            System.out.println(rs.getString("ename") + "," + rs.getString("job") + "," + rs.getString("sal"));
        }
        // 提交事务(事务结束)
        conn.commit();
    } catch (SQLException throwables) {
        // 回滚事务(事务结束)
        try {
            conn.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    } finally {
   	    DBUtil.close(conn,ps,rs);
    	}
	}
}

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

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

相关文章

语义分割:从早期探索到深度学习的突破

语义分割&#xff1a;从早期探索到深度学习的突破 语义分割的端倪&#xff1a;从早期探索到深度学习的突破引言早期技术&#xff1a;图像处理与模式识别边缘检测区域生长图割(Graph Cut)聚类方法 深度学习的兴起&#xff1a;CNN革命2012年 AlexNet的突破全卷积网络&#xff08;…

网络编程之ip地址

目录 1、概念&#xff1a; 2、所属的tcp/ip协议的层 3、IP地址查询 &#xff08;1&#xff09;Linux &#xff08;2&#xff09;windows 4、IP地址结构组成及分类 &#xff08;1&#xff09;组成&#xff08;网络位主机位&#xff09; &#xff08;2&#xff09;分类 1、…

文心一言 VS 讯飞星火 VS chatgpt (192)-- 算法导论14.2 2题

二、用go语言&#xff0c;能否在不影响红黑树任何操作的渐近性能的前提下&#xff0c;将结点的黑高作为树中结点的一个属性来维护&#xff1f;说明如何做&#xff0c;如果不能&#xff0c;请说明理由。如何维护结点的深度&#xff1f; 文心一言&#xff1a; 在Go语言中&#…

Oracle闪回日志管理(flashbackup log)

Oracle闪回日志管理&#xff08;flashbackup log&#xff09; 1.开启闪回日志 shutdown immediate startup mount; alter database archivelog; alter database flashback on; alter database open; 2、查看闪回日志保留期限 show parameter flash 默认是1440分钟&#xff0c…

宋仕强论道之华强北蓝牙耳机(三十七)

华强北最近几年最火爆的产品就是TWS蓝牙耳机了&#xff0c;蓝牙耳机是指通过蓝牙无线技术连接智能手机等设备&#xff0c;实现无线通讯的一种设备。因为苹果蓝牙应用技术的突破&#xff0c;而呈现爆发之势&#xff0c;目前蓝牙耳机的市场存量是非常之大&#xff0c;全世界智能手…

gitlab ci cd 不完全指南

gitlab 可能大家很常用&#xff0c;CI、CD 也应该早有耳闻&#xff0c;但是可能还没有去真正地了解过&#xff0c;这篇文章就是我对 gitlab CI、CD 的一些理解&#xff0c;以及踩过的一些坑&#xff0c;希望能帮助到大家。 什么是 CI、CD CI&#xff08;Continuous Integrati…

【计算机毕业设计】063德云社票务系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

情人节最全送礼指南!实用性强礼物推荐

眼看七夕节就要到了&#xff0c;如果还没有想到要送什么礼物给对象的&#xff0c;抓紧来看小编总结的这几款实用性比较强的礼物&#xff0c;送礼一下子就送到了心坎上了&#xff0c;少整点一些花里胡哨的礼物&#xff0c;多送点实用性比较强的&#xff01;下面给大家整理了一份…

FW如何区别 PAW3212DB-TJDT 和 PAW3220DB-TJDL/TJDR/TJDS

PAW3212DB-TJDT 和 PAW3220DB-TJDL/TJDR/TJDS 的引脚功能定义是一样的&#xff0c;只是封装有一点不一样。PAW3212DB-TJDT是圆形火山口&#xff0c;配的是圆孔透镜&#xff0c;PAW3220DB-TJDL/TJDR/TJDS是方形火山口&#xff0c;配的是方孔透镜。 PAW3212DB-TJDT 和 PAW3220DB-…

Gaussian_Splatting 项目脚本指令

准备好一个稀疏重建的目录&#xff08;如Colmap的sparse文件&#xff09;&#xff0c;高斯泼溅需要稀疏重建的点云结果来作为输入&#xff0c;进行进一步训练和渲染。 可以参考&#xff1a;gaussian-splatting原理 有一点需要注意&#xff1a;Gaussian_Splatting 需要稀疏重建…

Flask框架开发学习笔记《5》简易服务器代码

Flask框架开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后写清楚每个地址…

深度揭秘:代理IP的工作原理及其在网络安全中的关键角色

代理IP的工作原理及其在网络安全中的关键角色是一个相对复杂但非常重要的主题。以下是对这一内容的深度揭秘&#xff1a; 代理IP的工作原理 1. 请求转发 当一个客户端&#xff08;如浏览器或爬虫程序&#xff09;使用代理IP时&#xff0c;它不是直接与目标网站通信&#xff0c…

SpringBoot使用Rabbit详解含完整代码

1. 摘要 本文将详细介绍如何在Spring Boot应用程序中集成和使用RabbitMQ消息队列。RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;用于通过轻量级和可靠的消息在应用程序或系统之间进行异步通信。本文将通过步骤说明、代码示例和详细注释&#xff0c;指导读者在Spring…

有趣的css - 动态的毛玻璃背景

页面效果 此效果主要使用 backdrop-filter 属性&#xff0c;以及配合 animation 属性来实现毛玻璃模糊和一些动效。 此效果可适用于登录窗口&#xff0c;网站背景或者一些卡片列表中&#xff0c;使网页更具科技感和空间感。 核心代码部分&#xff0c;简要说明了写法思路&#x…

四大组件 - ContentProvider

参考&#xff1a;Android 这 13 道 ContentProvider 面试题&#xff0c;你都会了吗&#xff1f; 参考&#xff1a;《Android 开发艺术探索》 第 9.5 节&#xff08;ContentProvider 的工作过程&#xff09; 参考&#xff1a;内容提供者程序 参考&#xff1a;<provider>&g…

Maya------显示隐藏提取复制刺破面

alth<--->ctrlshifth 补洞后刺破面&#xff0c;防止多边面的产生&#xff01;

数据探索与可视化:可视化分析数据关系-中

目录 一、前言 二、介绍 Ⅰ.一个分类变量和一个连续变量 Ⅱ.两个分类变量的一个连续变量 Ⅲ.两个分类变量和两个连续变量 Ⅳ.一个分类变量和多个连续变量 ①.平行坐标轴 ②.矩阵散点图 三、结语 一、前言 在做数据分析的时候&#xff0c;很少会遇到连续变量和分类变量…

(每日持续更新)jdk api之NotActiveException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

重写Sylar基于协程的服务器(2、配置模块的设计)

重写Sylar基于协程的服务器&#xff08;2、配置模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

idea搭建spring5.3.x源码环境

1.写在前面的话 碰到了不少想阅读或者学习spring源码的同学&#xff0c;但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支&#xff0c;来具体演示一下搭建过程。 2. 下载源码 下载源码这一步&#xff0c;说实话&#xff0c;由于某些原…