[转]Java数据库详解~~~Statement、 ResultSet

Connection物件是代表Java与资料库的连线,接下来我们要执行SQL的话,必须取得 Statement物件,它代替您执行SQL叙述并取得执行之后的结果,您可以使用Connection的createStatement()来建立Statement物件
Connection conn = DriverManager.getConnection(
                           url, user, password);
Statement stmt = conn.createStatement();
 
取得Statement物件之后,我们可以使用executeUpdate()、executeQuery()等方法来执行 SQL,executeUpdate()主要是用来执行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等会改变资料库内容的SQL,例如:
stmt.executeUpdate("INSERT INTO message VALUES('良葛格', " +
           "'caterpillar@mail.com', '留言吧', '2004-5-26'," +
           "'到此一游')");
 
executeQuery()方法则是用于SELECT等查询资料库的SQL,executeUpdate()与 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");
}
 
Statement的execute()可以用来执行SQL,并可以测试所执行的SQL是执行查询或是更新,传回 true的话表示SQL执行将传回ResultSet表示查询结果,此时可以使用getResultSet()取得ResultSet物件,如果 execute()传回false,表示SQL执行会传回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数。如果事先无法得知是进行查询或是更新,就可以使用execute()。

下面的程式是个完整的范例,注意我们在查询结束后,可以使用Statement的close()方法来释放Statement的资料库资源与JDBC资源,而最后不使用连线时也使用Connection的close()来关闭连线: 

 
  • 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 = "caterpillar";
String password = "123456";

Connection conn = null;
Statement stmt = null;

try {
Class.forName(driver);
conn = DriverManager.getConnection(
url, user, password);
stmt = conn.createStatement();

stmt.execute("INSERT INTO message VALUES('良葛格" +
"', 'caterpillar@mail.com', '留言吧', "+
"'2004-5-26', '到此一游')");

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");
}
}
catch(ClassNotFoundException e) {
System.out.println("找不到驱动程式");
e.printStackTrace();
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
if(stmt != null) {
try {
stmt.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
}
}

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

不过无论是否有无执行commit()方法,只要SQL没有错,在关闭Statement或Connection前,都会执行认可动作,对资料库进行变更。
<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&dt=1184999703187&lmt=1181153050&format=160x600_as&output=html&correlator=1184999703171&url=http%3A%2F%2Fwww.caterpillar.onlyfun.net%2FGossipCN%2FJavaGossip-V2%2FStatementResultSet.htm&ad_type=text_image&ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3Djava%2Baccess%25CA%25B5%25C0%25FD%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3DResultSet%26ct%3D0&cc=350&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency">

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&dt=1184999703218&lmt=1181153050&prev_fmts=160x600_as&format=160x600_as&output=html&correlator=1184999703171&url=http%3A%2F%2Fwww.caterpillar.onlyfun.net%2FGossipCN%2FJavaGossip-V2%2FStatementResultSet.htm&ad_type=text_image&ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3Djava%2Baccess%25CA%25B5%25C0%25FD%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3DResultSet%26ct%3D0&cc=350&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency">

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值