jdbc的基础知识与几种注册方法

第一部分 jdbc概述

1、JDBC(Java DataBase Connectivity),即Java数据库连接技术。它是一套用于访问【关系型数据库】的应用程序API,由一组用Java语言编写的【类和接口】组成。

1660051542079

2、jdbc是一种规范,它由Sum公司(Oracle)提供了一套完整的接口。JDBC规范提供的接口存在于java.sql包中,如下:

1660013310457

3、不同的数据库厂商只需要【按照jdbc规范】提供的api接口进行各自的实现,程序员只需要【面向接口和规范】编程,不需要关心具体的实现。

不同数据库的底层技术不同,不少数据库还是闭源的,源代码不公开的。Sun公司不可能为所有数据库提供具体实现,只能提供一套统一的接口规范。

1660051428573

4、Mysql提供的【JDBC实现】称为Mysql Connector,不同的数据库版本需要使用不同的Connector。实际开发时根据数据库版本、JDK版本、选择不同的Connector。

Connector版本MySQL版本JDK版本
8.05.6, 5.7, 8.0JDK 8.0 或更高
5.15.6, 5.7JDK 5.0 或更高

选择自己对应的版本下载:

https://developer.aliyun.com/mvn/search

或者

https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.30

进行下载

第二部分 获取连接

JDBC中定义了操作数据库的各种接口和类型,以下可能会使用到,如下:

接口作用
Driver驱动接口
DriverManager工具类,用于管理驱动,可以获取数据库的链接
Connection表示Java与数据库建立的连接对象(接口)
PreparedStatement发送SQL语句的工具
ResultSet结果集,用于获取查询语句的结果

我们使用java代码获取mysql连接时需要以下三个要素:

一 、驱动

1、Driver接口介绍

java.sql.Driver 接口是所有【驱动程序】需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。

在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。

不同的厂商提供了不同的驱动,如下:

- Oracle的驱动:oracle.jdbc.driver.OracleDriver
- mySql 的驱动:com.mysql.cj.jdbc.Driver | com.mysql.jdbc.Driver

将上述jar包拷贝到Java工程的一个目录中,习惯上新建一个lib文件夹,不同的idea有不同的操作。

2、加载与注册驱动
  • 加载驱动:我们需要将数据的的驱动实现类加载到JVM中,实现这个目的我们可以使用 Class 类的静态方法 forName(),向其传递要加载的驱动的类名Class.forName(“com.mysql.cj.jdbc.Driver”)。当然,理论上你new一个也行,第一次主动使用一个类就会触发类的加载。这里【为什么不new】我们先卖一个关子。

    Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
  • 创建驱动:

    Driver driver = (Driver) clazz.newInstance();
  • 注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序。

    使用DriverManager.registerDriver(com.mysql.cj.jdbc.Driver)来注册驱动。

    DriverManager.registerDriver(driver);

二、URL

1、URL 用于标识一个被注册的驱动程序,从而建立到数据库的连接。

2、URL的标准由三部分组成,各部分间用冒号分隔:

  • 协议:java的连接URL中的协议总是jdbc 。

  • 子协议:子协议用于标识一个数据库驱动程序。

  • 子名称:一种标识【数据库】的方法。子名称作用是为了【定位数据库】。其包含【主机名】(对应服务端的ip地址),【端口号】,【数据库名】。

3、MySQL的连接URL编写方式:

  • jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值。

  • 最简单的写法:jdbc:mysql://localhost:3306/ydlclass。

  • 带参数的写法:jdbc:mysql://localhost:3306/ydlclass?key1=value1&key2=value2

  • mysql8.0后必需要加上serverTimezone=UTC",指定当前服务器所处的时区。(也要看jdbc的版本)

    serverTimezone=Asia/Shanghai

    我们也可以使用UTC(世界统一时间),但是这个时间和中国的时间差八小时(东八区),所以我们可以这样写:

    serverTimezone=GMT%2B8(%2B相当于“+”号)

image-20220810130615995

image-20220810130615995

注:通常一个高版本的mysql的url还会包含以下三个参数:

useUnicode=true&characterEncoding=utf8&useSSL=false

1、useUnicode=true&characterEncoding=UTF-8的作用是:指定字符的编码、解码格式。

比如:若mysql数据库用到 是GBK编码方式,而项目数据用的是UTF-8编码方式。这时如果添加了"useUnicode=true&characterEncoding=UTF-8",则在存取数据时根据mysql和项目的编码方式将数据进行相应的格式转化。即:

(1)存数据

数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码,并存放到数据库中。

(2)取数据

在数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

2、MySQL5.7之后要加上useSSL=false,mysql5.7以及之前的版本则不用进行添加useSSL=false,会默认为false。

  • useSSL=true:就是一般通过证书或者令牌进行安全验证

  • useSSL=false:就是通过账号密码进行连接

  • SSL协议提供服务主要: 认证用户服务器,确保数据发送到正确的服务器; . 加密数据,防止数据传输途中被窃取使用; 维护数据完整性,验证数据在传输过程中是否丢失;

完整的url:

jdbc:mysql://localhost:3306/ydlclass?
serverTimezone=GMT%2B8&useUnicode=true
&characterEncoding=utf8&&useSSL=false

小知识:

  • Oracle 的连接URL编写方式:

    jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称

    jdbc:oracle:thin:@localhost:1521:ydlclass

  • SQLServer的连接URL编写方式:

    jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称

    jdbc:sqlserver://localhost:1433:DatabaseName=ydlclass

三、用户名和密码

可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接,此方法需要传递三个参数:

  • url:jdbc:mysql://localhost:3306/ydlclass?useUnicode=true&characterEncoding=utf8&&useSSL=false&serverTimezone=GMT%2B8

  • username:root (mysql数据库的用户名)

  • password:root (mysql数据库的密码)

四、获取连接方法

第一种方法:普通看似正常的获取连接

@Test
    public void testConnection1() throws SQLException {
        //1 定义要素
        String driverName = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/ydlclass";
        String username = "root";
        String password = "root";
​
        //2. 加载驱动,实例化驱动
            Driver driver = new com.mysql.cj.jdbc.Driver();
        //3. 注册驱动
        DriverManager .registerDriver(driver);
        //4. 获取连接
        Connection connection = DriverManager.getConnection(url, username, password);
        System.out.println(connection);
​
    }

第二种方法:jvm注册驱动

 @Test
    public void testConnection2() throws SQLException, ClassNotFoundException {
        //1 定义要素
        String url = "jdbc:mysql://localhost:3306/ydlclass";
        String username = "root";
        String password = "root";
​
        //2. 加载驱动,实例化驱动
        //仅仅需要jvm注册一下就可以了
        new com.mysql.cj.jdbc.Driver();
        //3. 注册驱动
//        DriverManager .registerDriver(driver);
        //4. 获取连接
        Connection connection = DriverManager.getConnection(url, username, password);
        System.out.println(connection);
​
    }
在现在的jdbc中一般默认驱动注册为自动加载与注册
简称spi机制

所以可以直接使用connection就能完成jdbc的注册工作

第三种 方法

 @Test
    public void testConnection2() throws SQLException, ClassNotFoundException {
        //1 定义要素
        String url = "jdbc:mysql://localhost:3306/ydlclass";
        String username = "root";
        String password = "root";
​
        //获取连接,并自动注册驱动
        Connection connection = DriverManager.getConnection(url, username, password);
        System.out.println(connection);
    }
查询案例
 @Test
    public void testConnection2() throws SQLException, ClassNotFoundException {
        //1 定义要素
        String url = "jdbc:mysql://localhost:3306/ydlclass";
        String username = "root";
        String password = "root";
​
        //获取连接,并自动注册驱动
        Connection connection = DriverManager.getConnection(url, username, password);
        //Statement:用于执行静态 SQL 语句并返回它所生成结果的对象
        Statement statement = connection.createStatement();
        //Query获得返回结果的一个集合,可以在executeQuery中直接添加sql语句
        ResultSet resultSet = statement.executeQuery(sql);
        //resultSet.next()相当于一个迭代器
        while( resultSet.next()) {
            //把数据库表中对象实体化
            User user = new User();
            //获取当前query中的那一列
            int id = resultSet.getInt(1);
            String username = resultSet.getString(2);
            String password = resultSet.getString(3);
            Date birthday = resultSet.getDate(4);
            //把数据库的内容写到user对象中
            user.setId(id);
            user.setUsername(username);
            user.setPassword(password);
            user.setDate(birthday);
            //重写了是实体类所以现在打印直接是字符串
            System.out.println(user);
        }
    }

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值