【问题标题】:Java object = method? Example includedJava对象=方法?包含示例
【发布时间】:2015-02-02 22:11:49
【问题描述】:

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

我有以下代码:

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

还有这个:

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

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

另外,连接不是接口吗?那么它将如何创建一个新对象呢?

【问题讨论】:

  • “我推测该方法返回一个对象,例如一个新的 Connection 对象?” - 您发布了具有三种不同方法调用的代码;你说的是第一个吗?那么你的问题中其他两个的相关性是什么?
  • Also:“另外,Connection 不是接口吗?那么它如何创建一个新对象呢?” - Connection 是一个接口,是的,但 Connection 不会创建任何对象。该对象来自DriverManager.getConnection(...) 方法(在DriverManager 类中)。
  • 对不起,我应该澄清这些。我想知道所有 3 个,因为它们似乎使用不同的类来分配对象?
  • “对不起,我应该澄清这些” - 好的,现在就这样做,通过编辑您的问题。
  • 顺便说一句...欢迎来到 Stack Overflow

标签: java jdbc interface


【解决方案1】:

代码:

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

这是Factory Pattern。管理器根据传入的 URL 创建适当的具体 Connection 类。

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

DriverManager 是如何知道的?当类加载器加载驱动程序类register themselves 和驱动程序时。当驱动程序通过询问“谁响应此 URL”时,它会调用每个驱动程序中的 acceptsURL 方法,而响应的驱动程序会在使用 connect 调用时返回连接。

一旦你有一个来自DriverConnection 对象(它知道如何与驱动程序使用的数据库对话),它就能够创建一个语句或对该数据库执行一个返回结果的查询设置。

这些细节由驱动程序来实现。您刚刚获得了这些工作方式的接口。从您的角度来看,所有 ResultSets 和 Statements 和 Connections(以及驱动程序)的工作方式都相同,尽管它们在后台连接到游标和数据库的方式可能不同。但这没关系。你有一个界面,它们都以相同的方式工作。

这些都是工厂模式的实例。 Factory, Abstract Factory and Factory Method 可能对此事有用。其他模式在Examples of GoF Design Patterns in Java's core libraries 中进行了描述。您可能还会发现This lecture on Factory Pattern 很有用(它有经典的“披萨”示例)。

由于这些是模式(我特意用大写的“P”来写它),你会发现这些解决方案在整个程序中以类似的方式一次又一次地使用。一旦您认识到您正在与工厂打交道,您就可能能够更有效地与它合作。

【讨论】:

    【解决方案2】:

    在接口中描述了哪些方法签名可用于特定对象。你在这一行做什么

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

    是您将使用getConnection工厂方法创建的实例分配给可以容纳符合Connection接口的实例的引用con

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

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

    【讨论】:

      【解决方案3】:

      Java 方法具有“返回类型”,因此您可以调用返回对象的方法。在这两种情况下,

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

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

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

      【讨论】:

        【解决方案4】:

        是的,您正在获取对象,当涉及到 Connection 时,它是一个接口,您可以通过调用 DriverManager.getConnection(Url, "username", "password") 来获取 Connection 接口中方法的实现。

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

        【讨论】:

          【解决方案5】:

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

          1) 是的,“DriverManager”类有一个返回“Connection”对象的静态方法。

          2) 是的,“连接”是一个接口。 getConnection() 返回的对象是实现该接口的类的实例。

          这里分别是 DriverManager、Connection 和 Driver 的文档:

          http://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html

          http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html

          http://docs.oracle.com/javase/7/docs/api/java/sql/Driver.html

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

          '希望有帮助!

          【讨论】:

          • “类“驱动程序”有一个静态方法” - 类名为DriverManager 而不是Driver
          猜你喜欢
          • 2020-03-04
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 2015-01-09
          • 2014-12-26
          • 1970-01-01
          • 2015-01-30
          • 2019-08-24
          相关资源
          最近更新 更多