在JDBC中,为了在DB中连接和执行语句,我们主要使用Connection,Statement和ResultSet作为接口。但是它们的相应对象后来用于运行createStatement(),executeQuery(),next()等方法。这些类实现了这些方法吗? 为什么将它作为连接对象而不是实现的类对象调用?
答案 0 :(得分:2)
你实际上并没有
Connection conn = new Connection();
您可以执行类似
的操作Connection conn = DriverManager.getConnection(
DB_PATH + "?user=" + USER_NAME + "&password=" + USER_PASS);
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(query);
但要直接回答你的问题否你无法实例化Interface
你必须使用implements
Interface
或使用代理的类。
答案 1 :(得分:2)
在JDBC中,首先通过调用
来注册驱动程序Class.forName('classname')
加载Database类并使用DriverManager
当你说DriverManager.getConnection(
时 - 它会返回java.sql.Connection
(按规格签订的合同)
哪个类实现了这些方法?
实际的实现由数据库供应商提供,例如, Oracle,MySQL。
为什么将其称为连接对象而不是已实现的类 对象
因为你code to Interface and not implementation(良好的编码习惯)。
如果您需要,可以在供应商jar中查找并找到哪个类实现Connection,而不是
Connection connection = DriverManager.getConnection()
你可以写
VendorConnectionImpl vendorConnection = (VendorConnectionImpl)DriverManager.getConnection()
以上内容可行但后来会将您与特定实现绑定。
如果你想从vendor1转到vendor2,你不能这样做,首先你必须按照vendor2 API改变上面的代码,但是如果你使用第一种方法,你可以从供应商转移到供应商而不必改变你的代码。
答案 2 :(得分:0)
您无法实例化接口类。您可以自己实现该界面,也可以使用Proxy创建所述接口的实例,该实例将所有调用委托给提供的InvocationHandler。
答案 3 :(得分:0)
这些人正在回答你的问题,但我不认为你是从评论中得到的。
您需要通过创建自己的类来实际实现接口。因此,创建一个实现接口的类,包含正确的抽象方法,然后在新类中添加您想要的功能。然后你将实例化该类以使用这些函数。
接口就像一个编程“契约”,它确保扩展接口的任何类都能实现某些功能,但是,你不能实例化接口本身来使用它的'方法,你继承它们/覆盖它们他们在你的新课堂上。在覆盖新类中的抽象方法之后,您可以编写任何您希望特定接口扩展类执行的操作。
http://www.javabeginner.com/learn-java/java-abstract-class-and-interface 和 http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html 将让您阅读这些主题。
答案 4 :(得分:0)
希望以下说明会有所帮助。
问:驱动程序连接实现来自哪里?以及Statement和ResultSet的实现?
Class.forName("com.mysql.jdbc.Driver").newInstance();
// String url="jdbc:mysql://localhost:3306/mydb?user=root&password=root";
Connection con = DriverManager.getConnection(url);
小技巧:一旦加载(初始化)DriverManager类,就加载驱动程序实现。
以mysql-connector-java:5.1.36的源代码为例。
●类 com.mysql.jdbc.Driver 扩展了类 NonRegisteringDriver ,其中有一个名为 connect()的方法,该方法返回一个Connection的实例。
请注意NonRegisteringDriver的 registeredDrivers 字段
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
...
public java.sql.Connection connect(String url, Properties info) throws SQLException {
●已注册mysql驱动程序,并将该驱动程序添加到 registeredDrivers :
Class.forName("com.mysql.jdbc.Driver");
...
java.sql.DriverManager.registerDriver(new Driver()); // from com.mysql.jdbc.Driver
...
registeredDrivers.addIfAbsent(new DriverInfo(driver, da)); // mysql driver instance is added to registeredDrivers
从现在起 JDBC 知道存在一个JDBC实现,即mysql。
●然后创建连接:
Connection con = DriverManager.getConnection(url);
●遵循 DriverManager.getConnection
的源代码
注意 registeredDrivers
此处连接实现由 aDriver.driver.connect
for(DriverInfo aDriver : registeredDrivers) {
...
Connection con = aDriver.driver.connect(url, info);
...
}
●由于已找到mysql的连接实现,因此还可以通过挖掘mysql-connector-java的源代码来找到 Statement 和 ResultSet 的实现: 5.1.36
Statement stmt = con.createStatement();
// String sql = "select * from user";
ResultSet rs=stmt.executeQuery(sql);
对于 JDBC 4 ,将在加载类DriverManager时从类路径中自动检测驱动程序实现:
DriverManager.java#l101
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}
...
private static void loadInitialDrivers() {
...
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
...
}
文件mysql-connector-java-5.1.36.jar!/ META-INF / services / java.sql.Driver 的内容:
com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver