JDBC-01:如何获取数据库连接

news2024/12/22 20:07:45

文章目录

      • 初步了解jdbc
        • JDBC程序编写步骤
        • Driver接口介绍
        • 导入驱动(idea)
        • 加载与注册JDBC驱动
      • 要素一:URL
      • 要素二:用户名和密码
      • 获取数据库连接
        • 获取数据库连接的方式一
        • 获取数据库连接的方式二
        • 获取数据库连接的方式三
        • 获取数据库连接的方式四
        • 获取数据库连接的方式四(附加解释)
        • 获取数据库连接的方式最终版(final)
        • 该方法的好处

初步了解jdbc

JDBC程序编写步骤

在这里插入图片描述

  • ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC API,由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求。

Driver接口介绍

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

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

    • Oracle的驱动:oracle.jdbc.driver.OracleDriver
    • mySql的驱动: com.mysql.jdbc.Driver

导入驱动(idea)

这里的jar包是MySQL5.1.7驱动

官网下载连接:https://downloads.mysql.com/archives/c-j/

  1. 工程右键new—Directory—命名lib—粘贴jar包进去

在这里插入图片描述

  1. 导入jar包后lib文件右键Add as Library

在这里插入图片描述

  1. 如图所示,然后ok即可

在这里插入图片描述

加载与注册JDBC驱动

  • 加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

    • Class.forName(“com.mysql.jdbc.Driver”);
  • 注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序

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

    • 通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。下图是MySQL的Driver实现类的源码:

      在这里插入图片描述

要素一:URL

  • JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。

  • JDBC URL的标准由三部分组成,各部分间用冒号分隔。

    • jdbc:子协议:子名称
    • 协议:JDBC URL中的协议总是jdbc
    • 子协议:子协议用于标识一个数据库驱动程序
    • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
  • 举例:

    在这里插入图片描述

  • 几种常用数据库的 JDBC URL

    • MySQL的连接URL编写方式:

      • jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
      • jdbc:mysql://localhost:3306/atguigu
      • jdbc:mysql://localhost:3306/atguigu**?useUnicode=true&characterEncoding=utf8**(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
      • jdbc:mysql://localhost:3306/atguigu?user=root&password=123456
    • Oracle 9i的连接URL编写方式:

      • jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
      • jdbc:oracle:thin:@localhost:1521:atguigu
    • SQLServer的连接URL编写方式:

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

      • jdbc:sqlserver://localhost:1433:DatabaseName=atguigu

要素二:用户名和密码

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

获取数据库连接

(注意!连接方式的12345是迭代关系,并不是说有好几种连接方式)

获取数据库连接的方式一

在这里插入图片描述

@Test
public void test1() throws SQLException {
    //获取Driver实现类对象
    Driver driver = new com.mysql.jdbc.Driver();
    //url:jdbc:mysql://localhost:3305/test
    //jdbc:mysql:协议
    //localhost:ip协议
    //3305:mysql端口号
    //test:数据库名
    String url = "jdbc:mysql://localhost:3305/test";
    //将用户名和密码封装在Properties中
    Properties info =new Properties() ;
    info.setProperty("user","root");
    info.setProperty("password","666666");
    Connection connect = driver.connect(url, info);
    System.out.println(connect);
}

获取数据库连接的方式二

(对方式一的迭代)

迭代是因为希望程序有更好的可移植性,在上述方式一中,实例化的时候new的com.mysql.jdbc.Driver()是第三方的

参考文章:Java反射03:创建运行时类的对象

目的:在如下的程序中不出现第三方的api,使得程序有更好的可移植性

//获取Driver的实现类对象(反射)
@Test
public void test2() throws Exception {
    //1.获取Driver的实现类对象(反射)
    Class clazz = Class.forName("com.mysql.jdbc.Driver");
    //该方法若要调用成功得保证上面的Driver有空参构造器而且权限可以用(具体看上面参考文章)
    Driver driver = (Driver) clazz.newInstance();
    /*
    上述两行代码替换方法一的第一行代码
     */
    //2.提供要连接的数据库
    String url="jdbc:mysql://localhost:3305/test";
    //3.提供连接需要的用户名和密码
    Properties info = new Properties();
    info.setProperty("user","root");
    info.setProperty("password","666666");
    //4.获取连接
    Connection c1 = driver.connect(url, info);
    System.out.println(c1);
}

获取数据库连接的方式三

使用DriverManager替换Driver

在这里插入图片描述

查看API知道上述三个方法返回了Conection,一般使用第三个更加方便,在这之前需要获得Drive实例,用下面的方法registerDriver注册驱动

在这里插入图片描述

代码如下:

//使用DriverManager替换Driver
@Test
public void test3() throws Exception {
    //1.获取Driver实现类对象
    Class clazz = Class.forName("com.mysql.jdbc.Driver");
    Driver driver =(Driver) clazz.newInstance();
    //2.提供另外三个连接的基本信息
    String url="jdbc:mysql://localhost:3305/test";
    String user="root";
    String password="666666";
    //注册驱动
    DriverManager.registerDriver(driver);
    //获取连接
    Connection c3 = DriverManager.getConnection(url, user, password);
    System.out.println(c3);
}

获取数据库连接的方式四

注:四是在三的基础上优化,驱动的部分有优化的空间,因为提供三个连接的基本信息肯定不能改,获取连接也一定调用相关方法,可以对其他的地方进行优化,可以只是加载驱动,不用显示的注册驱动了

首先看Driver源码里面

在这里插入图片描述

这里是有一个静态代码块的,静态代码块就已经注册了驱动,所以甚至可以在方法三的基础上把驱动的部分去掉,如下代码,仍然是可以执行的

@Test
    public void test4() throws Exception{
        //1.获取Driver实现类对象
        Class.forName("com.mysql.jdbc.Driver");
        
        //2.提供另外三个连接的基本信息
        String url="jdbc:mysql://localhost:3305/test";
        String user="root";
        String password="666666";
       // (相较于方式三,可以省略如下操作)
        
        
        /*
        Driver driver =(Driver) clazz.newInstance();
        //注册驱动
        DriverManager.registerDriver(driver);
        */
        
        
        //为什么可以省略?MySQL的Drriver实现类中,声明了如下操作
        
        
        /*
        static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
         */
        
        
        //获取连接
        Connection c3 = DriverManager.getConnection(url, user, password);
        System.out.println(c3);
    }

获取数据库连接的方式四(附加解释)

首先看代码

@Test
    public void test5() throws Exception{
//1.获取Driver实现类对象
//        Class clazz = Class.forName("com.mysql.jdbc.Driver");

        //2.提供另外三个连接的基本信息
        String url="jdbc:mysql://localhost:3305/test";
        String user="root";
        String password="666666";
        // (相较于方式三,可以省略如下操作)


        /*
        Driver driver =(Driver) clazz.newInstance();
        //注册驱动
        DriverManager.registerDriver(driver);
        */


        //为什么可以省略?见源码:


        /*
        static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
         */


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

这里和方法四的区别是,连加载Driver都给注册了,仍然可以连接成功

先看驱动下如图文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNOB9Asu-1667294111856)(C:\Users\金士曼\Desktop\尚硅谷课程截图\JDBC\方法五.png)]

解释:上述文件的路径就是所省略路径,在导入jar包的时候就已经读文件,把第一个步骤的事情都给做了

但是!这一步通常不可以省略!!

  • 因为是mysql可以注释掉,假如换一个数据库比如Oracle,就不好使了,因为连接的时候不一定连接MySQL,综合来看通用的角度上,是不可以省略的

代码:

@Test
public void test666() throws Exception{
        //1.获取Driver实现类对象
        Class.forName("com.mysql.jdbc.Driver");
        //2.提供另外三个连接的基本信息
        String url="jdbc:mysql://localhost:3305/test";
        String user="root";
        String password="666666";
        //3.获取连接
        Connection c3 = DriverManager.getConnection(url, user, password);
        System.out.println(c3);
    }

获取数据库连接的方式最终版(final)

  • 将数据库连接需要的4个基本信息声明在配置文件当中,通过读取配置文件的方式获取连接

配置文件

在工程下新建文件:jdbc.properties

user=root
password=666666
url=jdbc:mysql://localhost:3305/test
driverClass=com.mysql.jdbc.Driver

代码:

@Test
public void test1() throws Exception{
    //1.读取配置文件中的4个基本信息(通过类的加载器)
    InputStream is = getConnection.class.getClassLoader().getResourceAsStream("jdbc.properties");
    Properties p1 = new Properties();
    p1.load(is);
    String user = p1.getProperty("user");
    String password = p1.getProperty("password");
    String url = p1.getProperty("url");
    String driverClass = p1.getProperty("driverClass");
    //2.加载驱动
    Class.forName(driverClass);
    //3.获取连接
    Connection connection = DriverManager.getConnection(url, user, password);
    System.out.println(connection);
}

该方法的好处

使用配置文件的好处:

①实现了代码和数据的分离,实现了解耦,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码,避免程序重新打包
②如果修改了配置信息,省去重新编译的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS移植STM32 printf()函数重定向到USART3

我们在移植FreeRTOS过程中如果没有printf()函数打印调试信息到串口精灵,则程序开发就会非常不方便。本文实现STM32工程上的printf()函数,方便用于程序开发中调试信息打印到电脑上的串口调试精灵。 最简单的方法就是使用MicroLIB库。 一、KEIL-MDK中勾选U…

字体管理工具 - RightFont使用教程

RightFont RightFont是 Mac OS X 上一款非常轻巧的字体管理工具,目前已经完成了与 PhotoShop、Sketch 两大设计应用的集成。RightFont 是 Mac系统上一款优秀的字体管理工具,专为设计师设计,轻量化和简洁,可以方便快速的管理你的字…

《C陷阱与缺陷》读书笔记1

词法分析:贪心法 主要就是解释词法分析时的原则,即: 编译器将程序分解为符号时,从左到右一个字符接一个字符的读入。如果编译器的输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之…

Linux文件锁的使用

文件是一种共享资源,多个进程对同一文件进行操作的时候,必然涉及到竞争状态,因此引入了文件锁实现对共享资源的访问进行保护的机制,通过对文件上锁, 来避免访问共享资源产生竞争 状态。 一、文件锁的分类 1.建议性锁 建议性锁本质上是一种协…

Java并发编程——Threadlocal源码解析

Threadlocal源码解析一、基本结构二、ThreadLocal操作set操作get操作remove操作三、内存泄露?四、ThreadLocalMap核心变量数组下标计算方式阈值计算扩容下标冲突(hash冲突)从名称上来看可以理解为线程本地变量,也可以认为是线程局…

(JAVA)认识Java中的数据类型和变量

文章目录前言1.字面常量2. 数据类型3.变量3.1 变量概念3.2 语法格式3.3 整形变量3.4 浮点型变量3.5 字符型变量3.6布尔类型变量3.7 类型转换3.7.1 隐式转换(自动类型转换)3.7.2 显示转换 (强制类型转换)3.8 类型提升4. 字符串类型…

驱动开发:内核层InlineHook挂钩函数

在上一章《驱动开发:内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致,都是使用劫持执行流并跳…

三类基于贪心思想的区间覆盖问题【配套资源详解】

博主主页:Yu仙笙 配套资源:三类基于贪心算法覆盖问题-C文档类资源-CSDN下载 目录 三类基于贪心思想的区间覆盖问题 情形1:区间完全覆盖问题 描述: 样例: 解题过程: 例题: 题意: 例题&#xff1a…

深入理解Kafka服务端之索引文件及mmap内存映射

深入理解Kafka服务端之索引文件及mmap内存映射 - 墨天轮 一、场景分析 Kafka在滚动生成新日志段的时候,除了生成日志文件(.log),会同时生成一个偏移量索引文件(.index)、一个时间戳索引文件(.timeindex)和一个已中止事务索引文件(.txnindex)。 由于索引写…

JVM面试高频问题

一、进程与线程 在谈JVM的这些问题前,我们先来复习一下有关线程和进程的关系 进程可以看作是程序的执行过程。一个程序的运行需要CPU时间、内存空间、文件以及I/O等资源。操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位。线…

C语言函数章--该如何学习函数?阿斗看了都说会学习了

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

【Python入门指北】 发邮件与正则表达式

文章目录邮件发送一、群发邮件二、指定用户发邮件正则表达式一、预备知识正则1. 正则介绍2. 陷阱3. 特殊的字符二、 re 模块的方法1 常用方法2. 正则分组总结邮件发送 #第三方模块 yagmail #pip3 install yagmailimport yagmail""" 项目需求 yag yagmail.SMTP(u…

MyBatis Plus实现动态字段排序

利用周末时间,对已有的项目进行了升级,原来使用的是tkmybatis,改为mybatis plus。但是由于修改了返回数据的格式,前端页面字段排序失效了,需要刷新表格才会排序。页面效果如下 easyui的数据表格datagrid支持多字段排序…

【仿牛客网笔记】Spring Boot实践,开发社区登录模块-账号设置,检查登录

首先访问账号设置的页面。 新建一个Controller,用过RequestMapping生成访问路径 上传头像 首先打开配置文件,配置一下将文件配置到哪里。 直接在Controller存了, 更新的时候掉Map,参数为id和路径。 注入日志对象后,通过Val…

SpringBoot项目启动执行任务的几种方式

经过整理后得到以下几种常用方式,供大家参考。 1. 使用过滤器 init() :该方法在tomcat容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。可以在这个方法中补充想要执行的内容。 Component public class MyFilter …

CTF竞赛网络安全大赛(网鼎杯 )Web|sql注入java反序列化

CTF竞赛网络安全大赛题目考点 sql注入 java反序列化 网鼎杯解题思路 题目一打开是这样的界面 下载题目的附件,并用jd-gui.exe打开 核心代码如下 Test代码 `` package 部分class;import cn.abc.common.bean.ResponseCode; import cn.abc.common.bean.ResponseResult; impor…

持续交付中流水线构建完成后就大功告成了吗?别忘了质量保障

上期文章我结合自己的实践经验,介绍了持续交付中流水线模式的软件构建,以及在构建过程中的3个关键问题。我们可以看出,流水线的软件构建过程相对精简、独立,只做编译 和打包两个动作。 但需要明确的是,在持续交付过程…

网课查题接口使用方法

网课查题接口使用方法 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点…

Hadoop面试题汇总-20221031

Hadoop面试题汇总 HDFS部分 1、请描述HDFS的写流程。 答: 首先由客户端向 NameNode 发起文件上传请求,NameNode 检查文件要上传的目录,并鉴权。如果上传用户对此目录有权限,则允许客户端进行上传操作。客户端接收到允许指令后&…

本科毕业论文内容必须有国内外文献综述吗?

不知不觉间整个暑假变过去了,现在大部分的大学生都已经开学了。2023届毕业的学生现在也开始借鉴毕业论文的选题工作。但是无论是现在正在选题的大四的同学们还是还在上大一大,二大三的同学们都对毕业论文这4个字有着天生的恐惧感。因为对于大多数人来说&…