我今天遇到了一些新东西,似乎无法绕过它。请记住,以下问题适用于Java - 主要是Java JDBC。
我有以下代码:
Connection con = DriverManager.getConnection(Url, "username", "password");
而且:
Statement myStmt = con.createStatement();
ResultSet myRs = myStmt.executeQuery("select * from employees");
这里到底发生了什么?我收集该方法返回一个对象,如一个新的Connection对象?
此外,还没有连接接口?那么它将如何创建一个新对象?
答案 0 :(得分:1)
在界面中描述哪些方法签名可用于特定对象。你在这一行做了什么
Connection con = DriverManager.getConnection(Url, "username", "password");
是您将使用getConnection
工厂方法创建的实例分配给可以保存符合con
接口的实例的引用Connection
。< / p>
您无法直接实例化接口 - 因为接口未指定实现。但是,您可以在引用其他对象时处理对实现接口的对象的引用。如果你严格遵守接口中定义的方法,只要它们在编译时或运行时实现接口,就可以将一个对象与另一个对象交换。
getConnection()
等工厂方法是一种用于实例化对象的静态方法。也可以使用构造函数创建对象,但工厂方法更灵活,甚至可以在任何类中定义(例如示例中的DriverManager
)。
答案 1 :(得分:1)
代码:
Connection con = DriverManager.getConnection(Url, "username", "password");
这是Factory Pattern。管理器根据传入的URL创建适当的具体Connection
类。
Connection
本身是所有具体连接类实现的接口(javadoc)。 MySQL,Postgres,Oracle,等等......它们都是Connection类。 DriverManager选择正确的那个并创建它。
DriverManager如何知道?当类加载器加载驱动程序时,驱动程序类register themselves与驱动程序。当司机通过询问&#34;谁响应此URL&#34;它在每个驱动程序中调用acceptsURL
方法,并且响应的方法在使用connect
调用时返回连接。
一旦你有Connection
Driver
对象(知道如何与驱动程序使用的数据库通信),它就可以创建一个语句或对该数据库执行一个查询返回结果集。
具体细节取决于驱动程序的实现。您可以通过这些方式获得接口。从您的角度来看,所有结果集和语句和连接(和驱动程序)的工作方式都相同,但它们在后台连接到光标和数据库的方式可能不同。但这并不重要。你有一个界面,他们都以同样的方式工作。
这些都是工厂模式的所有实例。 Factory, Abstract Factory and Factory Method可能是有用的阅读材料。描述了其他模式Examples of GoF Design Patterns in Java's core libraries。您可能还会发现This lecture on Factory Pattern很有用(它有经典的比萨饼&#39;例子)。
由于这些是模式(我故意用大写&#39; P&#39;),你会发现这些解决方案在整个程序中以类似的方式一次又一次地使用。一旦您意识到您正在与工厂打交道,您就可以更有效地使用它。
答案 2 :(得分:0)
Java方法具有“返回类型”,因此您可以调用返回对象的方法。在这两种情况下,
Statement myStmt = con.createStatement();
ResultSet myRs = myStmt.executeQuery("select * from employees");
方法是返回对象,一个是Statement,另一个是执行语句的结果数据(ResultSet)
希望有所帮助,我认为你是OOP的新手,这是你将使用和实现的常见模式。
答案 3 :(得分:0)
Connection con = DriverManager.getConnection(Url, "username", "password");
1)是的,班级&#34; DriverManager&#34;有一个静态方法,返回&#34;连接&#34;对象
2)是的,&#34;连接&#34;是一个界面。 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)设置特定的连接字符串。
&#39;希望有所帮助!
答案 4 :(得分:0)
这里是的,你得到了对象,当谈到Connection时,它是一个接口,你可以通过调用DriverManager.getConnection(Url,&#34;用户名&#34;,&#)获得Connection接口中方法的实现。 34;密码&#34)。
基本上这是接口的另一种用法,实现是隐藏的你只要知道在这个接口中有一个这个名字的方法就可以使用它。