jjavaweb-jdbc-024

JDBC:

Use la herramienta de vista mysql para tener en cuenta que solo se ejecutará el comando seleccionado cuando se ejecute una sola línea, de lo contrario no hay comando
. 1. Concepto: Java DataBase Connectivity Conexión a la base de datos Java, base de datos de operaciones del lenguaje Java
* Esencia JDBC: en realidad, un conjunto definido por el funcionario (empresa sun) Reglas para operar todas las bases de datos relacionales, a saber, interfaces. Varios proveedores de bases de datos implementan este conjunto de interfaces y proporcionan paquetes jar de controladores de bases de datos. Podemos usar este conjunto de programación de interfaz (JDBC), el código real es conducir la clase de implementación en el paquete jar.

2. 快速入门:
	* 步骤:
		1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
			1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
			2.右键-->Add As Library
		2. 注册驱动
		3. 获取数据库连接对象 Connection
		4. 定义sql
		5. 获取执行sql语句的对象 Statement
		6. 执行sql,接受返回结果
		7. 处理结果
		8. 释放资源
package learn.jdbc;

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

public class test_jdbc {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1. 导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/events_more","root","rootli");
        //5.获取执行sql的对象 Statement
        Statement stat=conn.createStatement();
//        String sql="Update emp set Name='456' where id=1";
//        int count=stat.executeUpdate(sql);
        //4.定义sql语句
        String sql="select * from emp";
        //6.执行sql
        ResultSet rs=stat.executeQuery(sql);
        //7.处理结果
        ArrayList<Dept> li=new ArrayList<Dept>();
        while(rs.next()) {
    
    
            int a = rs.getInt(1);
            String b = rs.getString(2);
            Dept dp = new Dept();
            dp.id = a;
            dp.name = b;
            li.add(dp);
        }
        System.out.println(li.get(1));

//        System.out.println(count);
        //8.释放资源
        stat.close();
        conn.close();
    }
}

  1. Explique cada objeto en detalle:
    todas las clases utilizadas son en realidad interfaces
    1. DriverManager: objeto de gestión del controlador
    * Función:
    1. Registrar controlador: decirle al programa qué controlador de base de datos jar debe usar
    static void registerDriver (controlador de controlador): registrarse y dado Driver DriverManager.
    Escriba el código para usar: Class.forName ("com.mysql.jdbc.Driver");
    Al ver el código fuente, se encuentra que hay un bloque de código estático en la clase com.mysql.jdbc.Driver
 static {
    
    
					        try {
    
    
					            java.sql.DriverManager.registerDriver(new Driver());
					        } catch (SQLException E) {
    
    
					            throw new RuntimeException("Can't register driver!");
					        }
    					}
				注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
			2. 获取数据库连接:
				* 方法:static Connection getConnection(String url, String user, String password) 
				* 参数:
					* url:指定连接的路径
						* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
						* 例子:jdbc:mysql://localhost:3306/db3
						* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
					* user:用户名
					* password:密码 
	2. Connection:数据库连接对象
		1. 功能:
			1. 获取执行sql 的对象
				* Statement createStatement()
				* PreparedStatement prepareStatement(String sql)  
			2. 管理事务:
				* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
				* 提交事务:commit() 
				* 回滚事务:rollback() 
	3. Statement:执行sql的对象
		1. 执行sql
			1. boolean execute(String sql) :可以执行任意的sql 了解 
			2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
				* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
			3. ResultSet executeQuery(String sql)  :执行DQL(select)语句
注意,可能会出现空指针异常:因此可以对此做一些判定与初始化
代码:
 2. Statement stmt = null;
    			        Connection conn = null;
 1. if(count > 0){
    
    
    			                System.out.println("添加成功!");
    			            }else{
    
    
    			                System.out.println("添加失败!");
    			            }
 2. finally {
    
    
    			            //stmt.close();
    			            //7. 释放资源
    			            //避免空指针异常
    			            if(stmt != null){
    
    
    			                try {
    
    
    			                    stmt.close();
    			                } catch (SQLException e) {
    
    
    			                    e.printStackTrace();
    			                }
    			            }
    			
    			            if(conn != null){
    
    
    			                try {
    
    
    			                    conn.close();
    			                } catch (SQLException e) {
    
    
    			                    e.printStackTrace();
    			                }
    			            }
    			        }
  1. ResultSet: Objeto del conjunto de resultados, encapsulando los resultados de la consulta
    * boolean next (): Mueva el cursor hacia abajo una línea para determinar si la línea actual es el final de la última línea (si hay datos), si lo es, devuelve falso, si no, devuelve verdadero
    * getXxx ( Parámetros): Obtener datos
    * Xxx: Representa tipos de datos como: int getInt (), String getString ()
    * Parámetros:
    1. int: Representa el número de la columna, comenzando desde 1, como: getString (1)
    2. String: Representa el nombre de la columna . Por ejemplo: getDouble ("balance")

     	* 注意:
     		* 使用步骤:
     			1. 游标向下移动一行
     			2. 判断是否有数据
     			3. 获取数据
    
				   //循环判断游标是否是最后一行末尾。
 while(rs.next()){
    
    
	                //获取数据
	                //6.2 获取数据
	                int id = rs.getInt(1);
	                String name = rs.getString("name");
	                double balance = rs.getDouble(3);
	
	                System.out.println(id + "---" + name + "---" + balance);
	            }
		* 练习:
			* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
				1. 定义Emp类
					定义好变量后,使用alt+insert可以重写toString与get,set方法
				2. 定义方法 public List<Emp> findAll(){}
				3. 实现方法 select * from emp;
  1. PreparedStatement: el objeto que ejecuta SQL
    1. Problema de inyección de SQL: al empalmar SQL, algunas palabras clave especiales de SQL están involucradas en el empalme de cadenas. Causará problemas de seguridad,
    lo que significa que el nombre de usuario y la contraseña ingresados ​​son declaraciones SQL que participan en el empalme SQL de la base de datos, lo que genera comandos incorrectos. Pero los usuarios pueden ejecutar
    1. Ingrese el usuario casualmente, ingrese la contraseña:
    a'or'a ' =' a 2. sql: seleccione * de usuario donde nombre de usuario = 'fhdsjkf' y contraseña = 'a' o'a '=' a '

     	3. 解决sql注入问题:使用PreparedStatement对象来解决
     	4. 预编译的SQL:参数使用?作为占位符
     	5. 步骤:
     		1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
     		2. 注册驱动
     		3. 获取数据库连接对象 Connection
     		4. 定义sql
     			* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
     		5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
     		6. 给?赋值:
     			* 方法: setXxx(参数1,参数2)
     				* 参数1:?的位置编号 从1 开始
     				* 参数2:?的值
     		7. 执行sql,接受返回结果,不需要传递sql语句
     		8. 处理结果
     		9. 释放资源
    
     	6. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
     		1. 可以防止SQL注入
     		2. 效率更高
    
package learn.jdbc;

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

public class test_jdbc {
    
    
    public static void main(String[] args)  {
    
    
        Connection conn = null;
        Statement stat = null;
        PreparedStatement pstat;
        try {
    
    
            //1. 导入驱动jar包
            //2.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //3.获取数据库连接对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/events_more", "root", "rootli");
            //5.获取执行sql的对象 Statement
            stat = conn.createStatement();
            //4.定义sql语句
            /*注意:sql的参数使用?作为占位符*/
            String sql = "update dept set name='123' where id =? and name=?";
            //开启事务
            conn.setAutoCommit(false);
            /*获取执行sql语句的对象*/
            pstat = conn.prepareStatement(sql);
            //4. 设置参数
            pstat.setInt(1, 1);
            pstat.setString(2, "开发部");

            int count = pstat.executeUpdate();
            //提交事务
            conn.commit();
            System.out.println(count);
        }
        catch (Exception e){
    
    
            if (conn !=null) {
    
    
                try {
    
    
                    //事务回滚
                conn.rollback();
                    //8.释放资源
                stat.close();
                //这里写的错误,因为不能放到一起,可能造成conn不能关闭,内存泄漏
                conn.close();
            } catch (SQLException e1) {
    
    
                e1.printStackTrace();
            }
            }
        }
    }
}

¿Por qué el hombre parece confuso?

Extraiga la clase de herramienta JDBC: JDBCUtils

* 目的:简化书写
* 分析:
	1. 注册驱动封装
	2. 获取连接对象封装
		* 需求:不想传递参数(麻烦),还得保证工具类的通用性。
		* 优化链接,对于驱动,密码,用户名不能写死
		* 解决:配置文件
			jdbc.properties
				url=
				user=
				password=
	3. 释放资源封装,同时异常在方法内处理,简化主程序代码
创建一个文件:
url=jdbc:mysql:///db3
user=root
password=root
driver=com.mysql.jdbc.Driver

Simplifique el código, vincule jdbcl y cierre el paquete de operaciones:

package learn.jdbc;

import java.io.FileReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class javaUtilts {
    
    
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
     */
    static {
    
    

        try {
    
    
            //读取资源文件,获取值。
            //1. 创建Properties集合类。
            Properties pro = new Properties();
            //获取src路径下的文件的方式--->ClassLoader 类加载器
            ClassLoader cls = javaUtilts.class.getClassLoader();
            URL res= cls.getResource("jdbc.properties");
            //使用文件加载不得使用绝对路径,不合适。
            String path = res.getPath();
            pro.load(new FileReader(path));
            //3. 获取数据,赋值
            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            //4. 注册驱动
            Class.forName(driver);

        }
        catch(Exception e){
    
    
            System.out.println(e);
        }


    }
    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
    
    
        return DriverManager.getConnection(url,user,password);
    }
    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stat,Connection conn){
    
    
        if(stat!=null) {
    
    
            try {
    
    
                stat.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
        if(conn!=null) {
    
    
            try {
    
    
                conn.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/lidashent/article/details/107184721
Recomendado
Clasificación