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部分集合的总结给写完,但是这篇博客用了好大的功夫,又得留到明天或后天了。睡觉,大家加油!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。