数据库入口:JDBC

                                                   DataBase Accessing:JDBC
      把以前学习的东西写出来,以便在以后的学习和工作中可以用到!这里我主要是把自己关于数据库学习的一些东西给写出来。
      JDBC提供一套访问关系数据库的标准库。通过JDBC API,我们可以使用完全相同的Java语法访问各式各样的SQL数据库。正式来将JDBC不是一个首字母的缩写词,因此,它不代表任何事情。”Java Database Connectivity”通常是该名称的完整形式。
通常查询数据库可以用7个标准步骤来说明:
(1).载入JDBC驱动程序
如果要载入驱动程序,只需要在Class.forName方法中指定数据库驱动类名。这样做就自动创建驱动程序的实例,并注册到JDBC驱动程序管理器。(注:ForName方法返回给定名称的类的对象,调用该对象相当于调用Class.forName)
(2)定义连接URL(connection URL)
在JDBC中,连接URL指定服务器的主机名,端口以及希望与之建立连接的数据库名
(3)建立连接
有了连接URL,用户名和密码,就可以建立到数据库的网络连接。连接建立之后,就可以执行数据库的查询,直到连接为止
(4)创建Statement对象
创建Statement才能向数据库发送查询和命令
(5)执行查询或更新
有了Statement对象后,就可以用execute,executeQuery,executeUpdate或executeBatch方法发送SQL语句到数据库
(6)结果处理
数据库执行查询完毕之后,返回一个ResultSet。ResultSet表示一系列的行和列,可以调用next和各种getXXX方法对这些行和列进行处理。
(7)关闭连接
这点比较重要,一定要记得关闭连接,释放与数据库的资源。这样可以提高效率。

装载JDBC驱动程序
因为在装载JDBC驱动程序用的是显示的Class.forName所以一定要写在try{}catch{}块中。由于可能会发生ClassNotFoundException所以应当捕获这个异常. Example:
Try
{
Class.forName(“connect.microsoft.MicrosoftDriver”);
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Class.forName(“com.sybase.jdbc.SybDriver”);
}
Catch(ClassNotFoundException e)
{
 out.println(e.getMessage());
}
我们在部署的时候应当注意是把JDBC的驱动程序JAR文件部署到install_dir/common/lib也可以部署到WEB-INF/lib目录中。
建立连接
在建立实际连接的时候,需要将URL,数据库名字和用户名都传给DriverManager类的getConnection方法,由于getConnection有可能会产生异常因此我们应该把这些代码写在try{}catch{}中. Eg:
String URL=”jdbc:oracle:thin:@”+host+”:”+port+”:”+dbName;
String UID=”Database user name”;
String PWD=”Database password”;
Try
{
Conection con=DriverManager.getConnection(URL,UID,PWD);
}
Catch(SQLException e)
{
  e.getMessage();
}
Conection类还包括其他的一些用法!如下:
prepareStatement
创建预编译查询,提交给数据库
prepareCall
访问数据库中的存储过程。
Rollbach/commit
控制事务管理
Close
关闭连接
isClosed
确定连接是否超时或被显示关闭
建立连接过程,一个可选部分是使用getDataMeta方法查找数据库的相关信息,这个方法返回DatabaseMetaData对象,该对象拥有相应的方法,可以得出数据库自身的名称和版本(getDatabaseProductName,getDatabaseProductVersion),或者JDBC驱动程序的名称和版本(getDriverName,getDrvierVersion).例如:
DatabaseMetaData dbMetaData=connection.getDataMeta();
String productName=
dbMetaDate.getDatabaseProductName();
System.out.println(“Database:”+productName);
String produtcVersion=
   dbMetaDate.getDatabseProductVersion();
System.out.println(“Version:”+productVersion);
创建Statement对象
Statement对象用来向数据库发送查询和命令。它由Conection的createStatement()方法创建:
Statement stmt=connection.createStatement();
执行查询或更新
有了Statement对象后,就可以用它的executeQuery方法发送SQL查询,executeQuery返回ResultSet类型对象。Eg:
String sql=”select * from emp”;
ResultSet rs=stmt.execute Query(sql);
Statement的其他的用法:
executeQuery
执行SQL查询并在ResultSet中返回数据.ResultSet可能为空,但不会为NULL。
executeUpdate
用于UPDATE,INSERT或DELETE命令。返回受影响的行数,可以为0,它还提供对DDL(Data Definition Language)命令的支持,例如CREATE TABLE,DROP TABLE和ALTER TABLE。
executeBatch
将一组命令作为一个单元执行,返回一个数组,其中存储每个计数的更新计数。addBatch可以向批量执行的命令中添加命令。
setQueryTimeout
指定驱动程序在抛出SQLException异常之前,等待处理结果的时间。
getMaxRows/setMaxRows
确定ResultSet可容纳的最大行数。超过的行将会在不给出任何警告的情况下丢弃。默认值为0,表示没有限制。
结果处理
结果处理最简单的方式就是用ResultSet的Next方法在表中移动,每次一行。(注:ResultSet中行的第一列索引为1,而非0).建议在访问ResultSet的列时不要使用索引,而使用列名。使用这种方式在表的结构发生改变时,与ResultSet交互的代码不容易出错误。
ResultSet的一些方法集:
Next/previous
将ResultSet中的游标分别移动到下一行。
Relative/absolute
Relative方法将游标相应的地移动特定数目行,或正或负(向前或向后)。Absolute方法将游标移动到指定的行号。如果绝对值是负数,那么游标将相对于ResultSet的结尾进行定位(JDBC2.0)。
getXxx
返回Xxx Java类型(参见java.sql.Types)的值,这个值来自于列名或索引指定的列。如果列的值为SQL的NULL值,那么则返回0或NULL。
wasNull
检查上面的getXxx读到的是否为SQL的NULL值。如果列的类型为基本类型(int,float等),且数据库中的值为0,那么这项检查就很重要。由于数据库的NULL返回0,所以0和数据库的NULL不能区分开来。如果列的类型为对象(String,Date等),可以简单的将返回值与NULL比较。
findColumn
返回ResultSet中与指定列名对应的索引。
getRow
返回当前的行号,第一行从1开始。
getMetaData
返回描述ResultSet的ResultSetMetaData对象。ResultSetMetaData给出列的数目和名称。
getMetaData方法尤为有用。仅仅有ResultSet的情况下我们必须知道列的名称,数目和类型才能正确的对表进行处理。ResultSetMetaData的方法集:
getColumnCount
返回ResultSet中列的数目。
getColumnName
返回列在数据库中的名称.
getColumnType
返回列的SQL类型,对应于java.sql.Types中的项。
isReadOnly
表示数据是否为只读。
isSerachable
表明给列是否可以用在WHERE字句中。
isNullable
表明该列是否可以存储NULL。
(注J: ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数,然而,在JDBC2.0中,可以用last将游标定位于ResultSet最后一行,然后调用getRow获取当前的行号。)
关闭连接
显示的关闭连接:
connection.close();

可以参考以下以下的例子:

import java.sql.*;
import java.io.*;
/**
 * <p>Title: JDBC连接数据库</p>
 * <p>Description: 本实例演示如何使用JDBC连接Oracle数据库,并演示添加数据和查询数据。</p>
 */
public class JDBCConn{
  private  String url="";//数据库连接字符串
  private  String username="";//数据库用户名
  private  String password="";//数据库密码
 
/**
 *<br>方法说明:获得数据连接
 *<br>输入参数:
 *<br>返回类型:Connection 连接对象
 */
  public Connection conn(){
     try {
       //第一步:加载JDBC驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //第二步:创建数据库连接
        Connection con =DriverManager.getConnection(url, username, password);
        return con;
    }catch(ClassNotFoundException cnf){
      System.out.println("driver not find:"+cnf);
      return null;
    }catch(SQLException sqle){
      System.out.println("can't connection db:"+sqle);
      return null;
    }
  catch (Exception e) {
        System.out.println("Failed to load JDBC/ODBC driver.");
        return null;
     }
  }
/**
 *<br>方法说明:执行查询SQL语句
 *<br>输入参数:Connection con 数据库连接
 *<br>输入参数:String sql 要执行的SQL语句
 *<br>返回类型:void
 */
  public void query(Connection con, String sql){
    try{
     if(con==null){
       throw new Exception("database connection can't use!");
     }
     if(sql==null) throw new Exception("check your parameter: 'sql'! don't input null!");
   //第三步:获取Staetment对象
     Statement stmt = con.createStatement();
   //第四步:执行数据库操作(查询操作)
     ResultSet rs = stmt.executeQuery(sql);
   //第五步:处理结果集
   ResultSetMetaData rmeta = rs.getMetaData();
      //获得数据字段个数
     int numColumns = rmeta.getColumnCount();
     while(rs.next())
   {
     for(int i = 0;i< numColumns;i++)
     {
    String sTemp = rs.getString(i+1);
    System.out.print(sTemp+"  ");
     }
    System.out.println("");
   }
    }catch(Exception e){
      System.out.println("query error:"+e);
    }
  }
/**
 *<br>方法说明:执行插入、更新、删除等没有返回结果集的SQL语句
 *<br>输入参数:Connection con 数据库连接
 *<br>输入参数:String sql 要执行的SQL语句
 *<br>返回类型:void
 */
 public void execute(Connection con, String sql){
    try{
      if(con==null) return;
    //第三步:获取Statement对象
    Statement stmt = con.createStatement();
    //第四步:执行数据库操作(更新操作)
    stmt.executeUpdate(sql);
    System.out.println("update executed successly");
    }catch(Exception e){
      System.out.println("execute error: sql = "+sql);
      System.out.println(e);
    }//end try catch
  }//end execute
/**
 *<br>方法说明:实例演示
 *<br>输入参数:无
 *<br>返回类型:void
 */
  public void demo(){
    String sSQL="";
    BufferedReader stdin=new BufferedReader(new  InputStreamReader(System.in));
    try{
      System.out.println("please input update SQL string");
      sSQL=stdin.readLine();//获取命令行输入(更新字符串)
      Connection conn = conn();//执行自定义连接方法(获取数据库连接对象)
      execute(conn,sSQL);//执行自定义更新方法
      String sql = "select * from TBL_USER";
      query(conn,sql);//执行自定义查询方法(查询并处理结果集)
      //第六步:关闭数据库连接
      conn.close();
    }catch(SQLException se){
      System.out.println(se);
    }catch(Exception e){
      System.out.println(e);
    }
 
  }
/**
 *<br>方法说明:主方法
 *<br>输入参数:String[] args 命令行参数(包括:数据库连接URL,
 *<br>用户名,密码)
 *<br>返回类型:void
 */
  public static void main(String[] arg){
    if(arg.length!=3){
      System.out.println("use: java JDBCConn url username password");
      return;
    }
    JDBCConn oc = new JDBCConn();
    oc.url = arg[0];
    oc.username=arg[1];
    oc.password=arg[2];
    oc.demo();
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值