Explicación detallada de los conceptos básicos de jdbc (súper detallada)

Descripción general de JDBC

Debido a que el lenguaje que usamos en el desarrollo es el lenguaje Java, debemos usar el lenguaje Java para operar los datos en la base de datos.

JDBC (Java Database Connectivity) es una interfaz estándar para que el lenguaje Java acceda a bases de datos relacionales. Proporciona un conjunto de clases y métodos para acceder y manipular bases de datos.

全称 ( Java DataBase Connectivity ) Java 数据库连接

Insertar descripción de la imagen aquí

同一套java代码无法操作不同关系型数据库,我们要做到的是同一套Java代码操作不同的关系型数据库,而sun公司就指定了一套标准接口(JDBC),JDBC中定义了所有操作关系型数据库的规则

esencia JDBC

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

Prestaciones de JDBC

java代码不需要针对不同的数据库开发不同的代码
可更换底层数据库,而java代码基本不变

proceso de operación de la base de datos java

Insertar descripción de la imagen aquí

第一步:编写Java代码
第二步:Java代码将SQL发送到MySQL服务端
第三步:MySQL服务端接收到SQL语句并执行该SQL语句
第四步:将SQL语句执行的结果返回给J

operaciones básicas de jdbc

Después de crear el proyecto, recuerde importar el paquete jar del controlador y colocarlo en el directorio lib.

package com.lz.jdbc;

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

/**
 * JDBC快速入门
 */
public class JDBCDemo {
    
    

    public static void main(String[] args) throws Exception {
    
    
        //1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "select *from tb_user where id=2 ";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5. 执行sql
        ResultSet resultSet = stmt.executeQuery(sql);
        //6. 处理结果
        System.out.println(resultSet);
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

Este es solo un código simple. Para la implementación de la operación del código específico, puede ver el video de enseñanza para que sea más fácil de implementar.

Explicación detallada de la API JDBC

DriverManager (clase de gestión de conductores)

Función uno

注册驱动  获取数据库连接

El método RegisterDriver se usa para registrar el controlador.
En el caso anterior, lo usamos Class.forName("com.mysql.jdbc.Driver");para registrar el controlador.
La razón es que el método RegisterDriver () del objeto DriverManager se ha ejecutado en el bloque de código estático en la clase Driver para registrar. el controlador Luego solo necesitamos cargar la clase Driver., el bloque de código estático se ejecutará. Y Class.forName(“com.mysql.jdbc.Driver”); puede cargar la clase Driver.

MySql5之后的驱动包可以省略注册驱动的步骤

Función 2

获取数据库连接
parámetro efecto
URL ruta de conexión
usuario nombre de usuario
contraseña contraseña
descripción de la URL
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参
数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
==细节:==
如果连接的是本机mysql服务器,并且mysql服务默
认端口是3306,则url可以简写为:jdbc:mysql:///数
据库名称?参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

Conexión (objeto de conexión de base de datos)

efecto:

获取执行 SQL 的对象
管理事务

Función 1: obtener el objeto de ejecución

Normalmente ejecuta
la declaración de objeto SQL createStatement()

        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();

Ejecución de objeto SQL de SQL precompilado: prevención de la inyección de SQL (punto clave)
PreparedStatement prepareStatement(sql)

Gestión de transacciones de rol 2

Operaciones de gestión de transacciones en MySQL
开启事务 : BEGIN; 或者 START TRANSACTION;
提交事务 : COMMIT;
回滚事务 : ROLLBACK;
Método de gestión de transacciones JDBC.
package com.itheima.jdbc;

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

/**
 * JDBC API 详解:Connection
 */
public class JDBCDemo3_Connection {
    
    

    public static void main(String[] args) throws Exception {
    
    
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql1 = "update account set money = 3000 where id = 1";
        String sql2 = "update account set money = 3000 where id = 2";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        try {
    
    
            // 开启事务
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 处理结果
            System.out.println(count1);
            int i = 3/0;//模仿程序出错后将会进入catch中执行回滚事务
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            //6. 处理结果
            System.out.println(count2);

            // 提交事务
            conn.commit();
        } catch (Exception throwables) {
    
    
            // 回滚事务
            conn.rollback();
            throwables.printStackTrace();
        }
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

Declaración

Statement对象的作用就是用来执行SQL语句。而针对不同类型的
SQL语句使用的方法也不一样。
tipo de datos función efecto
En t ejecutarActualización(Cadena sql) Ejecute una instrucción SQL que no sea de consulta (generalmente una instrucción INSERT, UPDATE o DELETE) y devuelva el número de filas afectadas.
Conjunto resultante ejecutar consulta (cadena sql) Ejecute la instrucción SQL de consulta (generalmente la instrucción SELECT) y obtenga el conjunto de resultados devuelto. Devuelve un objeto ResultSet a través del cual se puede acceder y manipular los resultados de la consulta.

ResultSet (objeto de conjunto de resultados)

ResultSet (objeto de conjunto de resultados)

=封装了SQL查询语句的结果

Ese es el tipo devuelto por la función ejecutarQuery(String sql), si necesitamos obtener los datos que queremos del objeto ResultSet. El objeto ResultSet proporciona métodos para manipular los datos de los resultados de la consulta.

Métodos para manipular datos de resultados de consultas.

boolean next()
将光标从当前位置向下一行移动一行
判断当前行是否为有效行
方法返回值说明:
true : 有效行,当前行有数据
false : 无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx : 数据类型;如: int getInt(参数) ;String getString(参
数)
参数
int类型的参数:列的编号,从1开始
String类型的参数: 列的名称

Insertar descripción de la imagen aquí

一开始光标指定于第一行前,如图表头行。
当我们调用了 next() 方法后,光标就下移到第一行数据,并且方法返回true,
此时就可以通过 getInt("id") 获取当前行id字段的值,
也可以通过 getString("name") 获取当前行name字段的值。
如果想获取下一行的数据,继续调用 next() 方法,以此类推

Código

/**
  * 执行DQL
  * @throws Exception
  */
@Test
public void testResultSet() throws  Exception {
    
    
    //1. 注册驱动
    //Class.forName("com.mysql.jdbc.Driver");
    //2. 获取连接:如果连接的是本机mysql并且端口是默认的
3306 可以简化书写
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "1234";
    Connection conn =
DriverManager.getConnection(url, username,
password);
    //3. 定义sql
    String sql = "select * from account";
    //4. 获取statement对象
    Statement stmt = conn.createStatement();
    //5. 执行sql
    ResultSet rs = stmt.executeQuery(sql);
    //6. 处理结果, 遍历rs中的所有数据
    /* // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //6.2 获取数据 getXxx()
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);
            System.out.println(id);
            System.out.println(name);
            System.out.println(money);
            System.out.println("--------------");

        }*/
    // 6.1 光标向下移动一行,并且判断当前行是否有数据
    while (rs.next()){
    
    
        //6.2 获取数据 getXxx()
        int id = rs.getInt("id");
        String name = rs.getString("name");
        double money = rs.getDouble("money");
        System.out.println(id);
        System.out.println(name);
        System.out.println(money);
        System.out.println("--------------");
   }
    //7. 释放资源
    rs.close();
    stmt.close();
    conn.close();
}

Declaración preparada

efecto

预编译SQL语句并执行:预防SQL注入问题

inyección SQL

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达
到执行代码对服务器进行攻击的方法。

No existe ningún programa para evitar la inyección de SQL. Cuando ingresamos la contraseña como ' o '1' ='1, mostrará que la contraseña es correcta. ¿Por qué
sucede esto? Veamos la declaración SQL después del empalme de cadenas.

select * from tb_user where username = 'sjdljfld'
and password = ''or '1' = '1

No importa si nombre de usuario = 'sjdljfld' y contraseña = '' se cumplen o no, el '1' = '1' después de o siempre se cumple. La condición final se establece y puede iniciar sesión normalmente.

Descripción general de la declaración preparada

efecto

PreparedStatement作用:
预编译SQL语句并执行:预防SQL注入问题

Obtener el objeto PreparedStatement

// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username =
? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt =
conn.prepareStatement(sql);

Establecer el valor del parámetro

上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置
这些 ? 的值。
PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋
值
Xxx:数据类型 ; 如 setInt (参数1,参数2)
参数:
参数1: ?的位置编号,从1 开始
参数2: ?的值

Mejorado usando PreparedStatement

@Test
public void testPreparedStatement() throws
Exception {
    
    
    //2. 获取连接:如果连接的是本机mysql并且端口是默认的
3306 可以简化书写
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "1234";
    Connection conn =
DriverManager.getConnection(url, username,
password);
    // 接收用户输入 用户名和密码
    String name = "zhangsan";
    String pwd = "' or '1' = '1";
    // 定义sql
    String sql = "select * from tb_user where
username = ? and password = ?";
    // 获取pstmt对象
    PreparedStatement pstmt =
conn.prepareStatement(sql);
    // 设置?的值
    pstmt.setString(1,name);
    pstmt.setString(2,pwd);
    // 执行sql
    ResultSet rs = pstmt.executeQuery();
    // 判断登录是否成功
    if(rs.next()){
    
    
        System.out.println("登录成功~");
   }else{
    
    
        System.out.println("登录失败~");
   }
    //7. 释放资源
    rs.close();
    pstmt.close();
    conn.close();
}

En este momento, no es necesario pasar la declaración SQL al llamar a ejecutarUpdate(); o ejecutarQuery(); porque la declaración SQL se ha precompilado al obtener el objeto de ejecución de la declaración SQL.

Beneficios de la declaración preparada

预编译SQL,性能更高
防止SQL注入:==将敏感字符进行转义==

Principio de declaración preparada

Insertar descripción de la imagen aquí

Java代码操作数据库流程如图所示:
将sql语句发送到MySQL服务器端
MySQL服务端会对sql语句进行如下操作
检查SQL语句
select * from tb_user where username = 'sjdljfld'
and password = '\'or \'1\' = \'1'
检查SQL语句的语法是否正确。
编译SQL语句。将SQL语句编译成可执行的函数。
检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如
果我们只是重新设置参数,那么检查SQL语句和编译SQL语
句将不需要重复执行。这样就提高了性能。
执行SQL语句

Omita la introducción de habilitar la función de precompilación

Este artículo resume el curso JavaWeb de Shang Silicon Valley y recomiendo a todos que le echen un vistazo.

Supongo que te gusta

Origin blog.csdn.net/weixin_64618264/article/details/132921977
Recomendado
Clasificación