关于JDBC的学习总结,新手写的第一篇学习帖子

来源:互联网 发布:淘宝卖家早点收到货款 编辑:程序博客网 时间:2024/06/05 03:53

最近刚学了JDBC,做一下总结,可以给新朋友们一些帮助

刚接触java也许有很多都是在认识上和理解上错误的地方,如果发现不要见怪,还望能直接指出

 


第一步导入包:

需要导入总共6个包:

import java.sql.SQLException;   --->要操作数据库必然会发生异常,数据库本身就自己的异常处理
import java.sql.Connection;     --->创建一个对象用来连接数据库
import java.sql.DriverManager;  --->Connection对象需要调用DriverManager下面的getConnection()方法
import java.sql.Statement;   --->执行SQL语句
import java.sql.PreparedStatement;  --->预处理SQL执行语句,特点执行速度要比Statement快
import java.sql.ResultSet;   --->结果集好像使用SQL的查询语句才用到这个,至少现在遇到的是这样

其中Statement和PreparedStatement,根据自己的需要处理SQL语句执行的方式不同来选择导入
个人认为PreparedStatement 这个比较好用,不用过多的把精力放在SQL语句字符串格式上面
而且因为是预处理方式执行速度到比Statement快

第二步驱动:

java连接数据库总共有4种方式:

1、JDBC - ODBC 桥驱动方式
 ODBC简单的说是Microsoft提供的访问数据库的C语言接口,java程序只不过是调用了一下
 所以,在调用之前要先设置好ODBC数据源,否则无法使用。可以片面的理解为是java程序
 使用ODBC,ODBC呢根据操作访问数据库,然后数据库去操作把结果返回给ODBC,ODBC再给
 java程序,所以这种方式在处理数据量相对于大的程序的时候会慢的要死,因为不是直接
 访问的,java和SQL就好象牛郎和织女一样隔河相望。

2、本地API部分Java驱动程序  没学,我也不知到怎么总结

3、JDBC网络纯Java驱动程序  同上记住吧

4、纯java驱动方式
 这种方式就是java自己的访问数据库的方式了,非常好用,也是我们需要掌握的 
 

关于驱动的加载和创建连接:

1、JDBC-ODBC方式:

 (1) 既然要加载驱动就要告诉程序驱动在哪所以我们先定义一个变量用来存放驱动的路径:
   通常语句这样写:
   String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
   有人认为这个变量基本上不用改变设置为常量更合理所以也可以写成:
   final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
   如果你的方法想不需要创建对象就访问的话在final前加上static即可

 (2) 调用Class的forName()方法加载驱动,既然指定驱动的位置,必然就可能发生驱动找不
   到的情况所以加载驱动之前,必然要处理异常:

    try{
     Class.forName(Driver);
    }catch(ClassNotFoundException ex){
     System.out.println("加载驱动时出错:驱动没有找到!");
    }
 
 (3) 建立同数据库的连接:
   指明数据库的所在位置,既然指明数据库的位置就有可能发生数据库不存在的情况,因
   此需要处理异常。
   JDBC-ODBC方式一般把数据库的地址放在一个变量中:
   final String URL = "jdbc:odbc:数据库的名字,登陆名,密码";
   如果数据库在ODBC数据源设置的名字是NetBar,登陆名:zqlei,密码:123的话,语句就
   好像:final String URL = "jdbc:odbc:NetBar,zqlei,123";
   其中登录名和密码可以省略就好像:
         final String URL = "jdbc:odbc:NetBar";
   
   try{
    Connection con = DriverManager.getConnection(URL);
    if(con != null){
     System.out.println("数据库连接成功!");
     }
   }catch(SQLException ex){
    System.out.println("创建数据库连接错误!");
    }
    
2、纯java方式:

 1>驱动:final String Driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  url分为:

    (1)url1 :表示SQLServer的路径。

    (2)serverName  :表示服务器的名称。

    (3)portNumber :表示端口号一般是1433。

    (4)databaseName :存储数据库名称。

    (5)userName :存储用户名。

    (6)password :存储密码。

  语句通常如下:

    String url1 = "jdbc:microsoft:sqlserver://";
    String serverName = "localhost";
    String portNumber = "1433";
    String databaseName = "abc";  --->数据库名是什么写什么。
    String userName = "zqlei";  --->用户名是什么写什么。
    String password = "123";   --->密码是什么写什么。
    String url = url1 + serverName + ":" + portNumber + ";" + "databaseName=" + databaseName + ";";
    注意上面一行的符号。

  固定格式:
    url = "jdbc:microsoft:sqlserver://服务器名称:端口号;databaseName=数据库名称;";
    注意上面的引号中不要有空格否则能连接上数据库但是不能访问数据库中的表。

 2>加载驱动:

    try{
     Class.forName(Driver);
    }catch(ClassNotFoundException ex){
     System.out.println("驱动没有找到");
     }   

 3>创建连接:
    try{
     Connection con = DriverManager(url,userName,password);
     if(con != null){
      System.out.println("连接数据库成功");
      }
     }catch(SQLException ex){
      System.out.println("数据库连接异常");
      }   
 
第三步执行SQL语句
   前面已经简单的介绍过执行的时候有2种方式Statement和PreparedStatement,其中PreparedStatement
 是预处理方式执行SQL语句,特点比Statement效率高,而且方便。
   一般情况下习惯把SQL语句放到一个字符串中类似于:
     String sql = "SELECT * FROM dbo.user"; 这样做更易于更改,当发现sql语句出错的时候可以改
   sql的值完成修改,而不是一行一行的查语句,可以事半功倍。
     
   现在我们先看看Statement方式
   
   1> Statement
   创建Statement对象语句:
   
   Statement stmt = con.createStatement();  调用Connection 对象的createStatement()方法
   执行SQL语句:
   stmt.excuteQuery(sql);
   
   注意:
      
   众所周知SQL如今所学的语句无非就4种,增 删 改 查。在java处理中增删改为一种处理方法,查看
 是另一种处理方法。因为SQL中查看语句的执行结果是查看的结果集,而增删改的结果则是所影响的数据
 行数。以此区分,因此当语句属于增 删 改的话 使用excuteUpdate()方法执行,返回值是SQL语句所影响
 的行数,可以用一个整型变量存放。而查询的时候因为是结果集使用excuteQuery()方法,返回值是一个
 ResultSet对象,所以先创建ResultSet对象:
   ResultSet对象的创建:
   ResultSet rs;
   rs = stmt.excuteQuery(sql);
   
   
   那么如何得到查询的结果呢?比如有如下表:
   表名:dbo.student
   表列:
    stuNo   stuName  stuAge  stuGrade  stuAddress
   
   表值:
    学号     姓名   年龄   总成绩   住址
      
   10080    刘强    25     108    长安区长安公园
   10090    赵芳   21     200    西郊动物园
   10070    王莉   23     317    省政府招待处
   10080     李莉   26     512    省政府招待处餐厅 
   
   需要查询所有的人员的信息语句可以这样写:
   
   
   import java.sql.SQLException;
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.Statement;
   import java.sql.ResultSet;
   
   public class Test{
    final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
    final String URL = "jdbc:odbc:Test";
    Connection con;
    Statement stmt;
    ResultSet rs;
    
    /**
     *此方法用于连接数据库
     *方法执行结果返回一个Connection对象
     */
    public Connection getConnection(){
     try{
      Class.forName(DRIVER);                    --->加载驱动
     }catch(ClassNotFoundException ex){
      System.out.println("加载数据库驱动错误:类没有找到" + ex);
      }
     
     try{
      con = DriverManager.getConnection(URL);            --->创建连接
      if(con != null){
       System.out.println("数据库连接成功");
       }
      }catch(SQLException ex){
       System.out.println("数据库连接发生异常:" + ex);
       }
     return con;
     }
     
    /**此方法完成执行SQL语句并输出查询结果*/ 
    public void execute(){
     String sql = "SELECT * FROM dbo.student";
     con = getConnection();            --->调用Test类的getConnection()方法,用于创建连接
     stmt = con.createStatement();
     rs = stmt.excuteQuery(sql);       --->要执行的SQL语句的字符串sql加到这里
     
     System.out.println("/t/t/t学号/t/t/t姓名/t/t/t年龄/t/t/t总成绩/t/t/t住址");
     
     while(rs.next()){
      String stuNo = rs.getString(1);       --->对应的是学号列          
      String stuName = rs.getString(2);      --->对应的是姓名列
      String stuAge = rs.getInt(3);        --->对应的是年龄列
      String stuGrade = rs.getInt(4);       --->对应的是总成绩列
      String stuAddress = rs.getString(5);    --->队形的是住址列
      System.out.println("/t/t/t" + stuNo + "/t/t/t" + stuName + "/t/t/t" + stuAge + "/t/t/t"
               + stuGrade + "/t/t/t" + stuAddress);
      }
     rs.close();     --->这三行是关闭数据库按照创建的顺序,逆向关闭
     stmt.close();       不过这种方法不推荐使用。
     con.close();    一会我们要说到如何关闭。
     
     }
     
    /**main方法*/
    public static void main(String [] args){
     Test obj = new Test();
     obj.execute();     
     }
    }
   
           
    查询语句的结果,都放到了ResultSet 对象rs里面,rs有很多行当中的rs.next()用来判断下一行是否有数据
  当返回值为真的时候while循环执行,有多少行结果就循环多少次。
  ResultSet 有很多方法如果想要得到字符串数据就getString(),整型的getInt(),双精度getDouble();因为数据库
  是按照表的形式存储的,行和列的交叉的地方就是一个单元,这些get方法得到的就是其中一列的值,第一列索引
  为1第n列为n,自己选择就ok了。
  
  2> PreparedStatement
   PreparedStatement执行的时候需要 ?
   比如像查询学号为 10070 的记录,sql可以这样写
   String sql = "SELECT * FROM dbo.student WHERE stuNo = ?";
   然后指定 ?的值:pstmt.setString(1,"10070")即可,比较方便省去了写sql的时间
   
   比如有 dbo.Record表
   
   表列为:
   id   cardId   ComputerId   BeginTime    EndTime   Fee
   
   内容:
   
   记录id 卡id   计算机id   开始时间         下机时间     花费
   001   111111  1     2007-10-1 15:10:00  2007-10-1 17:00:00  null
   002   222222  2     2007-10-1 15:10:00     null      null
   003     333333    3         2007-10-1 15:12:00     null      null 
         
   其中由其他方法得到4个变量:
   String computerId = "2";
   String beginTime = "2007-10-1 15:10:00";
   String endTime = "2007-10-1 19:00:00";
   int fee = 2;
   现在我们要更新 记录computerId = 2 且 开始时间为:2007-10-1 15:10:00的  Endtime 为 2007-10-1 19:00:00,fee 为2
   的话:  
   
   String sql = "UPDATE dbo.Record SET EndTime = ?,Fee = ? WHERE ComputerId = ? AND BeginTime = ?";
   再用PreparedStatement 创建stmt调用set***的方法就可以了
   
   
   其中有人也许会有疑问:
   我直接写
   String sql = "UPDATE dbo.Record SET EndTime = '2007-10-1 19:00:00'"
          + ",Fee = 2 WHERE ComputerId = '2' AND BeginTime = '2007-10-1 15:10:00'";   注意当中的单引号必须有的
   不行么?
   
   单凭语句的话,没有问题,但是fee,BeginTime,computerId,EndTime这些值在程序设计初期并不是常量值,也许是其他方法指
   定的也许是通过某种运算的到的,如果想用Statement执行的话sql语句可以改写为
   
   String sql = "UPDATE dbo.Record SET EndTime = '" + EndTime + "',Fee = "
          + Fee + "WHERE ComputerId = '" + computerId "' AND BeginTime = '"
          + BeginTime "'";
   其中很麻烦也很容易出错,这就发现PreparedStatement的好处了吧?
   
   语句可以这样写:<语句片断>
   
   String sql = "UPDATE dbo.Record SET EndTime = ?,Fee = ? WHERE ComputerId = ? AND BeginTime = ?";
   pstmt = con.prepareStatement(sql);
   pstmt.setString(1,endTime);
   pstmt.setInt(2,fee);
   pstmt.setString(3,computerId);
   pstmt.setString(4,beginTime);
   int num = pstmt.executeUpdate();
   if(num > 0){
    System.out.println("数据更新成功");    
    }
   
   其中set***方法指定在第几个?号位置设置什么样的值 参数为2个,第一个指定设置哪个?,第二个参数指定值
   如果设置整型的用setInt(),字符串setString();,double,setDouble(),等等API很详细,欢迎大家踊跃查询。
   
   3>关于关闭数据库操作
     关闭数据库操作要放到try块中使用可以这样写
     
    先写关闭的方法
    public closeRs(ResultSet rs){
      try{
       if(rs != null){
        rs.close;
        }
       }catch(SQLException ex){
        System.out.println("关闭rs出错:" + ex);
        }
      }
      
    public closeStmt(Statement stmt){
      try{
       if(stmt != null){
        stmt.close;
        }
       }catch(SQLException ex){
        System.out.println("关闭stmt出错:" + ex);
        }
      }
      
    public closeCon(Connection con){
      try{
       if(con != null){
        con.close;
        }
       }catch(SQLException ex){
        System.out.println("关闭con出错:" + ex);
        }
      }
    当关闭的时候调用方法即可。
       
   
   
   就写到这吧,我写的明白希望大家也能看明白,呵呵~最后祝大家学习愉快,水平提高迅速~~
   
   有什么写的不到的地方,希望提出指正,谢谢各位了。

原创粉丝点击