学习JDBC这一篇就够了(一)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS SQL Server,基础系列 2核4GB
简介: JDBC


读完大概需要20分钟


绪:

需要掌握有以下基础:

  • java基础
  • MySQL简单的DML语言
  • 可扩展标记语言XML

一、JDBC简介

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

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

7cf925f7f3bfbb89200743522ef85d11.png

使用JDBC的步骤如下:

加载数据库驱动 → 建立数据库连接(Connection) → 创建执行SQL语句的Statement对象 → 处理执行结果(ResultSet) → 释放资源


二、获取数据库连接

准备工作

1、导入驱动jar包

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

  1. 数据库驱动的jar包3b86ccecd43bab946346dd927ff1527f.png
  2. 将上述jar包拷贝到Java工程的一个目录中,习惯上新建一个lib文件夹。d90a67a38dc12cd1ab92292b1df390d4.png
  3. 在驱动jar上右键–>【Build Path】–>【Add to Build Path】d11b049a57f052fb0a2a96a0e0814cd8.png

2、加载与注册JDBC驱动

  • 加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.jdbc.Driver”);
  • 注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
  • 使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
  • 通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。

3、URL

  • JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
  • JDBC URL的标准由三部分组成,各部分间用冒号分隔。
  • jdbc:子协议:子名称(主机:端口/数据库名)
  • 协议:JDBC URL中的协议总是jdbc
  • 子协议:子协议用于标识一个数据库驱动程序
  • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名53b9bf9d1ed9808ae56d2eb2e8f49133.png
  • 常用数据库的 JDBC URL

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

4、用户名和密码

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

数据库连接方式一——使用Properties文件获取☆☆☆

将jdbc的配置信息保存到【properties】文件中,读取其中的配置信息

publicvoidgetConnection() throwsException {
//1.加载配置文件InputStreamis=JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
Propertiespros=newProperties();
pros.load(is);
//2.读取配置信息Stringuser=pros.getProperty("user");
Stringpassword=pros.getProperty("password");
Stringurl=pros.getProperty("url");
StringdriverClass=pros.getProperty("driverClass");
//3.加载驱动Class.forName(driverClass);
//4.获取连接Connectionconn=DriverManager.getConnection(url, user, password);
System.out.println(conn);
    }

其中,配置文件声明在工程的src目录下:【jdbc.properties】

user=rootpassword=123456url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8driverClass=com.mysql.cj.jdbc.Driver

注:

这里用的mysql驱动是8.0.22版本,com.mysql.jdbc.Driver替换成com.mysql.cj.jdbc.Driver,还需要在url中设置时区,不然会报异常

  1. com.mysql.jdbc.Driver未替换成com.mysql.cj.jdbc.Driver
Loadingclass`com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.
  1. url中未设置时区
Theservertimezonevalue'?й???????'isunrecognizedorrepresentsmorethanonetimezone. YoumustconfigureeithertheserverorJDBCdriver (viathe'serverTimezone'configurationproperty) touseamorespecifictimezonevalueifyouwanttoutilizetimezonesupport.


说明:使用配置文件的方式保存配置信息,在代码中加载配置文件

使用配置文件的好处:

①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码

②如果修改了配置信息,省去重新编译的过程。



数据库连接方式二——使用XML文件获取数据库连接☆☆☆

在此之前,我们可以先通过另一篇文章来了解一下什么是XML?

可扩展标记语言XML


在学习XML之后,我们就可以把jdbc的配置信息存储在xml文件中,通过对xml文件进行解析获取其中的配置信息,来建立连接

【jdbcconfig.xml】

<?xmlversion="1.0" encoding="utf-8" ?><!-- jdbc配置信息 --><config-info><driverClassName>com.mysql.cj.jdbc.Driver</driverClassName><url>jdbc:mysql://localhost:3306?serverTimezone=GMT%2B8</url><username>root</username><password>123456</password></config-info>

【JDBCInfo.java】

/*** jdbc配置信息的javaBean类**/publicclassJDBCInfo {
privateStringdriverClassName;
privateStringurl;
privateStringusername;
privateStringpassword;
publicJDBCInfo(StringdriverClassName, Stringurl, Stringusername, Stringpassword) {
super();
this.driverClassName=driverClassName;
this.url=url;
this.username=username;
this.password=password;
    }
publicStringgetDriverClassName() {
returndriverClassName;
    }
publicvoidsetDriverClassName(StringdriverClassName) {
this.driverClassName=driverClassName;
    }
publicStringgetUrl() {
returnurl;
    }
publicvoidsetUrl(Stringurl) {
this.url=url;
    }
publicStringgetUsername() {
returnusername;
    }
publicvoidsetUsername(Stringusername) {
this.username=username;
    }
publicStringgetPassword() {
returnpassword;
    }
publicvoidsetPassword(Stringpassword) {
this.password=password;
    }
}

【JDBCXML.java】

importorg.dom4j.Document;
importorg.dom4j.DocumentException;
importorg.dom4j.Element;
importorg.dom4j.io.SAXReader;
/*** xml解析类**/publicclassJDBCXML {
/*** 对xml文件进行解析* * @return JDBCInfo对象,包含jdbc的配置信息*/publicstaticJDBCInfogetJDBCInfo() {
SAXReaderreader=newSAXReader();
try {
Documentdoc=reader.read("src\\jdbcconfig.xml");
//获取xml文件的根元素ElementrootElement=doc.getRootElement();
//获取根元素的子元素信息StringdriverClassName=rootElement.elementText("driverClassName");
Stringurl=rootElement.elementText("url");
Stringusername=rootElement.elementText("username");
Stringpassword=rootElement.elementText("password");
//返回一个包含jdbc配置信息的javaBean对象returnnewJDBCInfo(driverClassName, url, username, password);
        } catch (DocumentExceptione) {
e.printStackTrace();
        }
returnnull;
    }
}

【JDBCUtils.java】

importjava.sql.Connection;
importjava.sql.DriverManager;
/*** jdbc工具类**/publicclassJDBCUtils {
/*** 建立jdbc连接* * @return Connection*/publicstaticConnectiongetConnection() {
// 调用JDBCXML对xml进行解析,通过getJDBCInfo()方法返回的JDBCInfo对象建立连接JDBCInfojdbcInfo=JDBCXML.getJDBCInfo();
try {
Class.forName(jdbcInfo.getDriverClassName());
Connectionconnection=DriverManager.getConnection(jdbcInfo.getUrl(), jdbcInfo.getUsername(),
jdbcInfo.getPassword());
returnconnection;
        } catch (Exceptione) {
e.printStackTrace();
        }
returnnull;
    }
}


目录
相关文章
|
Java 数据库连接 数据库
JDBC学习(三):封装工具类JDBCUtils类
为了以后方便进行数据库连接、数据库关闭、还有后面的连接池的操作等功能,现在将功能封装到JDBCUtils类当中,作为自己的一个工具箱。
396 0
|
8月前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
8月前
|
SQL Java 关系型数据库
Java学习—JDBC
Java学习—JDBC
|
8月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(下)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
530 1
|
8月前
|
SQL Java 关系型数据库
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
349 0
JDBC技术【JDBC概述、获取数据库连接、 下载数据库驱动】(一)-全面详解(学习总结---从入门到深化)
|
8月前
|
SQL druid Java
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
96 0
|
8月前
|
SQL Java 数据库连接
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)(中)
JDBC技术【分页查询、数据库连接池、应用程序分层、封装通用的BaseDao】(四)-全面详解(学习总结---从入门到深化)
86 0
|
8月前
|
SQL Java 关系型数据库
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
103 0
|
8月前
|
SQL 存储 Java
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
474 0
|
SQL Oracle Java
Java学习之路004——JDBC基础操作
使用JDBC对Mysql数据库进行基础查询操作的演示,包括JDBC连接器下载、引用、使用等。
139 0