JDBC的进化
1.数据的存储方式的进化
①字符串
②数组
③文件
④数据库
其中①和②是存在内存中,会随着程序的终止而结束,不会保留到本地磁盘
③和④则会将数据存储到本地磁盘,而④可以对数据进行管理,可以根据不同的应用场景选择不同量级的数据库
2.JDBC的进化
起源:
Java程序要对磁盘中的数据进行读写,各大数据库厂商提供了相应的驱动,Java提供了相应的接口进行连接。
进化1:面向对象编程
@Test
public void testOrclJdbc1() throws SQLException {
Driver driver = null;
// get Driver object through the OOP‘s polymorphic
driver = new OracleDriver();
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
Properties info = new Properties();
info.setProperty("user", "scott");
info.setProperty("password", "tiger");
Connection conn = driver.connect(url, info);
System.out.println(conn);
conn.close();
}
应用了面向对象的多态来创建了驱动实例。
缺点:不够灵活,可复用性太差,只是针对的Oracle数据库,同时还需要一个Properties对象的参数。相当于跳过接口(JDBC)直接和一个确定的数据进行了连接。
进化2:面向接口编程1
@Test
public void testJdbc2() throws Exception {
// oracle
// String driverName = "oracle.jdbc.driver.OracleDriver";
// String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
// Properties info = new Properties();
// info.setProperty("user", "scott");
// info.setProperty("password", "tiger");
// mysql
String driverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "123456");
// get the Driver object through reflect
Class<?> clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
// get connection
Connection conn = driver.connect(url, info);
System.out.println(conn);
conn.close();
}
通过反射的方式在运行时动态的确定了Driver对象,这里体现的就是一种面向接口编程的思想(字符串可以任意的改变,但是对象生成后就不可以随便的更改)。注意多多体会
进化3:面向接口编程2
原始1中存在的问题,2中并没有全部解决,这里我们先解决一个,我们希望连接的时候参数类型不要为Properties类型,字符串最好。通过API我们发现了Driver的一个实现类DriverManager,它里边提供了一个静态方法
getConnection(String url, String user, String password) ,三个参数都为String类型,我们需要的就是它。但是它同时有一个说明,
“Attempts to establish a connection to the given database URL. The DriverManager attempts to select an appropriate driver from the set of registered JDBC drivers.”尝试建立一个给定数据库URL的连接,并且尝试从已注册的JDBC驱动中选择一个可获得的驱动,所以这里我们需要将数据库驱动进行注册。它同时提供了一个静态方法registerDriver(Driver driver) 用于注册驱动。我们就按这样来。
// remove properties
@Test
public void testJdbc3() throws Exception {
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
// get driver
Class<?> clazz = Class.forName(driverClass);
Driver driver = (Driver) clazz.newInstance();
// register driver
DriverManager.registerDriver(driver);
// get connection
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
conn.close();
}
到这里,是不是发现程序看起来比起源1漂亮多了?当然,这还不是最终的,再进化。
进化4:面向接口编程3
因为mysql是开源的,我们可以查看它的源代码,这里我们发现了它通过的驱动中,有这么一段代码:
// ~ Static fields/initializers
// ---------------------------------------------
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can‘t register driver!");
}
}
看到这段代码,是不是瞬间感觉好高兴?它已经在静态代码块儿中写好了注册驱动程序,我们只需要将类进行加载就好了,类加载还需要我多说吗?
@Test
public void testJdbc4() throws Exception {
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Class.forName(driverClass);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
conn.close();
}
这里出现了一点疑问,大家也帮我想一想,Class.forName(diverClass)得到的是一个Class对象,而它在静态代码块中加载的是一个new Driver(),我在这里是这样理解的,结合上面“并且尝试从已注册的JDBC驱动中选择一个可获得的驱动”这句话,是不是可以认为它自动的将Class对象转换成Driver对象?这是我的认识,也希望看过这篇博文的朋友多想想,知道其原理的可以给我评论,谢谢。
言归正传,别以为到这里就结束了,还得继续。
进化5:面向接口编程4
每次写这么多连接字符串是不是太麻烦了,用一个配置文件读取吧,多方便,异常一直在抛,咱们给处理一次
@Test
public void testJdbc5() {
Connection conn = null;
try {
//read the driverClass, url, user, password from properties file...
Properties proper = new Properties();
proper.load(new FileInputStream("jdbc.properties"));
String driverClass = proper.getProperty("driverClass");
String url = proper.getProperty("url");
String user = proper.getProperty("user");
String password = proper.getProperty("password");
// load driver
Class.forName(driverClass);
//get connection
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这就算完了吧?嗯?代码这么还变多了?容易,看我的。将这些代码写成一个方法,几行就搞定。
@Test
public void testJdbc6(){
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static Connection getConnection() throws Exception{
//read the driverClass, url, user, password from properties file...
Properties proper = new Properties();
proper.load(new FileInputStream("jdbc.properties"));
String driverClass = proper.getProperty("driverClass");
String url = proper.getProperty("url");
String user = proper.getProperty("user");
String password = proper.getProperty("password");
// load driver
Class.forName(driverClass);
//get connection
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
OK,完事了吧?没。汗,还没,你说还有什么?
这仅仅是JDBC的连接,难道我们仅仅就进行连接?连接后还有数据的增删改查。今天太晚了,得睡觉了,明天学完再写吧,瞌睡。
本来还准备将JavaSE部分集合的总结给写完,但是这篇博客用了好大的功夫,又得留到明天或后天了。睡觉,大家加油!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。