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行数
  • 相关阅读:
    【Java】基本类型和引用类型(值传递)
    Linux学习笔记:什么是x86
    Java volatile keyword
    C语言可变參实现參数累加返回
    [Network]Application Layer
    linux下select,poll,epoll的使用与重点分析
    卷积神经网络(CNN)基础介绍
    ScrollView嵌套ExpandableListView显示不正常的问题
    【leetcode】 Unique Binary Search Trees II (middle)☆
    【leetcode】 Unique Binary Search Trees (middle)☆
  • 原文地址:https://www.cnblogs.com/hjlin/p/11439216.html
Copyright © 2011-2022 走看看