面向接口编程与开闭原则在模拟 JDBC 驱动中的应用

知识点一:抽象工厂模式 (Abstract Factory Pattern)

  • 核心概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  • 详细解释:

    • 普通工厂模式只生产单一产品,而"抽象工厂"生产的是**"产品族"**。在真实业务中,产品往往是配套使用的(比如 MySQL 的连接对象必须配合 MySQL 的语句对象使用)。

    • 它包含四个角色:

      1. 抽象产品 (Abstract Product):定义产品的公共接口(如 DBConnection、DBStatement)。

      2. 具体产品 (Concrete Product):实现接口的具体类(如 MySQLConnection、OracleStatement)。

      3. 抽象工厂 (Abstract Factory):声明创建产品族的方法(如 DBFactory 接口里的 createConnection() 和 createStatement())。

      4. 具体工厂 (Concrete Factory):实现抽象工厂,负责生产一组具体的产品(如 MySQLFactory 生产 MySQL 的那一套)。

  • 本实验代码对应 :DBFactory 就是抽象工厂,MySQLFactory 和 OracleFactory 是具体工厂,它们保证了客户端拿到的 Connection 和 Statement 一定是属于同一个数据库体系的产品,不会出现"MySQL的Connection搭配Oracle的Statement"的乱象。

  • 作用:完美解决"一系列相互依赖对象"的创建问题,保证产品族的内部一致性,方便整体替换。

知识点二:Java 反射机制 (Java Reflection)

  • 核心概念 :在程序的运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种"动态获取信息以及动态调用对象方法"的功能称为反射。

  • 详细解释:

    • 传统创建对象的方式是 new MySQLFactory(),这叫"静态编译期绑定"。

    • 反射则是通过字符串(类的完全限定名)来加载类。核心API是 Class.forName("类的全限定名")。JVM 会根据这个字符串去硬盘上寻找对应的 .class 文件,并将其加载到内存中,然后可以通过 newInstance() 或其变体实例化对象。

  • 本实验代码对应 :DBManager.getFactory(String factoryClassName) 中的 Class.forName(factoryClassName).getDeclaredConstructor().newInstance()。即使你的代码里没有写过 new MySQLFactory(),只要传入了 "com.abc.homework1.MySQLFactory" 这个字符串,程序依然能在运行时把它造出来。

  • 作用:极大提高了程序的灵活性和扩展性。它是所有现代 Java 框架(如 Spring、MyBatis)的底层基石,也是真实 JDBC 驱动加载的原理。

知识点三:面向接口编程与多态 (Interface-Oriented Programming & Polymorphism)

  • 核心概念:"面向接口编程"要求我们在声明变量、方法参数返回值时,尽量使用抽象类型(接口或父类),而不是具体实现类。而"多态"是指同一个接口,使用不同的实例而执行不同操作。

  • 详细解释:

    • 不要写成 MySQLConnection conn = new MySQLConnection();,而是写成 DBConnection conn = new MySQLConnection();(左边是接口,右边是实现)。

    • 当调用 conn.connect() 时,Java 会根据运行时右侧的实际对象(MySQL还是Oracle),动态绑定去执行对应的方法。这叫"向上转型"。

  • 本实验代码对应 :在 Test1.java 中:DBConnection conn = factory.createConnection(); 这行代码。你在写这行代码时,根本不知道也不关心 factory 是个什么数据库,但程序运行起来后,多态机制会让它自动调用正确的方法。

  • 作用:极大地降低了代码的耦合度。屏蔽了底层实现的差异,让上层业务代码更加稳定。

知识点四:开闭原则 (Open-Closed Principle, OCP)

  • 核心概念 :软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这是面向对象设计的终极目标之一。

  • 详细解释:

    • 对扩展开放:当系统增加新功能时,可以通过新增代码来实现。

    • 对修改关闭:当系统增加新功能时,尽量不修改原有的代码,防止改出 Bug。

  • 本实验代码对应 :如果你的作业要求新增一个 SQL Server 数据库支持。你完全不需要修改 Test1、DBManager、DBFactory 的代码。你只需要新写 SQLServerConnection、SQLServerStatement 和 SQLServerFactory 三个类,然后在 Test1 里把字符串改成 "com.abc.homework1.SQLServerFactory" 即可。这就是开闭原则的完美体现。

  • 作用:保证软件的稳定性和可维护性,延长软件的生命周期。

知识点五:JDBC 真实驱动加载原理 (JDBC SPI Mechanism)

  • 核心概念:JDBC(Java DataBase Connectivity)是 Java 官方提供的一套接口。各个数据库厂商(MySQL、Oracle)负责提供具体的实现(即 Jar 包,俗称驱动)。

  • 详细解释:

    • 真实开发中,你写 Class.forName("com.mysql.cj.jdbc.Driver");,这行代码利用反射把 MySQL 的驱动类加载进内存。

    • 这个驱动类里包含了一个静态代码块,一加载就会向 DriverManager 注册自己。

    • 之后你调用 DriverManager.getConnection(...),它就会把你传入的 URL(比如 jdbc:mysql://...)交给对应的驱动去建立真实连接。

  • 本实验对应 :你的实验是用纯 Java 面向对象和设计模式模拟了这个过程。你的 DBManager 扮演了类似 DriverManager 的角色,你的 Factory 和具体类则模拟了各个数据库厂商的驱动包和内部实现。

  • 作用:理解了这个知识点,你就明白了为什么 Java 跨平台、跨数据库这么强------因为底层都在依赖同一套接口规范和反射机制。

知识点六:工程构建的版本一致性 (Java Build Environment Consistency)

  • 核心概念:Java 项目的"源码级别(Source)"、"目标字节码版本(Target)"和"运行环境(SDK/JDK)"必须保持高度一致。

  • 详细解释:

    • 你在做这个实验时经历的报错 Cannot compile module ... target 17: fallback SDK version 8...,就是典型的版本冲突。

    • pom.xml 中的 Maven 配置代表着告诉 Maven 用什么标准去编译;IDEA 的 Project Structure 中的 SDK 决定用什么库去编译;而 Java Compiler 中的 Target bytecode version 决定了最终生成什么版本的 .class 文件给 JVM 运行。

    • 只要其中任何一个环节(比如 Maven 配置成了 25/17,但环境是 1.8)不匹配,编译器就会罢工。

  • 本实验对应 :你自己动手修改了 pom.xml 的 <maven.compiler.source>1.8</...>,并在 Project Structure 和 Settings 中全面对齐了 JDK 1.8。

  • 作用:这是企业级项目开发最基本的工程能力。理解版本一致性能让你在以后的开发中避免无数个令人抓狂的"莫名其妙"的编译错误。

相关推荐
Félix2512 小时前
Nacos学习笔记(SpringBoot/SpringCloud)
java·spring boot·spring
文丑颜不良啊2 小时前
LeetCode1581~1600题目解析
java·leetcode
香蕉大香蕉(06敬畏市场)2 小时前
MySQL 单点详解(06)
java·数据库·mysql·博客·实习
lqbzlll2 小时前
Spring Boot 开启虚拟线程后接口反而变慢了?4 个排查方向和对应修法
java·spring boot·后端
七夜zippoe2 小时前
LangChain4j vs Spring AI:Java AI 框架怎么选(对比表)
java·人工智能·spring·ai·langchain4j
悠仁さん2 小时前
【C++】set map 使用
java·前端·c++
yuniko-n3 小时前
【JUC】Thread 内存泄露
java
freejackman3 小时前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
企业数字化笔记3 小时前
业务单据怎样接入流程中心?启动条件、实例关联与失败回退
java·spring boot·mysql