Java对象=方法?包括示例

问题描述 投票:0回答:5

我今天遇到了一些新东西,但似乎无法理解它。请记住,以下问题适用于 Java - 主要是 Java JDBC。

我有以下代码:

Connection con = DriverManager.getConnection(Url, "username", "password");

还有这个:

Statement myStmt = con.createStatement();
ResultSet myRs = myStmt.executeQuery("select * from employees");

这里到底发生了什么?我发现该方法返回一个对象,例如新的 Connection 对象?

还有,Connection不是一个接口吗?那么它如何创建一个新对象呢?

java jdbc interface
5个回答
1
投票

代码:

Connection con = DriverManager.getConnection(Url, "username", "password");

这是一个工厂模式。管理器根据传入的 URL 创建正确的具体

Connection
类。

Connection
本身是所有具体连接类实现的接口(javadoc)。 MySQL、Postgres、Oracle,无论什么......它们都是连接类。 DriverManager 选择其中正确的一个并创建它。

DriverManager 如何知道? 当类加载器加载驱动程序类时,驱动程序类会向驱动程序注册自己。当驱动程序询问“谁响应此 URL”时,它会调用每个驱动程序中的 acceptsURL

 方法,并且响应的驱动程序在使用 
connect
 调用时会返回连接。
一旦您从

Connection

获得了

Driver
对象(知道如何与驱动程序使用的数据库进行通信),它就可以创建一个语句或针对该数据库执行查询,并返回结果集。

这些细节由驱动程序来实现。 您刚刚获得了这些工作方式的接口。 从您的角度来看,所有结果集、语句和连接(以及驱动程序)都以相同的方式工作,尽管它们在幕后连接到游标和数据库的方式可能不同。 但这并不重要。 您已经有了一个界面,并且它们都以相同的方式工作。

这些都是工厂模式的实例。

工厂、抽象工厂和工厂方法

可能是关于这个问题的有用读物。 其他模式在Java 核心库中的 GoF 设计模式示例中进行了描述。 您可能还会发现关于工厂模式的讲座很有用(它有经典的“披萨”示例)。 由于这些是模式(我故意用大写“P”来写),您会发现这些解决方案在整个程序中以类似的方式一次又一次地使用。 一旦您认识到您正在与工厂打交道,您将可能能够更有效地与它合作。


1
投票

Connection con = DriverManager.getConnection(Url, "username", "password");

就是将使用
getConnection

工厂方法
创建的实例分配给一个引用con,该引用可以保存符合
Connection
接口的实例。

您无法直接实例化接口 - 因为接口不指定实现。但是,您可以将对实现该接口的对象的引用视为对其他对象的引用。如果您严格遵守接口中定义的方法,则可以在编译时或运行时将一个对象与另一个实现该接口的对象交换。

诸如

getConnection()

之类的工厂方法是用于实例化对象的静态方法。也可以使用构造函数创建对象,但工厂方法更灵活,甚至可以在任何类中定义(例如示例中的

DriverManager
)。
    


0
投票

Statement myStmt = con.createStatement(); ResultSet myRs = myStmt.executeQuery("select * from employees");

方法都是返回对象,一个是Statement,一个是执行语句的结果数据(ResultSet)

希望有所帮助,我假设您是 OOP 新手,这是您将使用和实现的常见模式。


0
投票

基本上这是接口的另一种用途,实现是隐藏的,你只知道这个接口中有一个同名的方法并且你可以使用它。


-1
投票
    是的,类
  1. DriverManager

    有一个返回

    Connection
    对象的静态方法。
    
    

  2. 是的,
  3. Connection

    是一个界面。

    getConnection()
    返回的对象是实现该接口的类的实例。
    
    

  4. 以下分别是
DriverManager

Connection
Driver
的文档:

    驱动管理器
  • 连接
  • 司机
  • 需要注意的关键是您希望在运行时动态加载正确的驱动程序。 您可能有 Oracle 驱动程序、MSSQL 驱动程序或 mySQL 驱动程序。 这对于几乎所有 JDBC 代码来说都是透明的 - 除了 1) 加载驱动程序和 2) 设置特定连接字符串的部分。

© www.soinside.com 2019 - 2024. All rights reserved.