JDBC原理

JDBC Java Database Connectivity

1. JDBC 概述
	Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。
	核心接口和核心类都在	
		java.sql
		javax.sql 包内
	在Java中如果需要连接数据库,需要导入对应数据库的Jar包。Jar由数据库厂商提供!!!可以从官网获取,或则是MVN maven依赖库官网
2. JDBC连接数据库所需资源
cmd连接数据库:
	mysql -hlocalhost -uroot -p123456
所需资源:
	1. mysql 明确告知计算机,当前连接的数据库为MySQL数据
	2. -hlocalhost 表示当前使用的数据库是本机地址
	3. -uroot 连接数据库所需用户名
	4. -p 对应当前用户的数据库密码

JDBC连接数据库所需:
	1. 明确当前连接数据库的是哪一个数据库,需要启动对应数据库的 Driver 驱动
	2. 明确当前数据库所在ip地址,主机名,域名
	3. 明确数据库连接使用用户名和密码
3. JDBC连接数据库准备
1. 对应当前数据库的JDBC Jar
	官网或Maven仓库搜索
	MySQL官网: https://dev.mysql.com/downloads/connector/j/
	Maven 仓库: https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.47
	
	建议: 5.1.47版本 稳定

2. 明确JDBC连接数据库的URL
	Uniform Resource Locator 统一资源定位符
	MySQL JDBC 规范 URL
		jdbc:mysql://localhost:3306/javaee2009
		jdbc: 主协议名,表示当前URL是jdbc协议
		mysql: 子协议名,当前连接的数据库为mysql数据
		localhost:3306: 数据库服务器所在域名,IP地址,主机名和对应的端口号
		javaee2009: 当前选择连接的数据库 数据库连接之后 使用 use javaee2009

3. 对应当前数据库登陆使用的用户名和密码字 符串形式 或者 Properties 形式

4. Jar导入到Java项目中
4. IDEA创建项目 导入第三方Jar包

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. JDBC连接数据库 Hello Database
package com.qfedu.a_jdbc;

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

/**
 * 第一个JDBC程序,Java连接数据库演示
 *
 * @author Anonymous
 */
public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        /*
        1. 加载驱动 JDBC For Java
           Class.forName(String packageAndClass);
         */
        // Alt + Enter IDEA 快速修复
        Class.forName("com.mysql.jdbc.Driver");

        // 2. 设定URL,用户名和密码
        String url = "jdbc:mysql://localhost:3306/javaee2009";
        String userName = "root";
        String password = "123456";

        // 3. 获取数据库连接对象  java.sql.Connection 数据库连接对象
        Connection connection = DriverManager.getConnection(url, userName, password);

        System.out.println(connection);

        // 4. 关闭数据库资源
        connection.close();
    }
}
6. 驱动加载分析和静态代码块操作特征
静态代码块特征:
	1. 类文件加载一定执行
	2. 有且只执行一次
	3. 只能使用类内的静态资源,不能使用非静态资源。
	4. 静态代码块用于程序的启动初始化过程。
// com.mysql.jdbc.Driver是Java JDBC 规范 核心接口实现类 java.sql.Driver
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    // 类文件加载一定执行!!!
    static {
        try {
            // DriverManager(驱动管理类) registerDriver 注册驱动
            // new Driver() ==> 当前 com.mysql.jdbc.Driver对象
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

    /**
     * 构造一个新的驱动,并且通过DriverManager(驱动管理类)注册
     * Construct a new driver and register it with DriverManager
     * 
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}
7. JDBC核心API 【重点,不需要妙】
interface java.sql.Driver 
	JDBC驱动接口,要求所有的数据库提供商完成给予Driver接口的实现过程,满足JDBC连接数据库的基本资源和驱动。

class java.sql.DriverManager
	JDBC驱动管理类
	--| static void registerDriver(java.sql.Driver driver);
		注册JDBC驱动对象,一般在对应数据库Jar中,通过static静态代码块自动完成
	--| static java.sql.Connection getConnection(String url, String user, String password);
    	根据JDBC url,对应数据库用户名和密码,获取数据库连接对象Connection

interface java.sql.Connection
	数据库连接对象Connection
	--| java.sql.Statement createStatement();
		获取当前数据库连接对象对应的,SQL语句搬运工Statement对象
	--| java.sql.PreparedStatement prepareStatement(String sql);
		获取当前数据库连接对象对应的,预处理SQL语句搬运工PreparedStatement对
		象

interface java.sql.Statement
	SQL语句搬运工Statement
	--| int executeUpdate(String sql);
		这里处理的是update insert delete SQL语句,执行用户指定的SQL语句,返
		回值类型是当前SQL语句运行对于数据库的影响行数。 1 row affected
	--| java.sql.ResultSet executeQuery(String sql);
		执行DQL语句,查询操作,返回值类型是java.sql.ResultSet结果集对象,当前
		方法返回值类型 never null

interface java.sql.PreparedStatement extends java.sql.Statement
	预处理SQL语句搬运工PreparedStatement
	--| void setXXX(int index, XXX value);
		设置任意类型参数,index为参数下标,value是对应数据
		常用 setObject(int index, Object value);
	--| int executeUpdate();
		执行PreparedStatement预处理SQL语句,可以处理的SQL语句包括 insert 
		delete update
	--| java.sql.ResultSet executeQuery();
		执行PreparedStatement预处理SQL语句,可以处理DQL语句select,返回值类
		型是查询结果集对象java.sql.ResultSet

interface java.sql.ResultSet 
	JDBC结果集接口
	--| XXX getXXX(String fieldName/ColumnName);
		可以根据字段名字获取任意指定类型数据
			String getString("userName");
			int getInt("age");
	--| boolean next(); // boolean hasNext();
		判断是否可以继续解析数据行,并且指向下一个数据行
8. Statement操作
8.1 Statement完成insert操作
public static void testInsert() {
    Statement statement = null;
    Connection connection = null;
    try {
        /*
        1. 加载驱动
        */
        Class.forName("com.mysql.jdbc.Driver");
        
        /*
        2. 明确数据库连接所需URL,user,password
        */
        String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
        String user = "root";
        String password = "123456";
        
        /*
        3.获取数据库连接对象 java.sql.Connection
        */
        connection = DriverManager.getConnection(url, user, password);
        
        /*
        4. 获取数据库搬运工对象 java.sql.Statement
        */
        statement = connection.createStatement();
        
        /*
        5. 明确SQL语句
        */
        String sql = "insert into javaee2009.student2(id, name) VALUES (1, '苟磊')";
        
        /*
        6. 执行SQL语句
        */
        int affectedRows = statement.executeUpdate(sql);
        System.out.println(affectedRows);
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    } finally {
        /*
        7. 关闭资源
        */
        try {
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
8.2 Statement完成update操作
public static void testUpdate() {
        Statement statement = null;
        Connection connection = null;


        try {
            /* 1. 加载对应驱动 */
            Class.forName("com.mysql.jdbc.Driver");

            /* 2. 准备数据连接必要条件 */
            String url = "jdbc:mysql://localhost:3306/javaee2009";
            String user = "root";
            String password = "123456";

            /* 3. 获取数据库连接线 */
            connection = DriverManager.getConnection(url, user, password);

            /* 4. 准备SQL语句 Alt + Enter ==> Inject language or references*/
            String sql = "update javaee2009.student2 set name = '华子' where id = 3";

            /* 5. 获取Statement对象 */
            statement = connection.createStatement();

            /* 6. 执行SQL语句 */
            int i = statement.executeUpdate(sql);
            System.out.println(i);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            /* 7. 关闭资源 */
            try {
                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
8.3 Statement完成delete操作
public static void testDelete() {
        Statement statement = null;
        Connection connection = null;

        try {
            /* 1. 准备驱动 */
            Class.forName("com.mysql.jdbc.Driver");

            /* 2. 准备数据连接必要内容 */
            String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
            String user = "root";
            String password = "123456";

            /* 3. 获取数据库连接对象 */
            connection = DriverManager.getConnection(url, user, password);

            /* 4. 准备SQL语句 */
            String sql = "delete from javaee2009.student2 where id = 3";

            /* 5. 获取Statement对象 */
            statement = connection.createStatement();

            /* 6. 执行 SQL语句 */
            int i = statement.executeUpdate(sql);
            System.out.println(i);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            /* 7. 关闭资源 */
            try {
                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
8.4 Statement完成select 一个数据操作
public static void testSelectOne() {
        ResultSet resultSet = null;
        Statement statement = null;
        Connection connection = null;

        try {
            // 1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2. 准备数据连接必要资源
            String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
            String user = "root";
            String password = "123456";

            // 3. 获取数据库连接
            connection = DriverManager.getConnection(url, user, password);

            // 4. 准备SQL语句
            String sql = "select * from javaee2009.student where id = 1";

            // 5. 获取Statement对象
            statement = connection.createStatement();

            // 6. 执行SQL语句,获取ResultSet结果集对象 Ctrl + Shift + Enter
            resultSet = statement.executeQuery(sql);

            Student student = null;
            // 7. 解析ResultSet
            while (resultSet.next()) {
                // 根据字段名获取对应的数据,并且根据字段数据类型来进行方法选择
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                String info = resultSet.getString("info");
                float score = resultSet.getFloat("score");

                student = new Student(id, name, age, info, score);
            }

            System.out.println(student);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }

                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
8.5 Statement完成select 多条数据操作
public static void testSelectAll() {
        ResultSet resultSet = null;
        Statement statement = null;
        Connection connection = null;

        try {
            // 1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2. 准备数据连接必要资源
            String url = "jdbc:mysql://localhost:3306/javaee2009?useSSL=false";
            String user = "root";
            String password = "123456";

            // 3. 获取数据库连接
            connection = DriverManager.getConnection(url, user, password);

            // 4. 准备SQL语句
            String sql = "select * from javaee2009.student;";

            // 5. 搞一个Statement对象
            statement = connection.createStatement();

            // 6. 执行SQL语句,获取ResultSet
            resultSet = statement.executeQuery(sql);

            ArrayList<Student> list = new ArrayList<>();

            // 7. 解析ResultSet结果集对象
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                String info = resultSet.getString("info");
                float score = resultSet.getFloat("score");

                list.add(new Student(id, name, age, info, score));
            }

            // 数组/集合.iter ==> 增强for循环
            for (Student student : list) {
                System.out.println(student);
            }

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }

                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
9. JDBCUtil工具类封装
9.1 JDBCUtil工具类封装目的
JDBC工具类
	1. JDBC数据库连接所需的必要资源准备和驱动加载
	2. 提供一个工具类方法,获取数据库连接对象 Connection getConnection
	3. 关闭用户使用的数据库资源
9.2 JDBC数据库连接所需的必要资源准备和驱动加载
将数据库连接使用配置内容,写入到Properties文件
# JDBC数据库连接配置资源
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/javaee2009?useSSL=false
user=root
password=123456
期望配置文件可以自动加载到当前程序中,并且可以根据配置文件直接加载JDBC驱动

使用静态代码块
/* 准备必要的静态成员变量,用于从Properties文件中读取对应的数据 */
private static String jdbcUrl = null;
private static String user = null;
private static String password = null;

/* static修饰静态代码块,根据静态代码块特征,完成自动加载过程 */
static {
    try {
        // 1. 创建对应当前Properties文件的FileInputStream 文件操作字节输入流
        FileInputStream fis = new FileInputStream("./src/db.properties");
       
        // 2. 创建Properties对象
        Properties properties = new Properties();
        properties.load(fis);
       
        // 3. 从配置文件中读取内容
        jdbcUrl = properties.getProperty("jdbcUrl");
        user = properties.getProperty("user");
        password = properties.getProperty("password");
        
        // 4. 加载驱动
        Class.forName(properties.getProperty("driverClass"));
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}
9.3 提供一个工具类方法,获取数据库连接对象
/**
 * 获取数据库连接对象方法
 *
 * @return java.sql.Connection 对象。如果获取连接失败返回null
 */
public static Connection getConnection() {
    Connection connection = null;
    try {
        connection = DriverManager.getConnection(jdbcUrl, user, password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return connection;
}
9.4 关闭用户使用的数据库资源
需要考虑关闭的数据:
	Connection 数据库连接对象
	Statement 数据库搬运工对象
	ResultSet 数据库查询结果集对象
	
	以上三个都是AutoCloseable子接口
/**
 * 数据库操作使用的资源都是AutoCloseable接口的实现类,可以使用
 * 不定长参数直接完成关闭方法,传入的参数是AutoCloseable实现类
 * 个数不限
 *
 * @param res AutoCloseable实现类对象,个数不限
 */
public static void close(AutoCloseable... res) {
    try {
        // 遍历当前AutoCloseable数组,使用增强for循环
        for (AutoCloseable re : res) {
            // 当前资源不为null,直接关闭
            if (re != null) {
                re.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值