JDBC
下面贴出一段规规矩矩的Java连接数据库的代码:
Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456"); Statement st=conn.createStatement(); ResultSet rs=st.executeQuery("select * from student");while(rs.next()){ Object o1=rs.getObject(1); Object o2=rs.getObject(2); p(o1+","+o2); } rs.close(); st.close(); conn.close();
这是Java连接数据库的一整套代码,大家都不会陌生,我曾经以为背过这些就算会连接数据库了,我发现自己很错。
其实我只是在背别人的API而已,没有丝毫长进。毛主席说过一句话,在战略上要藐视敌人,在战术上要重视敌人,在“战略”上,我要藐视它,我在背API,毫无用处,而我却以此为荣。在“战术”上重视它,存在即有它的道理,我背过了熟练了,只是提高了我的开发速度,和我的成长没有半毛钱关系,我如果数年如一日的只会熟练地掌握它,那我就废啦。
而我要真正学习的是它背后的思想,背后的架构设计,它是如何做到可扩展性的?它的架构设计到底是咋样的?。
加载驱动程序
先给出硬件上驱动的含义,驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。
所以,这里将MySQL数据库比作硬件设备,Java Application要和它进行通信,MySQL数据库厂商必须要编写满足Java定义的规范的“驱动程序”,到时Java会调用驱动程序运行程序,两者正常工作。
而Java定义的规范就是java.sql.Driver接口,而MySQL数据库厂商提供的驱动程序com.mysql.jdbc.Driver实现了该接口。总的来说,Java提供规范,也就是接口,MySQL数据库厂商提供具体针对MySQL的实现,这样,利用面向对象的三大特性之一多态,实现了系统了可扩展性。如果客户要求使用Oracle数据库,这样系统架构也不会改变。
对static静态变量的认识
com.mysql.jdbc.Driver里面的静态代码块的具体实现:
java.sql.DriverManager.registerDriver(new Driver());
而我们得到连接时,直接使用DriverManager.getConnection(参数)得到了。这是为啥呢?
因为static静态变量被该类的所有对象所共享,所以我们在任何地方调用DriverManager.getConnection(参数)都可以得到原来注册的Driver。
所谓的注册不过就是添加到驱动管理类中的静态成员变量,注册之后,在任何地方使用类名或者对象就能获得该变量中的Driver,然后在进行操作。
总结,这里利用了static静态变量的全局共享的特点。
Java接口及MySQL实现类