JDBC之获取数据库连接方法详解

数据的持久化

持久化:把数据保存到可掉电式存储设备中以供以后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系库来完成

主要应用

持久化的主要应用是将内存中的数据库存储在关系型数据库中,当然也可以存储在磁盘中XML数据文件
在这里插入图片描述

在java中,数据库技术可分为如下几类:

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

注意: JDBC是java访问数据库的基石,JDOHibernateMyBatis等只是更好的封装了JDBC

导入mysql-connector-java-5.1.7-bin.jar包

  1. 打开项目,选择“file->project structure”,或者使用快捷键Ctrl +Alt +Shift +S
    在这里插入图片描述

  2. 在打开的窗口中可以看到“Modules”及其依赖项
    在这里插入图片描述

  3. 点击“dependencies”中的“+”选择合适的选项,比如“Jars or Directories”
    在这里插入图片描述

  4. 这个选项会打开文件管理器,选择相应文件夹,其中存放着已下载好的JAR包
    在这里插入图片描述

  5. 新加入的依赖包可以在Dependencies中查看,设置完成后选择“OK”即可
    在这里插入图片描述

  6. 添加好项目的JAR包之后,可以在项目文件夹中查看,如图所示
    在这里插入图片描述

注意:

在这里插入图片描述
我试过8.0.18里面的驱动器,然后全程报错,换成5.1.7的驱动器,就没问题了,建议版本不要太高

JDBC的介绍:

简介

JDBCJava Database Connectivity)只是一个独立于特定数据库管理系统,通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据的标准java类库,(java.sqljavax.sql)使用这些类库可以以一种标准的方法,方便地访问数据库资源

作用

JDBC访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题

目标

JDBC的目标是使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无序对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程

对比说明

如果没有JDBC,那么java程序访问数据库时是这样的:

在这里插入图片描述

Oracle:(MySQL Oracle) 微软:SQLsever IBM: DB2

有了JDBC,java程序访问数据库时是这样的:

在这里插入图片描述

总结如下(真实情况):

在这里插入图片描述

JDBC接口(API)包括两个层次:

面向应用的API:

java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)

面向数据库的API:

Java Driver API,供开发商开发数据库驱动程序使用

JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可

注意:

不同的数据库厂商,需要针对这套接口,提供不同的实现,不同的实现的集合,即为不同数据库的驱动
--------------------面向接口编程

JDBC程序编写步骤:

在这里插入图片描述

CRUD编程

增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete) 即CRUD编程

(返回结果集的情况(也就是查))

开始 ---------->导入java.sql包------------>附加相应厂商提供的驱动(即实现一堆抽象方法(这个抽象方法也就是所商量出来的一种标准))--------------->加载并注册驱动程序-------------->创建Connection对象-------------->创建Statement对象---------------->执行SQL语句(查询(返回结果集))----->使用ResultSet对象----------->关闭ResultSet对象---------->关闭Statement对象----------->关闭Connection对象-------->结束

(不返回结果集的情况(也就是增删改))

开始 ---------->导入java.sql包------------>附加相应厂商提供的驱动(即实现一堆抽象方法(这个抽象方法也就是所商量出来的一种标准))--------------->加载并注册驱动程序-------------->创建Connection对象-------------->创建Statement对象----------------->执行SQL语句(更新:即增删改(并不返回结果集))--------------->关闭Statement对象---------------->关闭Connection对象------------->结束

补充:

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

获取数据库的连接:

要素一:Driver接口实现类

Driver接口介绍

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

在程序中不需要去直接访问Driver接口的类,而是 由驱动程序管理器类java.sql.DriverManager)去调用这些Driver实现
Oracle的驱动:Oracle.jdbc.driver.OracleDriver
Mysql的驱动:com.mysql.jdbc.Driver

加载与注册JDBC驱动

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

Class.forName("com.mysql.jdbc.Driver")

注册驱动:DriverManager类是驱动程序管理器类负责管理驱动程序
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
通常不同显式调用DriverManger类的registerDriver()方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例。

下图是MYSQL的Driver实现类的源码:

static{
    
    
try{
    
    
java.sql.DriverManager.registerDriver(new Driver());
}catch(SQLException	E){
    
    
throw	new RuntimeException("Can't register driver!");
}
}

要素二:URL

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

JDBC URL的标准由三部分组成,
jdbc:子协议:子名称

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

举例:

jdbc:mysql://localhost:3306/test

协议:jdbc
子协议:mysql
子名称:localhost:3306/test

几种常用数据库的JDBC URL

MYSQL的连接

连接方式1:

import java.sql.Connection;
import java.sql.Driver;
import java.util.Properties;

public class Test1 {
    
    
    public static void main(String[] args)throws Exception {
    
    
        Driver driver=new com.mysql.jdbc.Driver();
        String url="jdbc:mysql://localhost:3306/test";

        Properties info =new Properties();
        info.setProperty("user","root0");
        info.setProperty("password","abc123");

        Connection conn=driver.connect(url,info);
        System.out.println(conn);
    }
}

实现截图

在这里插入图片描述

连接方式2

(对方式1的迭代,在如下的程序中不出现第三方的API,使得程序具有更好的可移植性):
java程序面向接口编程,希望具有可移植性,代码中不能出现第三方API

1.获取Driver实现类对象:使用反射

  Class clazz=Class.forName("com.mysql.jdbc.Driver");
        Driver driver=(Driver)clazz.newInstance();

2.提供要连接的数据库

   String url="jdbc:mysql://localhost:3306/test";

3.提供连接需要的用户名和密码

  		Properties info =new Properties();
        info.setProperty("user","root0");
        info.setProperty("password","abc123");

4.获取连接

Conneciton	connection=driver.connect(url,info);
 System.out.println(conn);

实现截图

在这里插入图片描述

连接方式3:

使用DriverManager(是一个类,并非接口)替换Driver

1.获取driver实现类的对象

 		Class clazz=Class.forName("com.mysql.jdbc.Driver");
        Driver driver=(Driver)clazz.newInstance();

2.提供三个连接的基本信息

String  url="jdbc:mysql://localhost:3306/test"
String user="root0"
String password="abc123"

3.注册驱动

  DriverManager.registerDriver(driver);

4.获取连接:

 Connection conn=DriverManager.getConnection(url,user,password);
  System.out.println(conn);

实现截图

在这里插入图片描述

方式4

只是加载驱动,不用显示注册驱动

1.提供三个连接的基本信息

String  url="jdbc:mysql://localhost:3306/test"
String user="root0"
String password="abc123"

2.加载驱动(加载驱动类时,静态代码块会执行)

Class.forName("com.mysql.jdbc.Driver");

3.获取连接:

Conneciton coon=DriverManager.getConnection(url,user,password);
 System.out.println(conn);

//相较于方式三,可以省略如下操作:

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

//为什么可以省略上述操作呢?
在MySQL的Driver实现类中,声明了如下的操作:

实现截图

在这里插入图片描述

注意:

注册驱动过程在静态加载时已经完成(静态代码块的执行是在类加载的时候)

把加载Driver类省略后运行:

即把下面这行代码省略:

Class.forName("com.mysql.jdbc.Driver");

执行代码:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;

public class Test1 {
    
    
    public static void main(String[] args)throws Exception {
    
    

        String  url="jdbc:mysql://localhost:3306/test";
        String user="root0";
        String password="abc123";
        Connection conn=DriverManager.getConnection(url,user,password);
        System.out.println(conn);
    }
}


在这里插入图片描述
能正常运行,为什么?

正常运行原因

在这里插入图片描述
java.sql.Driver文件夹下面,存放着一个东西
在这里插入图片描述
mysql中,它会给我们自动加在Driver类,但是其它数据库管理系统的不会自动加载,所以的话写上加载还是最好的做法

方式5:

将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
在这里插入图片描述

1.读取配置文件中的4个基本信息

 InputStream is=Test1.class.getClassLoader().getResourceAsStream("jdbc0.properties");

注意:这个Test1是当前所在类名

 Properties pros=new Properties();
pros.load(is);
		String  url= pros.getProperty("url");
        String user=pros.getProperty("user");
        String password=pros.getProperty("password");
        String driverclass=pros.getProperty("driverClass");

2.加载驱动

  Class.forName(driverclass);

3.获取连接

Connection conn=DriverManager.getConnection(url,user,password);
        System.out.println(conn);

在这里插入图片描述
注意:jdbc0.properties最好部署在src下面,不要部署在整个项目下面

此种方式的好处?

  1. 实现了数据域代码的分离,实现了解耦
  2. 如果需要修改配置文件信息,就可以避免重新打包。

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/114790717