zoukankan      html  css  js  c++  java
  • JDBC基础:

    JDBC介绍: 

    通过使用JDBC,Java程序可以非常方便地操作各种主流数据库,并且由于Java语言的跨平台特性,使用JDBC编程的程序不仅可以实现跨数据库,还可以跨平台,具有非常优秀的可移植性。

     程序可以使用JDBC API以统一的方式来连接不同的数据库,然后通过Statement对象来执行标准的SQL语句,并可以获得SQL语句访问数据库的结果。因此我们不必为了访问Oracle数据库去专门学习一组API,为了访问Mysql数据库而去专门另外一种API。因此使用JDBC编写应用程序时,根据不同的数据库,使用不同的数据库驱动程序便可。

     Java语言为了使JDBC程序可以跨平台,则需要不同的数据库厂商提供相应的驱动程序。下面是JDBC驱动示意图:

         

     正是通过JDBC驱动的转换,才使得使用相同JDBC的API编写的程序,在不同的数据库系统上运行良好,JDBC可以完成以下三个基本工作:

     1. 建立于数据库的连接

     2. 执行SQL语句

     3. 获得SQL语句的执行结果

     JDBC驱动程序:

     数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用。大部分数据库系统,例如Oracle和Sybase等,都有相应的JDBC驱动程序,当需要连接某个特定的数据库时,必须有相应的数据库驱动程序(即相应数据库驱动程序的Jar 包)。

     除了JDBC外,还有一种是ODBC的技术,其全程是Open Database Connectivity,即开放数据库连接。ODBC也允许应用程序通过一组通用的API访问不同的数据库管理系统,从而使得基于ODBC的应用程序可以在不同的数据库之间切换。同样,ODBC也需要各数据库厂商提供相应的驱动程序,而ODBC则是负责管理这些驱动程序。严格来说,在早期JDBC是将JDBC API映射到了ODBC API从而现实了跨平台访问数据库。

     JDBC驱动通常有如下4中类型:

      第一种JDBC驱动:称为JDBC-ODBC桥,这种驱动时最早实现的JDBC驱动程序,主要目的时为了快速推广JDBC.这种驱动将JDBC API映射到ODBC API。不过这种方式再Java 8得时候已经删除了

      第二种JDBC驱动:直接将JDBC API 映射成数据库特定的客户端API。这种驱动包含特定数据库的本地代码,用于访问特定数据库的客户端。

      第三种JDBC驱动,支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库。

      第四种JDBC驱动:是纯JAVA的,直接于数据库实例交互。这种驱动是智能的,它知道数据库使用的底层协议。这种驱动是目前最流行的JDBC驱动。

      通常建议选择第4种JDBC驱动,这种驱动避开了本地代码,减少了应用开发的复杂性,也减少了产生冲突和出错的可能性。如果对性能有要求的话,可以选择第二种JDBC驱动,但使用这种驱动,会增加编码和维护的困难。下面的示意图左边是第一种JDBC驱动与第四种JDBC驱动。图二是第二种JDBC驱动的示意图,图三是第三种JDBC驱动的示意图:

       

        图二    图三

     

     目前ODBJ与JDBC相比较,ODBC更加复杂,ODBC中有几个命令需要配置很多复杂的选项,而JDBC则采用简单、直观的方式来管理数据库连接,同时JDBC比ODBC安全性更高,更容易部署。

    JDBC的常用接口与类以及JDBC编程步骤:

     JDBC的编程步骤可以分成以下几大步骤:

      1. 加载数据库驱动:对于不是使用开发软件编写的话,需要使用class.forName()方法来加载数据库驱动;对于使用开发软件编写的话,则将数据库的jar包加载到开发软件即可。

      2. 通过DriverManager调用getConnection(String url ,Stirng user,String pass)方法获取对应的数据库连接对象(Connection):

        DriverManager:用于管理JDBC驱动的服务类,该类的主要功能是给程序提供Connection对象,方法为getConnection(String url ,Stirng user,String pass),对应的参数分别是数据库URL,登陆数据库用户名以及密码,作用是返回url对应数据的连接。

      3.通过Connection对象创建Statement对象:

        Connection:代表数据库连接对象,每个Connection代表一个与数据库连接的会话。要访问数据库,必须先获得数据库连接。它会使用以下三个方法返回Statement对象:

         1. Statement createStatement():该方法返回一个Statement对象

         2. PreparedStatement prepareStatement(String sql):该方法返回预编译的Statementd对象,是将SQL语句提交到数据库进行预编译。

         3. CallableStatement prepareCall(String sql):该方法返回CallableStatement对象,该对象用于存储过程。

      4. 使用Statement对象来执行任何SQL语句,并获得结果集(ResultSet或者int): 

        Statement:是用于执行SQL语句的接口。该对象可以既可用于执行DDL,DCL语句,也可用于执行DML语句,还可用于执行SQL查询,返回查询到的结果集合。它的常用方法如下:

         1. ResultSet executeQuery(String sql) :该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于查询语句。

         2. int executeUpdate(String sql):该方法用于执行DML语句,并返回受影响的行数;该方法可用于执行DDL语句,执行DDL语句将返回0。

         3. Boolean execute(String sql):该方法可执行任何SQL语句。如果执行后第一个结果为ResultSer对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false。

         4. executeLargeUpdate(String sql):该方法是Java 8新增的方法,相当于executeUpdate(String sql)方法的增强版,返回值是long数据类型,也就是,当DML语句影响的记录条数超过了Integer.MAX_VALUE时,就应该使用executeLargeUpdatef()方法,不过该方法目前还未让所有的数据库驱动都支持。

         PreparedStatement:预编译的Statement对象,是Statement的子接口,它允许数据库预编译SQL语句(这些语句通常带有参数),以后每次只改变SQL命令的参数,避免数据库每次都需要编译SQL语句,对应Statement而言,使用PreparedStatement执行SQL语句时,无需再传入SQL语句,只要为预编译的SQL语句传入参数值便可。因此它比Statement方法多了如下方法:

          void setXxx(int parameterIndex,Xxx value):该方法根据传入参数的类型不同,需要使用不同的方法。传入值根据索引传给SQL语句中指定位置的参数。

      5. 操作结果集: 

        ResultSet:结果集合对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获取列数据。它包含如下常用方法来移动记录指针:

         1. void close(): 释放ResultSet对象

         2. boolean absolute(int row):将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行,并且移动后的记录指向一条有效记录,返回true,否则返回false。

         3. boolean first():将ResultSet的记录指针定位到首行。如果移动后的记录指向一条有效记录,返回true,否则返回false。

         4. boolean previous():将ResultSet的记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则该方法返回true,否则返回false。

         5. boolean last(): 将ResultSet的记录指针定位到最后一行。如果移动后的记录指向一条有效记录,返回true,否则返回false。

         6. void afterLast(): 将ResultSet的记录指针定位到最后一行之后。

      6. 回收数据库资源。包括挂壁ResultSet,Statement和Connection等资源

    JDBC连接mysql数据的简单示范:

    public class JDBC {
        
        public void easiyJDBC(){
            try{
    //            Class.forName("com.mysql.jdbc.Driver");
                Connection conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");
                System.out.println("数据库连接情况:"+conn);
                Statement statement =conn.createStatement();
                String sql = "select count(*) from tb_user";
                ResultSet resultSet = statement.executeQuery(sql);
                if(resultSet.first()){//将记录指针移动到第一行
                    System.out.println("tb_user表中一共有"+resultSet.getInt(1)+"行数");                
                }
                resultSet.close();
                conn.close();
            }catch(Exception e){}
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            JDBC jdbc = new JDBC();
            jdbc.easiyJDBC();
        }
    }

    上述代码中,连接了mysql数据库,并对该数据库进行了对tb_user表查询了该表的总行数。运行效果如下:

    数据库连接情况:com.mysql.jdbc.JDBC4Connection@3d646c37
    tb_user表中一共有10行数
  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/hjlin/p/11439216.html
Copyright © 2011-2022 走看看