首先
DriverManager.getConnection(url,user,password);
这个返回的是Connection接口的一个实例化对象。
相当于conn是Connection接口的实例化。
所以可以直接调用createStatement();
记住:接口用来定义申明,而实现类可以是多种变化的,所以通常我们在调用时写接口,而不是具体的实现类,可以降低代码的耦合性,提高重用度
同学,你需要理解的是实现、继承和多态的问题。
class A extends B{}
A为B的子类,A和B假如都有一个 void print()方法
那么
B test=new A();
我们可以看到,test引用的类型是B,但是它的实例是A。
因为A是B的子类,所以这个是可以实现的。
那么test.print()调用的是谁的方法呢?
答案是A的方法。
只有当A没有print方法的时候,才会从上一级(父类)里寻找这个print
接口的性质也是一样的
回到问题:
Connection conn = DriverManager.getConnection(url,user,password);
在这个里面,虽然conn的类型是Connection,但是它的实现是DriverManager.getConnection(url,user,password);的返回值。
既是说,实例是取自getConnnection方法里的。
如果你有源码,可以往里面看看。
当然,你也可以System.out.println(conn.getClass())。
来获取它的实例的类型,肯定不是Connection,而是Connection的实现类。
1.connection(接口)
用于打开应用程序与数据库之间的连接通道,具体如何打开通道则由各数据库厂商提供实现,即
connection接口的实现类来完成
2.statement(接口)
应用程序利用
statement向数据库发送
sql语句,用于发送静态
sql语句,一次性写死完整的
sql语句
解释一下jdbc.jdbc是sun(oracle)公司提出的一套工业标准,用来完成使用java语言访问数据库。各个数据库厂商按照协议实现java连接各自的数据库。
首先driver是每个驱动程序必须实现的接口,然后通过drivermanager来管理并注册驱动,也就是class.forname(driver);有了驱动之后通过url,username,password来获得打开数据库的连接,也就是connection
con=drivermanager.getconnection(url,name,pwd);此时你已经连接上数据库了.
那么连接之后就要对数据库进行curd也就是增删改查操作,此时你需要的是书写sql语句,而statement
sta=connection.createstatement();这个接口则是用于发送静态sql语句的.还有另外一个接口preparedstatement也可以用来发送sql语句,而且这个接口发送的是动态的,其中的参数可以在运行的时候获取.当然了,使用statement来拼接字符串也可以达到这种效果.
当你写好了sql语句并发送的时候,数据库是有操作的.增删改就不多说了,关键是查.你要查询的话肯定是要返回一些值的,但是值不一定是一条.因此在你查询的时候会用到resultset这个接口来封装你的结果集.接下来就是对结果集进行遍历了.
其实jdbc来操作数据库跟我们直接用数据库没什么区别,获得driver就是让java知道这是个什么数据库,然后通过url,username,password来打开数据库.打开之后获得一个statement来书写sql语句,最后通过resultset来处理返回的结果.其实就是把我们连接数据库来实现查询的那些文字输入变成了封装好的接口而已.
形象化一点讲,就好像数据库是一座矿山,此时我们要了解这是个什么矿山,那么就是driver.我们知道了这是什么矿山要对它进行开采需要各种资格证,也就是drivermanager来注册.之后就可以通过资格证来打通一条挖矿的通道了,也就是connection.有了进入矿山的通道,我们需要进入矿山挖矿并运送出来吧?一般都是采用轨道火车,那么我们需要铺好进入矿山之内的轨道并准备好火车.这一步就是statement,因为statement搭载着我们挖掘矿山最重要的工人,也就是sql语句.最后工人们进去挖矿出来了,再由一列火车运出来,这列火车就是resultset,每节车厢里面装的都是一个结果.
这就是jdbc来实现连接数据库.
conn这个对象是Connection类的,所以能够调用里面的方法。
这个很正常啊 conn是Connection的对象啊 对象.方法 没错啊