Educoder/Touge JAVA——Características avanzadas de JAVA: JDBD (Parte 1)

Tabla de contenido

Nivel 1: base de datos de conexiones JDBC

información relacionada

Cargue el controlador de la base de datos

establecer conexión

Ejecutar la declaración SQL escrita

liberar recursos

requisitos de programación

Nivel 2: Operaciones JDBC sobre datos en tablas

información relacionada

Especificar la conexión de la base de datos

Insertar datos en la tabla especificada

Consultar los datos de la tabla.

requisitos de programación

Nivel 3: Transacciones JDBC

información relacionada

asuntos

Elementos Básicos de las Transacciones (ACID)

transacción abierta

comprometer y retroceder

requisitos de programación


Nivel 1: base de datos de conexiones JDBC

información relacionada

JDBC APISe proporcionan las siguientes interfaces y clases:

DriverManager: Lista de controladores de bases de datos de gestión para esta clase. JDBCEl primer controlador bajo el cual se reconoce y utiliza un subprotocolo para establecer una conexión de base de datos.

Driver: Esta interfaz maneja la comunicación con el servidor de la base de datos. Rara vez Driverinteractuamos directamente con los objetos. Para conectarse a la base de datos en la programación, primero debe cargar el controlador de la base de datos de un proveedor específico.

Connection: Esta interfaz tiene todos los métodos para contactar con la base de datos. ConnectionEl objeto representa el contexto de comunicación, es decir, toda la comunicación con la base de datos pasa únicamente por el objeto de conexión.

Statement: Un objeto utilizado para ejecutar una SQLdeclaración estática y devolver el resultado que genera. Algunas interfaces derivadas también pueden aceptar parámetros, por ejemplo PrepareStatement, .

ResultSet: Proporciona métodos para recuperar campos de diferentes tipos. (El objeto de la operación es el resultado después de Statementejecutar SQLla consulta)

SQLException: esta clase maneja cualquier error que ocurra en la aplicación de la base de datos.

Los pasos utilizados JDBCson los siguientes:

Cargue el controlador de la base de datos → establezca una conexión con la base de datos ( Connection) → cree un objeto SQLpara ejecutar la declaración Statement→ procese el resultado de la ejecución ( ResultSet) → libere recursos

Para completar esta tarea, debe dominar: 1. Cómo cargar el controlador de la base de datos, 2. Cómo establecer una conexión con la base de datos, 3. Cómo ejecutar la SQLdeclaración escrita, 4. Liberar recursos.

Cargue el controlador de la base de datos

El controlador se carga para abrir el canal de comunicación con la base de datos.

Antes de registrar el controlador, debemos cargar el controlador de base de datos específico del proveedor y el mysq-connector-javapaquete importado jar. El método consiste en crear un directorio en el proyecto liby colocar el paquete debajo jar.

Luego haga clic con el botón derecho jaren el paquete Build Path→ importación Add to Build Pathcompleta jardel paquete. Después de importar jarel paquete al proyecto, comenzamos a registrar el controlador:

JavaLa carga del controlador de la base de datos generalmente usa Classel método estático de la clase forName()y el formato de sintaxis es el siguiente:

  1. Class.forName(String driverManager)

Ejemplo:

  1. try {
  2. Class.forName("com.mysql.jdbc.Driver" );
  3. } catch (ClassNotFoundException e) {
  4. e.printStackT\frace();
  5. }

Si la carga es exitosa, la clase de controlador cargada se registrará con DriverManager; si la carga falla, ClassNotFoundExceptionse lanzará una excepción.

establecer conexión

Después de cargar con éxito el controlador de la base de datos, puede establecer una conexión a la base de datos utilizando el DriverManagermétodo estático getConnection()para lograrlo. como sigue:

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

URLURLSe utiliza para identificar la ubicación de la base de datos y comunicar la información de conexión del programa a través de la dirección JDBC.

Si no hay base de datos, solo establezca una conexión, URLescrita como:

Si hay una base de datos test, URLel método de escritura es:

localhostSe puede reemplazar con IPuna dirección 127.0.0.1, 3306que es MySQLel número de puerto predeterminado de la base de datos, usery passwordel nombre de usuario y la contraseña de la base de datos correspondiente.

Ejecutar la SQLdeclaración escrita

Una vez establecida la conexión, puede usar el método Connectionde la interfaz createStatement()para obtener Statementel objeto y executeUpdate()ejecutar SQLla declaración a través del método.

  • crear statementobjeto

    1. try {
    2. Statement statement = conn.createStatement();
    3. } catch (SQLException e) {
    4. e.printStackT\frace();
    5. }
  • crear base de datos

    1. try {
    2. String sql1="drop database if exists test";
    3. String sql2="create database test";
    4. statement.executeUpdate(sql1);//执行sql语句
    5. statement.executeUpdate(sql2);
    6. } catch (SQLException e) {
    7. e.printStackT\frace();
    8. }
  • crear mesa

    1. try {
    2. statement.executeUpdate("use test");//选择在哪个数据库中操作
    3. String sql = "create table table1(" +
    4. "column1 int not null, " +
    5. "column2 varchar(255)" +
    6. ")";
    7. statement.executeUpdate(sql);
    8. } catch (SQLException e) {
    9. e.printStackT\frace();
    10. }

liberar recursos

JdbcDespués de que el programa se esté ejecutando, recuerde liberar los objetos que el programa creó durante el proceso de ejecución para que interactúen con la base de datos, estos objetos suelen ser y ResultSetobjetos .StatementConnection

Especialmente Connectionlos objetos, que son recursos muy escasos, deben liberarse inmediatamente después de su uso. Si Connectionno se pueden cerrar de manera oportuna y correcta, fácilmente se producirá un tiempo de inactividad del sistema.

ConnectionEl principio de uso es crear lo más tarde posible y publicar lo antes posible.

Para garantizar que el código de liberación de recursos se pueda ejecutar, el código de liberación de recursos debe colocarse finallyen la declaración.

  1. finally {
  2. try {
  3. if(statement!=null)
  4. statement.close();
  5. if(conn!=null)
  6. conn.close();
  7. } catch (SQLException e) {
  8. e.printStackT\frace();
  9. }
  10. }

requisitos de programación

Complemente el código en el editor de la derecha y complete las siguientes tareas correspondientes:

  1. Cargue el controlador de la base de datos; [El usuario ( ) de la conexión de la base de datos de la plataforma useres root, y la contraseña ( password) es 123123]

  2. Crear una base de datos mysql_db;

  3. Crear tablas student.

studentLa estructura de la tabla es:

nombre del campo tipo Observación restricción
identificación En t Identificación del Estudiante no vacío
nombre varchar(20) nombre del estudiante ninguno
sexo varchar(4) sexo del estudiante ninguno
edad En t edad del estudiante ninguno
//jdbcConn.java
package jdbc;

import java.sql.*;

public class jdbcConn {
	public static void getConn() {
		try {
			// 1.注册驱动
			Class.forName("com.mysql.jdbc.Driver");

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		/********** End **********/

		/********** Begin **********/
		Connection conn = null;
		Statement statement = null;
		try {
			// 2.建立连接并创建数据库和表
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "123123");
			String sql1 = "drop database if exists mysql_db;";
			String sql2 = "create database mysql_db;";
			statement = conn.createStatement();
			statement.execute(sql1);
			statement.execute(sql2);
			statement.execute("use mysql_db");
			String sql3 = "create table student(id int not null,name varchar(20),sex varchar(4),age int)";
			statement.execute(sql3);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (statement != null)
					statement.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
//test1.java
package jdbcTest;

import jdbc.jdbcConn;
import java.sql.*;

public class Test1 {
    public static void main(String[] args) throws SQLException {
        jdbcConn.getConn();
        try {
            Class.forName("com.mysql.jdbc.Driver" );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url = "jdbc:mysql://localhost:3306/mysql_db";
        Connection conn = DriverManager.getConnection (url,"root","123123" );
        PreparedStatement pst = null;
        try {
            pst = conn.prepareStatement("select * from student");
            ResultSetMetaData rsd = pst.executeQuery().getMetaData();
            for(int i = 1; i <= rsd.getColumnCount(); i++) {
                String columnTypeName = rsd.getColumnTypeName(i);
                String columnName = rsd.getColumnName(i);
                int columnDisplaySize = rsd.getColumnDisplaySize(i);
                System.out.println(columnName+" "+columnTypeName+"("+columnDisplaySize+")");
            }
        } catch(SQLException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (pst!=null)
                    pst.close();
                if (conn != null)
                    conn.close();
            } catch(SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

Nivel 2: Operaciones JDBC sobre datos en tablas

información relacionada

Especificar la conexión de la base de datos

Cuando ya tenemos una base de datos, podemos especificar la base de datos directamente al conectarnos, de la siguiente manera para establecer test_dbuna conexión con la base de datos:

  1. String url = "jdbc:mysql://localhost:3306/test_db";
  2. Connection conn = DriverManager.getConnection (url,"root","123123" );

Cuando se especifica la base de datos al conectarse, no necesitamos escribir SQLuna declaración para seleccionar la base de datos.

Insertar datos en la tabla especificada

sqlUna vez establecida la conexión, escriba una declaración para insertar datos en la tabla y use el método Statementdel objeto executeUpdate()para ejecutar la sqldeclaración para modificar los datos en la tabla (este método es aplicable a las declaraciones de insert, update, ). una declaración de consulta, utilice el método:deletesqlsqlexecuteQuery()

  1. try {
  2. Statement statement = conn.createStatement();
  3. statement.executeUpdate("insert into table1(column1,column2) values(101,'xxx')");
  4. } catch (SQLException e) {
  5. e.printStackT\frace();
  6. }

Declaración preparada

El uso directo mencionado anteriormente Statementinserta datos en la tabla, y existe SQLun riesgo de inyección durante la operación, que se separa de la tabla mencionada anteriormente, como en el siguiente ejemplo:

  1. String id = "5";
  2. String sql = "delete from tablename where id=" + id;
  3. Statement st = conn.createStatement();
  4. st.executeQuery(sql);//查询到表中将无数据
  5. //如果用户传入的id为“5 or 1=1”,那么将删除表中的所有记录

SQLPara evitar la inyección de esta situación , PreparedStatementprevenga efectivamente sqlla inyección ( SQLla declaración ha sido precompilada antes de que se ejecute el programa , y ​​los parámetros se pasan dinámicamente cuando se ejecuta PreprareStatement, incluso si hay caracteres confidenciales en los parámetros, como or '1=1'la base de datos, serán utilizado como un atributo de campo del valor de los parámetros a procesar y no como una SQLinstrucción)

PreparedStatementUtilizar de la siguiente manera:

  1. PreparedStatement statement = conn.prepareStatement("insert into table1(column1,column2) values(?,?)");//使用占位符来先占个位置
  2. statement.setInt(1,101);//占位符顺序从1开始,根据数据库中字段相应的类型存入数据
  3. statement.setString(2, "XXX");//也可以使用setObject
  4. statement.executeUpdate();//每执行一个sql语句就需要执行该方法

Consultar los datos de la tabla.

JdbcSe utiliza en un programa ResultSetpara representar Sqlel resultado de la ejecución de una declaración.

ResultsetAl encapsular los resultados de la ejecución, el método es similar a una tablaResultSet . El objeto mantiene un cursor que apunta a la fila de datos de la tabla. Inicialmente, el cursor está antes de la primera fila. Llame ResultSet.next()al método para que el cursor apunte a los datos específicos. fila y, a continuación, llame al método Obtener los datos para esta fila.

  1. //编写查询sql语句
  2. PreparedStatement statement = conn.prepareStatement("select * from table1");
  3. ResultSet resultSet = statement.executeQuery();//将执行结果给ResultSet
  4. while (resultSet.next()) {//循环判断表中是否还有数据
  5. int id = resultSet.getInt(1);//通过列的索引查询
  6. String name = resultSet.getString("column2");//通过列名查询
  7. }

requisitos de programación

mysql_dbComplemente el código en el editor de la derecha, inserte datos en la tabla en la base de datos creada en el capítulo anterior studenty genere los datos insertados:

identificación nombre sexo edad
1 zhang san masculino 19
2 lisi femenino 18
3 wangwu masculino 20

Sugerencia: la clase se ha empaquetado para usted student, puede verla en la carpeta de la derecha y esta clase se puede usar directamente.

package jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class jdbcInsert {
    public static void insert(){
		/**********   Begin  **********/
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
		/**********   End   **********/
		Connection conn = null;
		PreparedStatement statement = null;
		/**********   Begin  **********/
        //连接并插入数据
		try{
			String url = "jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf8";
			String user = "root";
			String password = "123123";
			conn = DriverManager.getConnection(url, user, password);

			String sql = "insert into student(id,name,sex,age) values (1,'张三','男',19),(2,'李四','女',18),(3,'王五','男',20)";

			statement = conn.prepareStatement(sql);
			statement.executeUpdate();
			String sql1 = "select * from student";
			ResultSet rs = statement.executeQuery(sql1);

			Student student = null;
			while (rs.next()) {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String sex = rs.getString(3);
				int age = rs.getInt(4);
				student = new Student(id, name, sex, age);
				System.out.println(
						student.getId() + " " + student.getName() + " " + student.getSex() + " " + student.getAge());
			}
		
		} catch (SQLException e) {
            e.printStackTrace();
        }
		/**********   End   **********/
		finally {
            try {
                if (statement != null)
                    statement.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Nivel 3: Transacciones JDBC

información relacionada

asuntos

Suponiendo un escenario, tenemos un sistema de administración de personal. Si desea eliminar a una persona, debe eliminar no solo la información básica de la persona, sino también la información relacionada con la persona, como buzones, artículos, etc. para que estas declaraciones de operación de la base de datos puedan ser ¡Haga una transacción!

Las transacciones controlan cuándo se confirman y aplican los cambios a la base de datos. Trata una SQLdeclaración única o un grupo SQLde declaraciones como una unidad lógica, y si alguna declaración falla, la transacción completa falla.

Elementos básicos del negocio ( ACID)

  • Atomicidad ( Atomicity): un grupo de transacciones, ya sea exitosas o retiradas;

  • Consistencia ( Consistency): antes y después de la transacción, no se violan las restricciones de integridad de la base de datos. Por ejemplo, cuando A transfiere dinero a B, es imposible Adeducir el dinero Bpero no recibirlo;

  • Aislamiento ( Isolation): Las transacciones se ejecutan de forma independiente. Si el resultado del procesamiento de una transacción afecta a otras transacciones, se retirarán otras transacciones. El aislamiento de transacciones 100%requiere sacrificar la velocidad;

  • Persistencia ( Durability): una vez completada la transacción, todas las actualizaciones realizadas por la transacción en la base de datos se guardarán en la base de datos y no se podrán revertir.

transacción abierta

Abrir una cosa requiere habilitar el soporte de transacciones manuales, en lugar de usar JDBCel modo de confirmación automática que el controlador usa de forma predeterminada, en el método Connectiondel objeto invocable. setAutoCommit()Si falsese pasa un valor booleano a setAutoCommit(), la confirmación automática se desactiva , lo que equivale a activar las cosas. También se puede pasar un valor booleano truepara volver a activarlo.

  1. Connection conn = DriverManager.getConnection (url,"root","123123" );
  2. conn.setAutoCommit(false);//关闭自动提交开启事务

comprometer y retroceder

En mysqlla base de datos, el valor predeterminado es sqlenviar automáticamente cada oración. Cuando configuramos el soporte de transacción manual (es decir, la transacción se ha abierto manualmente), podemos enviar manualmente cuando necesitamos enviar:

  1. conn.commit();//提交事务

Cuando se envían varios sqlextractos a la vez, debemos considerar sqlsi son legales y, si uno de ellos es ilegal, sqlsi los demás aún deben cambiarse; para garantizar los elementos básicos de la transacción, debemos llamar manualmente al reversión de transacciones para controlar sqlla ejecución de:

  1. try{
  2. Connection conn = DriverManager.getConnection (url,"root","123123" );
  3. conn.setAutoCommit(false);//开启事务
  4. PreparedStatement ps = conn.prepareStatement("insert into table1(column1,column2) values(1,'xx1')");
  5. ps.executeUpdate();
  6. ps = conn.prepareStatement("insert in table1(column1,column2) values(1,'xx1')");
  7. ps.executeUpdate();
  8. conn.commit();//提交事务
  9. } catch (SQLException e) {
  10. try {
  11. conn.rollback();//回滚事务 回滚到你开始事务之前
  12. } catch (SQLException e1) {
  13. e1.printStackT\frace();
  14. }
  15. }

Después de ejecutar el código anterior, no se actualizará ningún dato en la base de datos. Debido a que la sintaxis de la segunda insertdeclaración es incorrecta, la transacción se retrotrae y la anterior insertse invalida. Por lo general, las reversiones de transacciones se colocan catchpara capturar.

Después de iniciar la transacción, asegúrese de mantenerse al día commito rollbackliberar los datos que puedan estar bloqueados a tiempo.

No rollback()usarlo tiene rollback()el mismo efecto que usarlo, pero no usarlo rollback()puede hacer que los datos bloqueados no se liberen a tiempo (debe esperar a que se liberen las cosas con el tiempo), lo que afectará la próxima operación de transacción.

requisitos de programación

De acuerdo con el indicador, complemente el código en el editor de la derecha, escriba una SQLdeclaración nueva y cualquier declaración incorrecta , y envíe la transacción; la primera declaración nueva SQLdebe modificarse en la base de datos y la siguiente SQLdeclaración incorrecta no se ejecuta .

Los requisitos específicos para agregar una declaración de inserción son los siguientes: Agregue una nueva entrada en mysql_dbla tabla de la base de datos para , para Zhao Liu, para mujer, para datos.studentid4namesexage21

Sugerencia:SQL las transacciones se pueden comprometer después de cada declaración.

package jdbc;

import java.sql.*;

public class jdbcTransaction {

    public static void transaction(){
        try {
            Class.forName("com.mysql.jdbc.Driver" );
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection conn = null;
        PreparedStatement ps = null;
        /**********  Begin   **********/
        //连接数据库并开启事务
        try {
			String url = "jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf8";
			conn = DriverManager.getConnection(url, "root", "123123");
			conn.setAutoCommit(false);
			String sql = "insert into student(id,name,sex,age) values(4,'赵六','女',21)";
			ps = conn.prepareStatement(sql);
			ps.executeUpdate();
			conn.commit();
			String sql1 = "daj;ljd";
			ps = conn.prepareStatement(sql1);
			ps.executeUpdate();
			conn.commit();
			String sql2 = "select * from student";
			ResultSet rs = ps.executeQuery(sql2);
			Student student = null;
			while (rs.next()) {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				String sex = rs.getString(3);
				int age = rs.getInt(4);
				student = new Student(id, name, sex, age);
				System.out.println(
						student.getId() + " " + student.getName() + " " + student.getSex() + " " + student.getAge());
			}
        } catch (SQLException e) {
            try {
                //回滚
                conn.rollback();
                
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        /**********  End   **********/
        finally {
            try {
                if(ps!=null)
                    ps.close();
                if (conn != null)
                    conn.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/zhou2622/article/details/128382970
Recomendado
Clasificación