目录
一、前言
二、JDBC介绍
1.基本概述 :
JDBC全称"Java DataBase Connectivity",直译Java数据库连接;JDBC是Java提供的一套用于数据库访问的应用程序API,由一组接口和类构成(主要位于java.sql和javax.sql包下),Java程序⚪只需要面向这套接口编程即可。
JDBC为访问不同的数据库提供的标准统一的接口,并且为使用者屏蔽了细节问题。Java人使用JDBC,可以连接任何提供了JDBC驱动程序的DBS(数据库操作系统),从而完成对DB(数据库)的各种操作。
2.基本原理 :
在MySQL系列博文中我们说到——使用Java程序来操作DBMS(数据库管理系统),是访问DBMS最常用的途径,没有之一。那么,请大家思考一个问题——Java程序是如何操作数据库的?
直接访问?显然不太现实。因为Java目前是Oracle旗下的产品,如果我们想通过Java程序来访问DB2数据库(IBM旗下),或者是SQL Server数据库(微软旗下),由于不同公司旗下的DBMS底层结构不完全相同,所以大概率你是无法通过Java程序直接访问的。
那么,假设,即便可以直接访问,为了访问不同公司的数据库产品,我们就需要在Java程序中定义不同的方法,如下图所示 :
编辑
明眼人一看就懂,瞎🐓⑧扯🥚。我们面向对象学了那么久,基本的思想还是有的。如果不同的数据库都要定义不同的方法来访问,显然不利于Java程序的管理。
那么,新的问题来了——怎么办?(🐔:哎哟,你干嘛~)(bushi)
幸好,比我们🐂🖊一千倍的人多了去。这些个🐂B人聚在一起,时间一长自然想出了牛逼方法——在Java中规定一套接口规范,并让不同的数据库厂商去实现这组接口,程序员只需要在Java程序中调用接口的方法即可(接口的多态)。
当然,由于不同的数据库底层结构不同,它们在实现这组接口时,具体的实现方式肯定会有差异,但是大方向上均遵循接口定义的规范。牛逼方法的实现如下图所示 :
编辑
上图中,“实现接口的一组类”称为驱动类,也简称为驱动,会打包到一个.jar文件中。例如,MySQL驱动如下 :
编辑
若DBMS发生了更新,只需要更新用于连接的jar包即可,利于维护。
三、JDBC模拟
1.模拟接口 :
时隔多日,终于要再次使用IDEA。我们新建一个项目JDBC_Demo,并新建一个模拟规范的接口Jdbc_Simulation,代码如下 :
package introduction.simulation; /** * @author : Cyan_RA9 * @version : 21.0 */ public interface Jdbc_Simulation { //开启连接 public Object linking(); //数据库的"CRUD" public void crud(); //关闭连接 public void close(); }
2.模拟实现类 :
以Jdbc_To_MySQL类为模拟的实现类,实现Jdbc_Simulation接口,代码如下 :
package introduction.simulation; /** * @author : Cyan_RA9 * @version : 21.0 */ public class Jdbc_To_MySQL implements Jdbc_Simulation{ @Override public Object linking() { System.out.println("连接到MySQL数据库"); return null; } @Override public void crud() { System.out.println("执行MySQL的增删查改"); } @Override public void close() { System.out.println("关闭MySQL连接"); } }
3.模拟测试类 :
以Test_Jdbc类为测试类,在测试类中通过接口的多态,调用实现类的方法,Test_Jdbc类代码如下 :
package introduction.simulation; public class Test_Jdbc { public static void main(String[] args) { Jdbc_Simulation js = new Jdbc_To_MySQL(); js.linking(); js.crud(); js.close(); } }
运行结果 :
编辑
4.模拟扩展 :
若我们还想进行Oracle数据库的连接,同样可以进行模拟,只需要重新定义一个类去实现Jdbc_Simulation接口,然后更改测试类中的调用逻辑即可。我们定义一个Jdbc_To_Oracle类,代码如下 :
package introduction.simulation; /** * @author : Cyan_RA9 * @version : 21.0 */ public class Jdbc_To_Oracle implements Jdbc_Simulation{ @Override public Object linking() { System.out.println("连接到Oracle数据库"); return null; } @Override public void crud() { System.out.println("执行Oracle的增删查改"); } @Override public void close() { System.out.println("关闭Oracle连接"); } }
对于调用类,扩展更加方便。某些情况下,都不需要去定义新的类,直接更改接口多态中new出的实现类对象即可,底层会根据动态绑定机制自动调用相应的方法。
测试类Test_Jdbc代码如下 :
package introduction.simulation; public class Test_Jdbc { public static void main(String[] args) { //操作MySQL数据库 Jdbc_Simulation js = new Jdbc_To_MySQL(); js.linking(); js.crud(); js.close(); System.out.println("===================================="); //操作Oracle数据库 Jdbc_Simulation js2 = new Jdbc_To_Oracle(); js2.linking(); js2.crud(); js2.close(); } }
运行结果 :
编辑
OK,经过这个小小的模拟,我们可以较为明显地感受到——接口编程带来的好处——极大地丰富了程序的可扩展性和可维护性,即统一调用的问题。
当然,在实际情况中,实现JDBC要比这复杂的多,但是逻辑上是一致的。
四、JDBC入门
1.编写JDBC程序的核心四部曲 : (全文背诵)
1° 注册驱动——加载Driver类
2° 获取连接——得到Connection
3° 执行SQL——发送crud相关的SQL给MySQL执行,如果是查询操作会返回结果。
4° 释放资源——关闭相关连接
2.准备工作 :
①导入jar包
首先,在IDEA的项目下新建一个目录libs,如下图所示 :
编辑
编辑
接着,将MySQL中Connector_J包下的mysql-connector-j-8.0.33.jar文件拷贝到libs目录下,如下图所示 :
编辑
右键该jar文件,选择"Add as Library...",如下图所示 :
编辑
出现提示框后,点击OK即可。加入成功后可以看到内容显示,如下图所示 :
编辑
②创建测试表
在MySQL中新建一个jdbc_ex数据库,用于存放jdbc的测试内容。在jdbc_ex数据库下新建一个学生表stus,代码如下 :
CREATE TABLE IF NOT EXISTS `stus`( `id` MEDIUMINT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL DEFAULT '', `sex` CHAR(16) NOT NULL DEFAULT 'female', `score` DECIMAL(5,1) NOT NULL DEFAULT 0.0 ) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB; SELECT * FROM stus;
编辑
3.代码演示 :
up以Jdbc_1类作为演示类,代码如下 : (注释很重要)
package introduction.example; import com.mysql.cj.jdbc.Driver; //注意,高版本要用cj包下的jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class Jdbc_1 { public static void main(String[] args) throws SQLException { //JDBC核心四部曲 : //1.注册驱动 /* 使用“new com.mysql.cj.jdbc.Driver().var”来获取Driver对象, 会自动导包。 */ Driver driver = new Driver(); //2.获取连接 String url = "jdbc:mysql://localhost:3306/jdbc_ex"; /* 1° jdbc:mysql://,固定格式,表示协议,通过JDBC的方式连接到MySQL; 2° localhost表示本机,此处也可以是IP地址; 3° 3306表示MySQL默认的监听端口; 4° jdbc_ex表示具体要连接的MySQL DBMS的数据库; 5° JDBC连接MySQL的本质就是Socket套接字连接。 */ //将登录用户的用户名和密码放入Properties对象(key的格式固定,value按实际情况) Properties properties = new Properties(); properties.setProperty("user","root"); properties.setProperty("password","RA9_Cyan"); //正式获取连接 Connection connect = driver.connect(url, properties); //3.执行SQL String sql = "INSERT INTO stus " + "VALUES" + "(NULL,'Cyan', 'male', 420)," + "(NULL,'Ice', 'male', 419);"; Statement statement = connect.createStatement(); int i = statement.executeUpdate(sql); /* 1° 使用Connection对象的createStatement()方法可以获取到Statement对象, Statement对象用于执行静态SQL,并返回其生成的结果对象; 2° Statement类的executeUpdate方法可以执行传入的sql语句, 若执行的SQL为DML,其返回结果i表示影响的行数。Affected rows : i, */ System.out.println(i > 0 ? "Successfully" : "Failed"); //4.释放资源 statement.close(); connect.close(); } }
运行结果 :
编辑
在Navicat中查询jdbc_ex数据库中的stus表,查看执行效果,如下图所示 :
编辑
This isn't the end. 继续,修改要执行的SQL语句, 测试Update和Delete,如下所示 :
/* !!! : 注意,如果像up这样换行,表名后必须加空格。 */ String sql = "UPDATE stus " + "SET `name` = 'Five', sex = 'female'" + "WHERE id = 2;";
运行结果 :
编辑
编辑
最后再来测试一下DELETE语句,如下 :
String sql = "DELETE FROM stus " + "WHERE `name` = 'Cyan';";
运行效果 :
编辑
编辑
五、总结
- 🆗,以上就是JDBC——第一小节的全部内容了。大家能搞清楚JDBC的原理,以及JDBC程序编写的核心四部曲就足够了。
- 下一小节内容是JDBC——API,我们不见不散。感谢阅读!
System.out.println("END--------------------------------------------------------------------------");