jdbc encapsula una clase principal para reducir la duplicación de código

1. Revisión

1. jdbc: función de consulta. 
2. Solución al problema de seguridad de la inyección de sql 
   (1) Cargue el controlador: Class.forName("mysql driver name"); 
   (2) Obtenga el objeto de conexión: Connection conn=DriverManager.getConnection(url,u,pass) ; 
   (3 ) Obtenga el objeto que ejecuta la instrucción sql: 
      PreparedStatement ps=conn.prepareStatement(sql);//Precompile sql 
   (4) Asigne 
      ps.setXXX(index,value) al marcador de posición; //index: indica el índice del marcador de posición. valor: representa el valor del marcador de posición 
   (5) para ejecutar la instrucción sql. 
       ps.executeUpdate();//Ejecutar sql 
       ResultSet de adiciones, eliminaciones y modificaciones rs=ps.executeQuery();//Ejecutar query sql 
   (6) Recorrer el contenido de ResultSet. 
       while(rs.next()){ // Puntero de juicio Si se puede mover, si se puede mover, pasar a la siguiente fila de registros 
            rs.getXXX("nombre de la columna"); //Obtenga el valor de la columna especificada de la fila actual. 
       }

2. Texto

1. Encapsular el resultado de la consulta en la entidad correspondiente. 
2. Encapsule la operación de cada tabla en la clase correspondiente. 
3. Clase padre común de clases de operaciones abstractas.

3. Encapsular el resultado de la consulta a la entidad correspondiente.

Nota: Enviamos directamente los resultados de la consulta a la consola aquí, pero en el desarrollo real, necesitamos mostrar los resultados de la consulta en la página web del navegador, el efecto es el siguiente

 Cómo encapsular los resultados de la consulta.

1. Encapsule cada tabla de la base de datos en una clase, denominada clase de entidad. 
2. Encapsule las columnas de la tabla como atributos en la clase de entidad. 
3. Cada registro de la tabla se encapsula en un objeto de clase de entidad. 
4. Varios registros de la tabla se encapsulan en una colección ArrayList.

Usuario de clase pública { 
    id de int privado; 
    cadena privada nombre; 
    contraseña de cadena privada; 

    public User() { 
    } 

    @Override 
    public String toString() { 
        return "User{" + 
                "id=" + id + 
                ", nombre='" + nombre + '\'' + 
                ", contraseña='" + contraseña + '\'' + 
                '}'; 
    } 

    public int getId() { 
        devolver id; 
    } 

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

    public String getName() { 
        devolver nombre;

    } 

    public String getPassword() { 
        devolver contraseña; 
    } 

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

    Usuario público (int id, nombre de cadena, contraseña de cadena) { 
        this.id = id; 
        este.nombre = nombre; 
        this.contraseña = contraseña; 
    } 
}

@Test

    public void testSelect() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        String sql = "select * from tb_dept"; //因为这里没有占位符 所以可以不用为占位符赋值
        PreparedStatement ps= connection.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
​
        List<Dept> list = new ArrayList<>(); //集合存放数据库表中所有记录
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            //创建一个实体类对象 存储表中的一条记录。
            Dept d = new Dept();
            d.setId(id);
            d.setName(name);
​
            list.add(d);
        }
        System.out.println(list); //正常再开发中应该把该对象list返回给前端。
    }
    @Test
    public void testSelectOne() throws Exception{
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
        String user = "root";
        String password = "root";
        Connection connection = DriverManager.getConnection(url, user, password);
        String sql = "select * from tb_dept where id=?"; //这里根据id查询的结果一定是一条记录。因为id是主键。
        PreparedStatement ps= connection.prepareStatement(sql);
        ps.setInt(1,9);
​
        ResultSet rs = ps.executeQuery();
        Dept d=null;//声明部门实体类对象。
        while (rs.next()){
            d =  new Dept(); //因为进入该语句表示从数据库中查询到相应的记录了。
            int id = rs.getInt("id");
            String name = rs.getString("name");
            d.setId(id);
            d.setName(name);
        }
​
        System.out.println(d); //以后可以把d返回给前端调用者
​
    }

Si el resultado de la consulta son varios registros, use ArrayList para almacenar varios registros y cada elemento siga usando un objeto de clase de entidad.

Si se determina que el resultado de la consulta es un elemento, use la clase de entidad directamente.

4. Encapsule la operación de cada tabla en la clase correspondiente.

Pensamiento: si escribimos todas las operaciones de tabla en una clase, entonces el código de esta clase se volverá cada vez más pesado y será un inconveniente para el mantenimiento posterior. Cuando realmente desarrollemos la empresa, operaremos en cada tabla. clase de operación correspondiente.

Los sufijos son Dao -----Objeto de acceso a datos capa de objeto de acceso a datos

tb_dept corresponde a una clase de operación DeptDao, que contiene todas las operaciones de agregar, borrar, modificar y verificar la tabla tb_dept.

tb_student corresponde a una operación

 
del paquete StudentDao com.ykq.dao; 
importar
com.ykq.entity.Dept; 
importar
java.sql.Connection; 
importar java.sql.DriverManager; 
importar java.sql.PreparedStatement; 
importar java.sql. ResultSet ; 
import java.util.ArrayList; 
import java.util.List; 
​/
** 
 * @program: jdbc03 
 * @description: 
 * @author: Yan 
 Keqi2 * @create: 2022-05-06 14:56 
 * // Especial Una clase que opera en la tabla tb_dept. 
 **/ 
public class DeptDao { 
​private        
    String driverName="com.mysql.cj.jdbc.Driver";  
    private String url="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai";
    private String user="root"; 
    private String password="root" 
;
    //Consulta la información del departamento de acuerdo con el id 
    public Dept findOne(int id) throws Exception{ 
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection(url, user, password); 
        String sql = "select * from tb_dept where id= ? "; // Aquí, el resultado de la consulta basada en id debe ser un registro. Porque id es la clave principal. 
        PreparedStatement ps= connection.prepareStatement(sql); 
        ps.setInt(1,id); 
​ResultSet
        rs = ps.executeQuery(); 
        Dept d=null;//Declara el objeto de clase de entidad del departamento. 
        while (rs.next()){ 
            d = new Dept(); //Porque ingresar esta declaración significa que el registro correspondiente ha sido consultado desde la base de datos. 
            d.setId(rs.getInt("id"));
            d.setName(rs.getString("name")); 
        } 
        return d; 
    } 
​//
    Operación de consulta -- consulta todo 
    public List<Dept> findAll() throws Exception{ 
        List<Dept> list=new ArrayList<>(); 
        Class.forName(driverName); 
        Conexión conexión = DriverManager.getConnection(url,usuario,contraseña); 
        String sql= "select * from tb_dept"; 
        PreparedStatement ps=connection.prepareStatement(sql); 
        ResultSet rs = ps.executeQuery(); 
while
        (rs.next( )){ 
            //Crear un registro en una tabla de almacenamiento de objetos de clase de entidad. 
            Departamento d = nuevo Departamento(); 
            d.setId(rs.getInt("id")); 
            d.setName(rs.getString("
            list.add(d); 
        } 
        return list; 
    } 
​//
    Agregar operación: ¿quieres pasar parámetros?
    public void insertDept(Dept dept) throws Exception{ //Encapsule la información del departamento de entrada del front-end en la clase de entidad correspondiente. 
        Class.forName(driverName); 
        Conexión conexión = DriverManager.getConnection(url,usuario,contraseña); 
        String sql = "insertar en tb_dept valores (nulo,?)"; 
        PreparedStatement ps = conexión.prepareStatement(sql); 
        ps.setObject( 1,dept.getName()); 
        ps.executeUpdate(); 
    } 
​//
    Operación de eliminación: eliminar de acuerdo con el ID 
    public void delete(int id) arroja una excepción{ 
        Class.forName(driverName); 
        Connection connection = DriverManager.getConnection (url,usuario,contraseña);
        String sql = "eliminar de tb_dept donde id=?"; 
        Declaración Preparada ps = conexión.prepareStatement(sql); 
        ps.setObject(1,id); 
        ps.executeUpdate(); 
    } 
}

5. Use try-catch-finally para manejar excepciones

//Operación de consulta--consulta todo 
    público List<Dept> findAll() { 
        List<Dept> list = new ArrayList<>(); 
        try { 
            Class.forName(driverName); 
            connection = DriverManager.getConnection(url, usuario, contraseña ); 
            String sql = "select * from tb_dept"; 
            ps = connection.prepareStatement(sql); 
            rs = ps.executeQuery(); 
            while (rs.next()) { 
                //Crea una entrada en una tabla de almacenamiento de objetos de clase de entidad Registro. 
                Departamento d = nuevo Departamento(); 
                d.setId(rs.getInt("id")); 
                d.setName(rs.getString("nombre")); 
                list.add(d); 
            }
            excepción.printStackTrace(); 
        } finalmente { 
            intente { 
                if(rs!=null){ 
                     rs.close(); 
                } 
                if(ps!=null){ 
                     ps.close(); 
                } 
                if(conexión!=null){ 
                     conexión.cerrar(); 
                } 
            } catch (SQLException throwables) { 
                throwables.printStackTrace(); 
            } 
        } 
        lista de retorno; 
    }

6. Extraiga una clase principal pública de dao.

        ¿Por qué extraer la clase padre?

Debido a que encapsulamos una clase de operación para cada tabla, entonces hay muchas tablas en la base de datos, entonces tendremos muchas clases de operación, y estas clases de operación tienen un código común.Para reducir la redundancia del código, haremos un padre se extrae la clase.

paquete com.ykq.dao; 
import
java.sql.*; 
/
** 
 * @program: jdbc03 
 * @description: 
 * @author: Yan 
 Keqi2 * @create: 2022-05-07 14:08 
 * Esta clase es una clase de padres. Esta clase contiene algunas propiedades y métodos públicos en subclases. 
 **/ 
public class BaseDao { 
    // propiedad pública 
    private String driverName = "com.mysql.cj.jdbc.Driver"; 
    private String url = "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai" ; 
    private String usuario = "root"; 
    private String contraseña = "root"; 
    protected PreparedStatement ps = null; //los miembros protegidos del mismo paquete y subclases bajo diferentes paquetes pueden usar este modificador 
    protected Connection connection = null; 
    protected ResultSet rs = nulo;
    //Obtener el objeto de conexión. 
    public Connection getConn() throws Exception { //¿Quiere manejar excepciones o lanzar excepciones aquí? 
        Class.forName(driverName); 
        connection = DriverManager.getConnection(url, usuario, contraseña); 
        return connection; 
    } 
    //Método para cerrar recursos. 
    public void closeAll(){ 
        try { 
            if(rs!=null){ //Determinar si está vacío 
                rs.close(); 
            } 
            if(ps!=null){ 
                ps.close(); 
            } 
            if(connection!= null ){ 
                conexión.cerrar(); 
            } 
        } catch (Excepción e) { 
            e.printStackTrace(); 
        }
    } 
}

 Extraiga métodos públicos para agregar, eliminar y modificar.

código de clase padre

//Extraiga un método público para agregar , eliminar y modificar 
    public void edit(String sql,Object... params){ 
        try { 
            connection = getConn(); 
            //Accidental 
            ps = connection.prepareStatement(sql); 
            //Asignar el marcador de posición 
            para (int i=0;i<params.length;i++){ 
                ps.setObject(i+1, params[i]); 
            } 
            ps.executeUpdate(); 
        } catch (Exception e) { 
            e.printStackTrace() ; 
        } finalmente { 
            closeAll(); 
        } 
    }
 

 

código de subclase

//Agregar operación: pasar o no parámetros 
    public void insertDept(Dept dept) { //Encapsular la información del departamento de entrada de front-end en la clase de entidad correspondiente. 
        String sql = "insert into tb_dept values(null,?,?)"; 
        edit(sql,dept.getName(),dept.getAddress()); 
    } 
​//
    Operación de eliminación: eliminar de acuerdo con la identificación 
    public void delete( int id) { 
        String sql = "eliminar de tb_dept donde id=?"; 
        edit(sql,id); 
    }
 

código de clase de prueba

 EmpDao empDao=new EmpDao();
    @Test
    public void add(){
        Emp emp=new Emp();
        emp.setName("第三方");
        emp.setAddress("df");
        empDao.add(emp);
    }
    @Test
    public void remove(){
        empDao.remove(22);
    }
    @Test
    public void update(){
        Emp emp=new Emp();
        emp.setName("电风扇");
        emp.setAddress("电饭锅 ");
        emp.setId(18);
        empDao.update(emp);
    }
    @Test
    public void query(){
        List<Emp> list= empDao.query();
        for (Emp e:list) {
            System.out.println(e);
        }

    }

Supongo que te gusta

Origin blog.csdn.net/ne_123456/article/details/124857222
Recomendado
Clasificación