day45-JDBC和连接池01
JDBC和连接池01
1.JDBC概述
- 基本介绍
- JDBC为访问不同的数据库提供了同一的接口,为使用者屏蔽了细节问题
- Java程序员使用JDBC,可以连接任何提供了jdbc驱动程序的数据库系统,从而完成对数据库的各种操作
-
jdbc原理图
JDBC是java提供的一套用于数据库操作的接口API,Java程序员只需要面向这套接口编程即可。不同的数据库厂商需要针对这套接口,提供不同的实现。

jdbc模拟实现
模拟JDBC驱动:
package jdbc.myjdbc; /** * 我们规定的jdbc接口(方法)规范 */ public interface JdbcInterface { //连接 public Object getConnection(); //crud public void crud(); //关闭连接 public void close(); }
模拟Mysql驱动:
package jdbc.myjdbc; /** * 模拟 mysql数据库实现jdbc接口[由mysql厂商开发] */ public class MysqlJdbcImpl implements JdbcInterface{ @Override public Object getConnection() { System.out.println("得到 mysql 的连接"); return null; } @Override public void crud() { System.out.println("完成 mysql 的增删改查"); } @Override public void close() { System.out.println("关闭 mysql 的连接"); } }
模拟Oracle驱动:
package jdbc.myjdbc; /** * 模拟实现oracle的连接驱动-即实现规范接口 */ public class OracleJdbcImpl implements JdbcInterface{ @Override public Object getConnection() { System.out.println("得到 oracle 的连接"); return null; } @Override public void crud() { System.out.println("完成 oracle 的增删改查"); } @Override public void close() { System.out.println("关闭 oracle 的连接"); } }
模拟java程序使用各种数据库驱动连接数据库:
package jdbc.myjdbc; public class TestJdbc { public static void main(String[] args) { //完成mysql的操作 JdbcInterface jdbcInterface = new MysqlJdbcImpl(); jdbcInterface.getConnection();// 通过接口来调用实现类[动态绑定] jdbcInterface.crud(); jdbcInterface.close(); System.out.println("=============="); //完成oracle的操作 jdbcInterface = new OracleJdbcImpl(); jdbcInterface.getConnection();// 通过接口来调用实现类[动态绑定] jdbcInterface.crud(); jdbcInterface.close(); } }

- JDBC API
jdbc api是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql与javax.sql包中。

2.JDBC快速入门
2.1JDBC程序编写步骤
-
注册驱动 -- 加载Driver类
-
获取连接 -- 得到Connection
-
执行增删改查 -- 发送SQL命令给mysql执行
-
释放资源 -- 关闭相关连接

例子--通过jdbc对表actor进行添加,删除和修改操作
- 首先在SQL yog使用mysql数据库创建一个演员actor表
-- 创建测试表 演员表 CREATE TABLE actor( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL DEFAULT '', sex CHAR(1) NOT NULL DEFAULT '女', borndate DATETIME, phone VARCHAR(12) ); SELECT * FROM actor;
-
下载mysql连接驱动
-
在项目中创建libs文件夹,将驱动复制进文件夹中,右键点击驱动,选择ad as library
-
在弹出的窗口中点击OK,即可
package li.jdbc; import com.mysql.jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * 这是第一个jdbc程序,完成简单的操作 */ public class jdbc01 { public static void main(String[] args) throws SQLException { //前置工作:在项目下创建一个文件夹如 libs //将mysql.jar拷贝到该目录下,点击add to project.. 加入到项目中 //1.注册驱动 Driver driver = new Driver();//创建一个driver对象 //2.得到连接 /** * jdbc:mysql:// 是规定好的协议,表示通过jdbc的方式来连接mysql * localhost 表示要连接到的主机ip地址 * 3306 表示mysql监听的端口 * hsp_db02 表示连接到 mysql DBMS的哪个数据库 */ // mysql的连接本质就是socket的连接 String url = "jdbc:mysql://localhost:3306/hsp_db02"; //将用户名和密码放入到一个Properties对象中 Properties properties = new Properties(); // user 和 password 是规定好的,后面的值根据实际情况写 properties.setProperty("user", "root");//用户 properties.setProperty("password", "123456");//密码 Connection connect = driver.connect(url, properties); //3.执行sql String sql = "insert into actor values(null,'刘德华','男','1970-11-11','110')"; //String sql = "update actor set name ='周星驰' where id = 1 "; //String sql = "delete from actor where id = 1 "; //Statement 用于执行静态SQL语句并返回其生成的结果的对象 Statement statement = connect.createStatement(); int rows = statement.executeUpdate(sql);//如果是dml语句,返回的就是影响的行数 System.out.println(rows > 0 ? "成功" : "失败"); //4.关闭连接资源 statement.close(); connect.close(); } }

在SQL yog中执行语句查询,发现actor表中成功插入一条数据

2.2数据库连接的5种方式
2.2.1方式1
//获取Driver实现类对象 Driver driver = new com.mysql.jdbc.Driver(); String url = "jdbc:mysql://localhost:3306/jdbc_db"; Properties info = new Properties(); info.setProperty("user", "root");//用户 info.setProperty("password", "123456");//密码 Connection conn = driver.connect(url,info); System.out.println(conn);
2.2.2方式2
方式1会直接使用com.mysql.jdbc.Driver()
,属于静态加载,灵活性差,依赖性强
方式2使用反射机制进行动态加载,而且信息可以放入配置文件中保存,更利于项目的控制

例子
package li.jdbc; //分析java连接mysql的5种方式 import com.mysql.jdbc.Driver; import org.junit.Test; import java.sql.Connection; import java.util.Properties; public class jdbcConn { //方式2 @Test public void connect02() throws Exception { //使用反射加载Driver类,动态加载,更加地灵活,减少依赖性 Class<?> aClass = Class.forName("com.mysql.jdbc.Driver"); Driver driver = (Driver)aClass.newInstance(); String url = "jdbc:mysql://localhost:3306/hsp_db02"; //将 用户名和密码 放入到 Properties对象中 Properties properties = new Properties(); // user 和 password 是规定好的,后面的值根据实际情况写 properties.setProperty("user", "root");//用户 properties.setProperty("password", "123456");//密码 Connection connect = driver.connect(url, properties); System.out.println("方式2="+connect); } }
2.2.3方式3
在方式2的基础上使用DriverManager替换Driver




例子
package li.jdbc; import com.mysql.jdbc.Driver; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; public class jdbcConn { //方式3 使用DriverManager替换Driver进行统一管理 @Test public void connect03() throws Exception { //使用反射加载Driver类 Class<?> aClass = Class.forName("com.mysql.jdbc.Driver"); Driver driver = (Driver)aClass.newInstance(); //创建 url和 user 和 password String url = "jdbc:mysql://localhost:3306/hsp_db02"; String user = "root"; String password = "123456"; DriverManager.registerDriver(driver);//注册Driver驱动 Connection connection = DriverManager.getConnection(url, user, password); System.out.println("方式3="+connection); } }
2.2.4方式4
使用Class.forName自动完成注册驱动,简化代码

例子
//方式4 使用Class.forName自动完成注册驱动,简化代码 // 这种方式获取连接是使用得最多的,推荐使用 @Test public void connect04() throws Exception { //使用反射加载Driver类 //在加载Driver类时,完成了注册 /** * 在 Driver类的源码中: * 1.静态代码块在类加载时会执行一次 * 2.DriverManager.registerDriver(new Driver()); * 3.因此 注册Driver的工作已经在底层完成了 * static { * try { * DriverManager.registerDriver(new Driver()); * } catch (SQLException var1) { * throw new RuntimeException("Can't register driver!"); * } * } */ Class.forName("com.mysql.jdbc.Driver"); //创建 url和 user 和 password String url = "jdbc:mysql://localhost:3306/hsp_db02"; String user = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, user, password); System.out.println("方式4="+connection); }
方法4相比于方法3,减少了注册驱动的操作,但是连接数据库的步骤不是需要注册驱动吗?为什么可以这样呢?
在Driver类的源码中,我们可以看到有这样的一个静态代码块:

而静态代码块在类加载时会执行一次,在使用反射加载Driver类时,就执行了DriverManager.registerDriver(new Driver());
语句。
即在加载Driver类时,完成了注册。因此,可以在程序中省略注册的步骤。
注意:
-
mysql驱动5.1.6之后连
Class.forName("com.mysql.jdbc.Driver");
也不需要写了 -
从jdk1.5以后使用了jdbc4,不再需要显式调用Class.forName()注册驱动,而是自动调用驱动jar包下的
META-INF\services\java.sql.Driver
文本中的类名称去注册 -
但是还是建议写上
Class.forName("com.mysql.jdbc.Driver");
,更加明确
2.2.5方式5(推荐)
在方式4的基础上使用配置文件,连接数据库更加灵活


例子
首先在src文件夹下面创建一个Properties文件
user=root password=123456 url=jdbc:mysql://localhost:3306/hsp_db02 driver=com.mysql.jdbc.Driver
方式5:推荐使用
//方式5 在方式4的基础上使用配置文件,连接数据库更加灵活 @Test public void connect05() throws Exception { //通过Properties对象拿到配置文件的信息 Properties properties = new Properties(); properties.load(new FileInputStream("src\\mysql.properties")); //获取相关的值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String url = properties.getProperty("url"); String driver = properties.getProperty("driver"); Class.forName(driver);//建议写上 Connection connection = DriverManager.getConnection(url, user, password); System.out.println("方式5="+connection); }
2.3练习
参考上面代码,使用方式5完成
- 创建actor表
- 使用jdbc添加5条数据
- 修改id=1的记录,将content改成一个新的信息
- 删除id=3的记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!