传智播客 JDBC基础之访问数据库的流程与示例

来源:互联网 发布:中文编程语言 编辑:程序博客网 时间:2024/05/18 19:35

 

    JDBC视频教程是由李勇老师讲解的,李勇老师编写的代码非常专业和实用,整个内容都是采用实际项目中应用的高水准代码,并且是站在较高层次上进行了深入讲解。所以这套JDBC视频对于初学者来说不一定是最好的视频,但是对有点基础的人来说,李勇老师讲解的内容是相当有益处的,完全掌握李勇老师编写的那些代码,自己的编码能力会有很大提高。
    JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。JDBC是J2SE的一部分,由java.sql,javax.sql包组成。JDBC主要就是一个接口,应用程序可以面向JDBC编写代码来访问数据库,每个数据库厂商根据JDBC标准,开发出相应的驱动(实现JDBC接口),这样应用程序就可以通过相应的驱动去访问特定的数据库。通过这种分工,编写应用程序时就不用了解各个数据库的底层知识,只需要了解JDBC规范,按照这个规范来访问数据库,节省了大量的成本,降低了难度。
    对JDBC有了一个感性的认识后,李勇老师用了一个快速起步示例来演示和说明怎么利用JDBC来访问数据库。首先是建立实验的数据库jdbc,数据库环境用的是mysql。然后创建一个user表,列分别是id,name,birthday,money,类型分别是integer,varchar,date,float。有了这些准备后就可以写代码了:
        static void test() throws SQLException, ClassNotFoundException {
            // 1.注册驱动
            //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
            Class.forName("com.mysql.jdbc.Driver");// 推荐方式
            // 2.建立连接
            String url = "jdbc:mysql://localhost:3306/jdbc";
            String user = "root";
            String password = "123456";
            Connection conn = DriverManager.getConnection(url, user, password);
            // 3.创建语句
            Statement st = conn.createStatement();
            // 4.执行语句
            ResultSet rs = st.executeQuery("select * from user");
            // 5.处理结果
            while (rs.next()) {
                System.out.println(rs.getObject(1) + "/t" + rs.getObject(2) + "/t"
                        + rs.getObject(3) + "/t" + rs.getObject(4));
            }
            // 6.释放资源
            rs.close();
            st.close();
            conn.close();
        }
    上面的代码就是最简单的方式利用的JDBC访问数据库。总得来说分了六个步骤。第一步是注册驱动,同时不要忘了引入mysql的驱动jar包。注册驱动的方式有三种,第一种是用DriverManager的registerDriver方法;第二种是通过设置系统属性来注册,用System类的setProperty方法,这种方式之所以能注册驱动是因为DriverManager在初始化时会自动载入相应系统属性的驱动类;第三种方式就是通过Class类的forName方法载入相应驱动的字节码来注册驱动,这种方式能注册驱动是因为通过这种方式载入类的字节码时会执行代码中的静态代码块,而静态代码块中显示调用了第一种方式来注册驱动。总的来说,第三种注册驱动的方式要好一些,因为第一种方式注册驱动时会导致注册两次的现象,而且在代码中引入了特定的驱动类包,这将使代码产生依赖性。
    第二步是建立连接,建立连接可以比作是建立一座桥,这一步花费的代价和时间相对来说都是很大的。创建连接时需要根据URL在前面注册的驱动类中去寻找相应的驱动,如果找不到将会出现错误。建立连接是通过DriverManager的getConnection方法创建的,该方法需要三个参数分别是URL,用户名和密码。这三个参数需要说明的是,URL的格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…,而用户名和密码可以用"属性名=属性值"方式告诉数据库;同时URL中可以添加其他参数如:useUnicode=true&characterEncoding=GBK等等。
    第三步就是创建执行SQL的语句(Statement),Statement对象就是用来装载SQL语句的,可以比作运东西的货车,里面装的SQL语句。紧接着就是第四步执行语句和第五步处理执行结果(ResultSet),相应的代码如上所示。第六步是释放资源,即释放ResultSet, Statement, Connection。数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。上面的演示代码很不规范,比如在释放语句执行过程中,出现异常,那么最后的Connection就不会释放。
    一种改进的方式就是将会产生的异常的代码放入try-catch块中,其中资源的释放放在finally块中来保证资源被正确释放掉。将会产生异常的语句放入try语句块比较容易,只需把上面代码的变量抽取在try语句块外面,其它放入try语句块里面就解决问题了。需要注意的就是finally语句块中释放资源的写法。代码如下:
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }finally {
            try {
                if (st != null)
                    st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (conn != null)
                    try {
                        conn.close();
                    } catch (SQLException e) {
                          e.printStackTrace();
                    }
             }
        }
    上面的释放资源代码算得上比较完善了,能够保证Connection在前面资源释放出现异常情况下仍然能正确释放。这只是实行了初步的优化,后面将有更多的优化直到产生模板代码。

原创粉丝点击