目录
(2)建立并引用一个外部属性文件(资源包文件-----properties)
(1)Java中3个接口分别定义了对数据库的调用的不同的方式
(3)面试题:Statement和PreparedStatement的区别
一、概念
在web开发中,不可避免的地要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司于1996年提供了一套访问数据的标准Java类库,即JDBC。
JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。
二、JDBC的实现
1、JDBC访问数据库
应用程序使用JDBC访问数据库的方式如下图所示。
从上图可以看出,应用程序使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。由于不同数据库厂商提供的数据库驱动不同,因此,为了使应用程序与数据库真正建立连接,JDBC不仅需要提供访问数据库的API,还需要封装与各种数据库服务器通信。
从上图中可以看出,JDBC的实现包括三部分。
(1)JDBC驱动管理器
负责注册特定的JDBC驱动器,主要通过java.sql. Driver Manager类实现。
(2)JDBC驱动器API
由Sun公司负责制定,其中最主要的接口是java.sql. Driver接口。
(3)JDBC驱动器
它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序JDBC驱动器实现了JDBC驱动器API,负责与特定的数据库连接,以及处理通信细节。
2、连接具体步骤
(1)加载驱动
导入外部依赖,需要引入mysql的驱动(指的是引入的jar包)----数据的持久化,把数据永久的保存起来。主要的方式还是存到硬盘上,持久化的实现过程大部分是通过数据库来完成。
java.sql.Driver接口,是所有驱动程序需要实现的接口
MySQL的驱动全类名:com.mysql.jdbc.Driver。
如果是MySQL8.0版本的,就是这个:com.mysql.cj.jdbc.Driver。
Oracle的驱动全类名:oracle. jdbc. driver. OracleDriver
1、如何加载驱动?
先导入jar包,然后用到反射---Class. forName()。括号里写驱动全类名----Class. forName ( "com. mysqL. jdbc. Driver")
2、URL地址
jdbc协议----jdbc:mysql:
jdbc:mysql://主机名称:端口号/数据库名
jdbc:mysql://127. 0.0.1:3306/jsoft?useUnicode=true&characterEncoding=utf8
(?代表传参)如果是MySQL8.0版本的,还需要传参useSSL=false&serverTimezone=UTC
拓展:
oracle数据库,它的URL地址是:
jdbc:oracle:thin:@主机名称:oracle端口:数据库名
sqlServer数据库,它的URL地址是:
jdbc:sqlServer:127.0.0.1:端口号:DatabaseName=数据库名
(2)建立连接
(3)获取sql语sql
(4)处理结果集
(5)关闭资源
3、代码示例
(1)简单/复杂版本
package com.shangke0818; import org.junit.Test; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Objects; public class Ch01 { @Test /* 复杂版本 */ public void test01() throws ClassNotFoundException, NoSuchMethodException, SQLException, InvocationTargetException, InstantiationException, IllegalAccessException { // 数据库的url String url = "jdbc:mysql://127.0.0.1:3306/jiruan?useUnicode=true&characterEncoding=utf8"; String username = "root"; String password = "12345"; // 驱动的全类名 String driverName = "com.mysql.jdbc.Driver"; // 1.加载驱动类 Class clazz = Class.forName(driverName); // 2.实例化Driver对象 Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance(); // 3.注册驱动 DriverManager.registerDriver(driver); // 4.获取连接 Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); System.out.println(Objects.nonNull(connection) ? "数据库连接成功" : "数据库连接失败"); } @Test /* 简单版本 */ public void test02() throws ClassNotFoundException, SQLException { // 数据库的url String url = "jdbc:mysql://127.0.0.1:3306/jiruan?useUnicode=true&characterEncoding=utf8"; String username = "root"; String password = "12345"; // 驱动的全类名 String driverName = "com.mysql.jdbc.Driver"; // 1.加载驱动类 Class.forName(driverName); // 4.获取连接 Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); System.out.println(Objects.nonNull(connection) ? "数据库连接成功" : "数据库连接失败"); } }
(2)建立并引用一个外部属性文件(资源包文件-----properties)
使用properties属性文件的好处:
1、实现了代码和数据的分离,如果需要修改配置信息,直接在属性文件中修改即可,不需要深入代码
2、如果修改了配置信息,省去了编译的过程.(3)创建一个jdbc连接方式的工具类
1、把JDBC的四要素提取成properties属性文件,通过IO流读取
2、把获取连接的操作提取成一个工具类中的静态方法
3、把关闭连接的操作提取成一个方法
4、获取Statement对象,执行sql语句4、知识点补充
(1)Java中3个接口分别定义了对数据库的调用的不同的方式
1、statement:用来执行静态sql语句并返回它所生成的结果对象
2、Preparedstatement: 预编译,可以使用此对象多次高效的执行该语句
3、Callablestatement:用来执行sql存储过程(2)PreparedStatement:预编译(预加载)
1、通过connection获取的对象
2、是statement接口的子接口
3、sql语句中可以传参,可以用问号?来传参(占位),通过set方法来给问号?赋值4、提高性能
5、避免sql注入
(3)面试题:Statement和PreparedStatement的区别
。PreparedStatement是 预编译的SQL语句,效率高于Statement
。PreparedStatement支持? 操作符,相对于Statement更加灵活
。PreparedStatement可以防止SQL 注入,安全性高于Statement
三、JDBC常用API
1、Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。在编写JDBC程序时,必须要把指定数据库驱动程序或类库加载到项目的classpath中。
2、DriverManager类
Driver Manager类用于加载JDBC驱动并且创建与数据库的连接。在Driver Manager类中,定义了两个比较重要的静态方法。
如表所示:
3、Connection接口
Connection接口代表Java程序和数据库的连接,在Connection接口中,定义了一系列方法,具体如表所示。
4、Statement接口
Statement接口用于向数据库发送SQL语句,在Statement接口中,提供了三个执行SQL语句的方法,具体如表所示。
5、PreparedStatement接口
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。在PreparedStatement接口中,提供了一些基本操作的方法,具体如表下所示。
6、CallableStatement接口
CallableStatement是PreparedStatement的子接口,用于执行SQL存储过程。在Callablestatement按接口中,提供了一些基本操作的方法,具体下表所示:
7、ResultSet接口
ResultSet接口表示 select查询语句得到的结果集,该结果集封装在一个逻辑表格中。在 ResultSet接口内部有一个指向表格数据行的游标,ResultSet对象初始化时,游标在表格的第一行之前。下表中列举了ResultSet接口中的常用方法。
四、数据库连接池
2022-08-20
connection是一种稀有资源,一 个连接建 立就创造了一个资源
比如:
上线QQ,我的QQ和腾讯的服务器建立了一一个连接,有代价, 同时在线人数很多有可能导致服务器崩溃。
如何解决?
第一种方案:自己一个人玩
第二种方案:把服务器的人数限定一下,最多不超过10000人,第10001 个人上线,排队。
JDBC使用数据库连接的必要性
在使用基Fweb程序的数据库连接,
1、在主程序中建立连接
2、执行SQL
3、断开连接池化思想”:
所有的JDBC连接通过DriverManager. getConnection.用完的连接不要被垃圾回收,能够重复使用。这就是"池化思想”"。 每次去初始化一个连接池,连接池中会有很多个连接等待被使用。使用完连接之后,不需要关闭连接, 只需要把连接还回到连接池,还回到连接池的操作不需要我们手动控制。初始化连接池,10条连接,来了20个请求。10 个请求就直接拿10条连接去办事,剩下的10个请求。再向服务器申请连接数。设置一些属性:最大等待时间、初始化连接数……几种连接池:
(1) C3P0, 2代数据库连接池,太老了,不学
(2) DBCP, 2代数据库连接池,太老了,不学
(3) Druid (德鲁伊)数据库连接池,最好用的连接池。
阿里巴巴开源平台上的一个数据库连接池实现,整合了C3P0和DBCP各自
加入了日志监控,可以监控sql语句的执行情况。
(4) Hikari (光),目前最快的连接池,也是springboot默认的连接池。
使用连接池的前提条件:必须有对应的属性文件 .propertiesDruid (德鲁伊)使用方法:
Hikari (光)使用方法:
写个小程序,能实现对数据库中任一张表的增删改查
利用反射、泛型能实现对MySQL数据库中任一张表的通用增删改查