JDBC介绍(三)

Statement ResultSet

Connection对象是代表Java与数据库的联机,接下来我们要执行SQL的话,必须取得Statement对象,它代替我们执行SQL叙述并取得执行之后的结果,我们可以使用ConnectioncreateStatement()来建立Statement对象:

 
    
    
 Connection conn = DriverManager.getConnection(
    
    
                           url, user, password); 
    
    
 Statement stmt = conn.createStatement(); 
    
    
 
    
    

取得Statement对象之后,我们可以使用executeUpdate()executeQuery()等方法来执行SQLexecuteUpdate()主要是用来执行CREATE TABLEINSERTDROP TABLEALTER TABLE等会改变数据库内容的SQL,例如:

 
    
    
 stmt.executeUpdate("INSERT INTO message VALUES('Michael CHEN', " +
    
    
           "'caterpillar@mail.com', '留言吧', '2005-2-4'," + 
    
    
           "'欢迎')");
    
    
  
    
    

executeQuery()方法则是用于SELECT等查询数据库的SQLexecuteUpdate()executeQuery()都会传回ResultSet对象,代表变更或查询的结果,查询的结果会是一笔一笔的资料,我们使用next()来移动至下一笔资料,它会传回 true false表示是否有下一笔资料,接着我们可以使用getXXX()来取得资料,例如getString()getFloat()getDouble()等方法,分别取得相对应的字段型态资料,getXXX()方法都提供有依字段名称取得资料,或是依字段顺序取得资料的方法,一个例子如下,我们指定字段名称来取得资料:

 
    
    
 ResultSet result = 
    
    
              stmt.executeQuery("SELECT * FROM message"); 
    
    
 while(result.next()) { 
    
    
    System.out.print(result.getString("name") + "/t"); 
    
    
    System.out.print(result.getString("email") + "/t"); 
    
    
    System.out.print(result.getString("subject") + "/t"); 
    
    
    System.out.print(result.getString("time") + "/t"); 
    
    
    System.out.println(result.getString("memo") + "/t"); 
    
    
 } 
    
    
 
    
    

使用查询到的结果之字段顺序来显示结果的方式如下:

 
    
    
 ResultSet result = 
    
    
              stmt.executeQuery("SELECT * FROM message"); 
    
    
 while(result.next()) { 
    
    
    System.out.print(result.getString(1) + "/t"); 
    
    
    System.out.print(result.getString(2) + "/t"); 
    
    
    System.out.print(result.getString(3) + "/t"); 
    
    
    System.out.print(result.getString(4) + "/t"); 
    
    
    System.out.println(result.getString(5) + "/t"); 
    
    
 } 
    
    
 
    
    

Statementexecute()也可以用来执行SQL,并可以用来测试所执行的SQL是执行更新或是查询,传回true的话表示SQL执行将传回多笔资料,也就是执行查询动作,如果是false,表示SQL执行结果将传回受影响的行数,也就是表示进行更新动作,如果事先无法得知是进行查询或是更新,就可以使用execute()

下面的程序是个完整的范例,注意我们在查询结束后,可以使用Statementclose()方法来释放Statement的数据库资源与JDBC资源,而最后不使用联机时也使用Connectionclose()来关闭联机:

  • DBTest.java
 
    
    
 package onlyfun.caterpillar;
    
    
 
    
    
 import java.sql.*;
    
    
 
    
    
 public class DBTest { 
    
    
    public static void main(String[] args) { 
    
    
        String driver = "com.mysql.jdbc.Driver"; 
    
    
        String url = "jdbc:mysql://localhost:3306/GUESTBOOK?" + 
    
    
                   "useUnicode=true&characterEncoding=Big5"; 
    
    
        String user = "myname"; 
    
    
        String password = "123456"; 
    
    
        try { 
    
    
            Class.forName(driver); 
    
    
            Connection conn = DriverManager.getConnection(
    
    
                                        url, user, password);
    
    
 
    
    
            Statement stmt = conn.createStatement(); 
    
    
            stmt.execute("INSERT INTO message VALUES('Michael Chen" + 
    
    
               "', 'blog.csdn.net/ybugchen', '留言吧', "+ 
    
    
               "'2005-2-4', '欢迎')"); 
    
    
 
    
    
            ResultSet result = stmt.executeQuery(
    
    
                                  "SELECT * FROM message"); 
    
    
            while(result.next()) { 
    
    
                System.out.print(result.getString(1) + "/t"); 
    
    
                System.out.print(result.getString(2) + "/t"); 
    
    
                System.out.print(result.getString(3) + "/t"); 
    
    
                System.out.print(result.getString(4) + "/t"); 
    
    
                System.out.println(result.getString(5) + "/t"); 
    
    
            }
    
    
 
    
    
            stmt.close(); 
    
    
            conn.close(); 
    
    
        } 
    
    
        catch(ClassNotFoundException e) { 
    
    
            System.out.println("找不到驱动程序"); 
    
    
            e.printStackTrace(); 
    
    
        } 
    
    
        catch(SQLException e) { 
    
    
            e.printStackTrace(); 
    
    
        } 
    
    
    } 
    
    
 }
    
    
 
    
    

最后注意到的是,Connection对象预设为自动「认可」(commit),也就是Statement执行SQL叙述完后,马上对数据库进行操作变更,如果想要对Statement要执行的SQL进行除错,可以使用setAutoCommit(false)来将自动认可取消,在执行完SQL之后,再呼叫Connectioncommit()方法认可变更,使用ConnectiongetAutoCommit()可以测试是否设定为自动认可。

不过无论是否有无执行commit()方法,只要SQL没有错,在关闭StatementConnection前,都会执行认可动作,对数据库进行变更。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值