JDBC-1(概述&建立)

时间:2024-02-19 22:35:11

基于宋红康老师所讲JDBC所作笔记

1.JDBC概述

1.1 数据持久化

  • 持久化:将数据保持到可掉电式存储设备中以供之后使用。
    数据持久化意味着将内存中的数据保存到硬盘上加以固化,实现过程大多通过各种关系数据库完成。

主要应用:将内存中的数据存储在关系型数据库中(也可存储于磁盘文件、XML数据文件中)

1.2 Java中的数据存储技术

  1. JDBC直接访问数据库
  2. JDO(Java Data Object)技术
  3. 第三方O/R工具(Mybatis)

1.3 JDBC介绍

  • JDBC(Java Database Connectivity)独立于特定数据库管理系统,通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库
  1. JDBC为访问不同数据库提供了统一的途径,屏蔽了一些细节问题
  2. JDBC的目标是使Java程序员使用JDBC链接任何提供了JDBC驱动程序的数据库系统,使程序员无需对特定数据库系统特点有过多了解,简化加快开发过程。

1.4 JDBC体系结构

  • JDBC接口(API)包括两个层次:
    1. 面向应用的API:Java API,抽象接口,供程序开发人员使用(链接数据库,执行SQL语句,获得结果)
    2. 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序

2.JDBC连接

2.1 Driver

2.1.1 Driver接口简介

  1. java.sql.Driver接口是所有JDBC驱动程序需要实现的接口,该接口提供给数据库厂商使用,不同数据库厂商提供不同实现。
  2. 程序中不需直接访问Driver接口实现类,由驱动程序管理器类调用这些类
    • MySQL:com.mysql.cj.jdbc.Driver(引入jar包为8.0版本)

2.1.2 加载与注册JDBC

2.2 URL(统一资源定位符)

  1. URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序从而建立到数据库的连接。
  2. URL由三部分组成 jdbc:子协议:子名称 String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";
    1. 协议 jdbc
    2. 子协议:mysql
    3. 一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名

注:jdbc:mysql://localhost:3306/atguigu?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)

2.3 用户名和密码

  • user,password可以用“属性名=属性值”方式告诉数据库
  • 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接

2.4 数据库连接方式举例

方式一

点击查看代码
public class ConnectionTest {

    @Test
    public void testConnection1() throws SQLException {
        Driver driver = new com.mysql.cj.jdbc.Driver();
        //jdbc:mysql 协议
        //localhost: ip地址
        //3306:默认mysql端口号; test:数据库
        String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC"; //统一资源定位符

        //将用户名和密码封装在此
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "root");
        Connection connection = driver.connect(url, info);
        System.out.println(connection);
    }
}

方式二:不出现第三方API,使程序具有更好可移植性

点击查看代码
    @Test //2禁止第三方迭代
    public void testConnection2() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //1.用反射实现获取Driver实现类对象
        Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();

        //2.提供要连接的数据库
        String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";

        //3.提供连接需要的用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "root");

        //4.获取链接
        Connection connection = driver.connect(url, info);
        System.out.println(connection);
    }

方式三:使用DriverManager替换Driver

点击查看代码
    @Test //3使用DriverManager替代Driver
    public void testConnection3() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //1.使用DriverManager替代Driver
        Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();

        //2.提供要连接的数据库
        String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";

        //3.提供连接需要的用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "root");

        //注册驱动
        DriverManager.registerDriver(driver);

        //获取连接
        //4.获取链接
        Connection connection = DriverManager.getConnection(url, info);
        System.out.println(connection);
    }

方式四:

点击查看代码
    @Test //4 相较于方式三省略类的显式加载流程(与MySQL Driver实现类静态代码块有关)
    public void testConnection4() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //1.获取三个连接的基本信息
        String url = "jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC";
        String user = "root";
        String password = "root";

        //2.加载Driver(Driver提供了一个静态代码块,加载时自动执行)
        Class.forName("com.mysql.cj.jdbc.Driver");

        //3.获取连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection.toString());
    }
}

方式五:使用配置文件加载四个配置信息

点击查看代码
    @Test //5 将数据库连接的基本信息配置在配置文件中,通过读取配置文件的方式获取连接
    public void testConnection5() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {

        //1. 读取配置文件的4个配置信息
        InputStream inputStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties prop = new Properties();
        prop.load(inputStream);

        String user = prop.getProperty("user");
        String password = prop.getProperty("password");
        String url = prop.getProperty("url");
        String driverClass = prop.getProperty("driverClass");

        //2.加载驱动
        Class.forName(driverClass);

        //3.启动连接
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println(connection);
    }
点击查看配置文件jdbc.properties
url=jdbc:mysql://localhost:3306/user_db?serverTimezone=UTC
user=root
password=root
driverClass=com.mysql.cj.jdbc.Driver

优势:

  1. 实现数据和代码的分离,降低程序耦合度
  2. 如果需要修改配置文件信息,可避免程序重新打包