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);
}
}