使用JDBC访问数据库

来源:互联网 发布:mac mail 163企业邮箱 编辑:程序博客网 时间:2024/05/16 02:13

1.  odbc和jdbc

      ODBC

               提供了一组对数据库访问的标准API,一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS
   通ODBC访问不同的数据库无需对数据库访问程序进行改动。ODBC十分合理实用,被广泛采用。
     
  
o      JDBC
               Java Database Connection,是按照ODBC的模式制定的,是一个通用低层的、支持基本SQL功能的java API
   这使得程序员可 以面对统一的数据库界面,无需考虑数据库的差异性。
               JDBC使开发数据库无关的java产品成为可能,同时也提供了多样化的数据库连接方式。JDBC是一个将java
   言与SQL结合的API
               JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架。接口包含在java.sqljavax.sql包中,其
      java.sql属于  JavaSEjavax.sql属于JavaEE。这些接口的实现类叫做数据库驱动程序,由数据库的厂商或其它的厂商
  或个人提供。

  
o     JDBC-ODBC bridge(1)
            该驱动程序的实现是通过将JDBC的调用全部委托给其它编程接口来实现的,比如ODBC。这种类型的驱动程
  需要安装本地代码库,即依赖于本地的程序,所以便携性较差。如JDBC-ODBC桥驱动程序。Application-->JDBC-ODBC  
    Bridge(Type1 jdbc driver)--->JDBC-ODBC Library-->ODBC Driver-->Database
        适用于快速的原型系统,没有提供JDBC驱动的数据库如Access
   
 
o  部分Java技术的本地API驱动程序(2)
          该类型的驱动程序的实现是部分基于Java语言的。即该驱动程序一部分是用Java语言编写,其它部分委托本地
  的数据库的客户端代码来实现。同类型1的驱动一样,该类型的驱动程序也依赖本地的程序,所以便携性较差
   Application--->JDBC Driver(Type2 jdbc driver)--->Native Database library--->Database
            比类型1性能略好。
  
o  全部基于Java技术的本地API驱动程序(3)
             全部基于Java语言的。该类型的驱动程序通常由某个中间件服务器提供,这样客户端程序可以使用数据库无关
  的协议和中间件服务器进行通信,中间件服务器再将客户端的JDBC调用转发给数据库进行处理。
    Application---> JDBC Driver(Type3 jdbc driver)--->java middleware--->Database
            具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。

    
 
o  全部基于Java技术的本地协议驱动程序(4)
              全部基于Java语言的。该类型的驱动程序中包含了特定数据库的访问协议,使得客户端可以直接和数据库
  进行通信
             Application---> JDBC Driver(Type4 jdbc driver)--->Database
            具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。
 
 
  对于没有提供相应JDBC驱动程序的数据库系统,可以使用JDBC-ODBC桥接驱动程序。
 
     
  
  应用程序使用JDBC访问数据过程:
 
2 使用JDBC访问数据库
2.1 与数据库建立连接
o      加载数据库驱动程序
      Class.forName(驱动程序串);
   或:
     DriverManager.registerDriver(驱动程序实例);
o    与数据库建立连接
    Connection conn = DriverManager.getConnection(dbUrl,user,password);
2.1.1 JDBC-ODBC桥形式连接数据库
       //加载驱动程序
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   或:
      DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
     //连接各种数据库的dsn
    String dbUrl="jdbc:odbc:dsn名称";
  访问Access也可如:
   dbUrl="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=c://student.mdb";
2.1.2 JDBC直连(连接类型4)形式连接数据库
   //加载具体数据库的驱动:
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
 或:
  DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver());
  //建立连接串
  String dbUrl= "jdbc:microsoft:sqlserver://localhost:1433;databasename=student";
 
例各数据的驱动程序和url连接串:
o 连接MySQL
Class.forName("org.gjt.mm.mysql.Driver");
//Class.forName("com.mysql.jdbc.Driver");
dbUrl="jdbc:mysql://localhost/student";
o连接Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");
dbUrl="jdbc:oracle:thin:@localhost:1521:student";
o连接SQL Server2000
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
dbUrl="jdbc:microsoft:sqlserver://localhost:1433;databasename=student";
o连接DB2
Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
dbUrl="jdbc:db2://localhost:5000/student";
o连接sybase
Class.forName("com.sybase.jdbc.SybDriver");
dbUrl="jdbc:sybase:Tds:localhost:5007/student";
oInformix数据库
Class.forName("com.informix.jdbc.IfxDriver");
dbUrl="jdbc:informix-sqli://123.45.67.89:1533/student:INFORMIXSERVER=myserver;";
o连接SQL Server2005
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dbUrl="jdbc:sqlserver://localhost:1433;database=mydb";
2.1.3 访问数据库
        建立连接之后,可以访问数据库,对数据库进行操作。如查询、修改、删除。
2.1.4 关闭连接
        连接使用完毕,可以调用close()方法关闭连接
注意:
        在建立连接和操作数据库时可能会产生异常,需要对异常进行处理。
2.2 查询数据库
        JDBC中,数据库查询由实现接口StatementPreparedStatementCallableStatement的对象完成。
2.2.1 Statement
       Statement对象用于一般语句的执行。要执行查询语句,首先应当创建一个Statement对象。
(1)创建Statement对象
Statement stmt=conn.createStatement();
(2)执行查询语句
ResultSet rstmt.executeQuery("SELECT name FROM books WHERE price>20");
关闭Statemente对象
stmt.close( );
        无用的Statement对象在垃圾回收时会被自动关闭。但最好在使用完Statement对象时立即关闭,
 以释放资源。在关闭Statement对象时,其相应的结果集也被关闭。
2.2.2 处理结果
        调用executeQueryexecute方法执行查询语句返回的结果是实现ResultSet接口的对象。我们可以对返回的
结果进行处理。
(1)ResultSet接口的基本处理方法
        ResultSet对象包含了一个由查询语句返回的一个表,这个表包含所有的查询结果。
   对ResultSet对象的处理必须逐行进行,而对每一行中的各个列,可以按照任何顺序进行处理。
        ResultSet对象有一个指向当前行的指针。
oResultSet对象执行过程
        ResultSet对象第一次调用next方法时,指针指向结果集的第一条记录,可以对第一行数据进行处理。
   处理完毕后,再次调用next方法,指针移向下一行,然后继续处理数据。 next()返回类型为boolean
   如果返回值为true,则说明指针成功移向下一行,可以对该行数据进行处理。
   如果返回值时false,则说明没有下一行(结果处理完毕)
        通过getXXX(字段编号)getXXX(字段名)获取每行不同字段的数据,如:
        int sno=getInt("sno"); //getInt(1);
        String sname=getString("name");//getString(2);
(2)查询语句执行状态的处理
oexecuteQuery(String sql)
         用来执行查询语句,返回一个ResultSet对象。
oexecuteUpdate(String sql)
         用来执行更新语句(如UPDATEINSERTDELETE),返回更新的记录数。
oexecute(sql)
        用来执行SQL语句,返回boolean;如果第一个结果ResultSet类型,则返回true,否则返回false
    一般情况下返回为false
(3)主动获取查询结果(Statement方法)
        如果当前结果是ResultSet类型,可以使用getResultSet方法获得当前结果集,然后对其进行处理。
        如果当前结果是一个更新记录数,可以使用getUpdateCount方法获得更新记录数。
        如果当前结果是一个ResultSet对象或没有结果了,则返回值为-1。所以首先应该检查一个结果是否是
         ResultSet类型,如果不是,则可能是更新记录数,或不再有结果。 getMoreResults返回值为boolean类型,
   如果下一个结果是ResultSet类型,则返回true,否则返回false。
2.2.3 PreparedStatement
        Statement对象在每次执行SQL语句时,都要把SQL传递给数据库进行解析,在多次执行同一条语句时,效率很低
       ResultSet rnull;
       r=stmt.executeQuery("SELECT * FROM student WHERE name='zhangsan'");
       r=stmt.executeQuery("SELECT * FROM student WHERE name='lisi'");
       r=stmt.executeQuery("SELECT * FROM student WHERE name='wangwu'");
        如果数据库支持预编译,PreparedStatement对象可以把SQL语句传递给数据库进行预编译,以后每次执行同样的
       SQL语句时,速度可以提高很多。
(1)创建一个PreparedStatement对象
        PreparedStatement对象的SQL语句可以接受参数。在语句中,指出需要接受哪些参数,然后进行预编译。
                  在每一次执行时,可以传递给SQL语句不同的参数。
        PreparedStatementStatement接口的子接口,继承了父接口中的方法。
o        PreparedStatement对象上的查询语句和更新语句都可以设置输入参数。在生成PreparedStatement对象时,
    在SQL语句中用""标明参数,在执行SQL语句前,可以使setType方法进行赋值。例:
        PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM student WHERE name=?");
o   然后使用executeQueryexecuteUpdate方法来执行这个语句。
        每一次执行SQL语句前都可以对参数重新赋值。
        setType方法用于给相应的输入参数赋值。TypeJDBC数据类型,如IntString等。setType方法
   有两个参数,第一个参数代表要赋值的参数在SQL语句中的位置,第一个要赋值的参数的位置为1
   第二个要赋值的参数的位置2,以此类推。 
   例:
       pstmt.setInt(1,100);
       pstmt.setString(1,"张三");
(2)执行查询语句
      ResultSet r=pstmt.executeQuery( );
             该类对象在调用executeQuery方法时,无需传递给方法参数。因为在创建PreparedStatement对象时已经对需要执行
   的SQL语句进行了预编译。在执行时,只要执行已经编译好的语句即可。
        上述语句可以执行多次,而无需重新给出SQL语句。executeQuery方法返回一个ResultSet对象。
        PreparedStatement接口有一个不带参数的execute法,能够返回多个结果集。
(3)关闭
    pstmt.close();
    PreparedStatement对象可以调用close方法来进行闭。

原创粉丝点击