发布者:admin 发布时间:2010-7-27 所属栏目:软件工程
摘要:
1 检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,JDBC 3.0 API 现在将这项任务变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。可以是 Statement.RETURN_GENERATED_KEYS,也可以是 Statement.NO_GENERATED_KEYS。在执行这条语句后,所产生的关键字的值就会通过从 Statement 的实例方法 getGeneratedKeys() 来检索 ResultSet 而获得。ResultSet 包含了每个所产生的关键字的列。
注意:需要SQLServer2005驱动配合使用
import java.sql.*;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
Connection conn = DriverManager.getConnection(url, "sa", "");
Statement sta = conn.createStatement();
String sql = "insert into users values('mustang','crazy')";
//执行insert语句,并指定第二个参数为指示返回自增列的常量
sta.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
//获取返回自增列的结果集
ResultSet rs = sta.getGeneratedKeys();
if(rs.next())
System.out.println(rs.getInt(1));
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 执行批处理
批处理是将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。返回数组的 int 元素的排序对应于批中的命令,批中的命令根据被添加到批中的顺序排序。方法 executeBatch 返回的数组中的元素可能为以下元素之一:
1大于或等于零的数 - 指示成功处理了命令,是给出执行命令所影响数据库中行数的更新计数
2 SUCCESS_NO_INFO 的值 - 指示成功执行了命令,但受影响的行数是未知的
如果批量更新中的命令之一无法正确执行,则此方法抛出 BatchUpdateException,并且 JDBC 驱动程序可能继续处理批处理中的剩余命令,也可能不执行。无论如何,驱动程序的行为必须与特定的 DBMS 一致,要么始终继续处理命令,要么永远不继续处理命令。如果驱动程序在某一次失败后继续进行处理,则 BatchUpdateException.getUpdateCounts 方法返回的数组将包含的元素与批中存在的命令一样多,并且其中至少有一个元素将为:
3 EXECUTE_FAILED 的值 - 指示未能成功执行命令,仅当命令失败后驱动程序继续处理命令时出现
import java.sql.*;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
Connection conn = DriverManager.getConnection(url, "sa", "");
Statement sta = conn.createStatement();
String sql = "insert into users values('mustang','crazy')";
//添加一个或者多个批处理
sta.addBatch(sql);
sql = "insert into users values('san','zhang')";
sta.addBatch(sql);
//执行批处理,并返回每条批处理语句的更新计数所组成的数组
int[] returncount = sta.executeBatch();
} catch (Exception e) {
}
}
}
3 调用存储过程
import java.sql.*;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs",
"sa", "");
//调用存储过程my_proc
CallableStatement cs = conn.prepareCall("{call my_proc(?,?)}");
//首先要注册所有的输出参数,第一个参数为参数索引,第二个是参数类型
cs.registerOutParameter(2, Types.CHAR);
//其次要设定所有的输入参数,第一个参数为参数索引,第二个是值
cs.setString(1, "mustang");
cs.execute();
System.out.println(cs.getString(2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4 限制ResultSet
初始化Statement时传不同的参数,可以对ResultSet进行限制。con.createStatement的时候,有三种方法签名:
1、createStatement();
2、createStatement(int resultSetType, int resultSetConcurrency)
3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
其中resultSetType可选值是:
1、ResultSet.TYPE_FORWARD_ONLY 在ResultSet中只能先前移动游标,
2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标,
注意:可能需要SQLServer2005驱动配合使用
3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标,同时ResultSet的值有所改变的时候,他可以得到改变后的最新的值
注意:可能需要SQLServer2005驱动配合使用
其中resultSetConcurrency可选值是:
1、ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,不可以修改
2、ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,然后更新会数据库
其中resultSetHoldability可选值是:
1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时,不关闭ResultSet的游标
2、ResultSet.CLOSE_CURSORS_AT_COMMIT 表示修改提交时,关闭ResultSet的游标
对于查询操作第一种初始化方法createStatement(),相当于第二种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY),第三种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)
import java.sql.*;
public class Test {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs",
"sa", "");
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
rs.next();
rs.updateString("l_name", "mao");
rs.updateRow();
rs.afterLast();//将游标移动到此 ResultSet 对象的末尾,正好位于最后一行之后
while(rs.previous()){ /**....*/ }
rs.beforeFirst();//将游标移动到此 ResultSet 对象的开头,正好位于第一行之前
while(rs.next()){ /**....*/ }
rs.last();//将游标移动到此 ResultSet 对象的最后一行
rs.first();//将游标移动到此 ResultSet 对象的第一行
rs.absolute(4); //游标移动到第5条
rs.absolute(-1); //游标移动到最后一条
rs.relative(-4); //游标向上移动5条
rs.relative(2); //游标向下移动2条
rs.deleteRow(); //删除当前行
rs.last(); //游标移动到最后
rs.updateString("f_name", "kingkong"); //设置更新的字段值
rs.cancelRowUpdates(); //取消刚才输入的更新
rs.getRow(); //得到当前行号
rs.moveToInsertRow(); //游标移动到要新增的那条记录上
rs.updateString("f_name","xiaoming" );
rs.updateString(3, "wang");
rs.insertRow(); //插入新记录;
} catch (Exception e) {
e.printStackTrace();
}
}
}
5 往数据库中插入日期和时间
PreparedStatement ps = conn.prepareStatement("insert into userinfo values('mustang',28,?)");
long time = new java.util.Date().getTime();
//使用java.sql.Date可以存入日期
java.sql.Date date = new java.sql.Date(time);
ps.setDate(1, date);
//使用java.sql.Time可以存入时间
java.sql.Time date = new java.sql.Time(time);
ps.setTime(1, date);
//使用java.sql.Timestamp可以存入日期和时间
java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
ps.setTimestamp(1, timestamp);
ps.executeUpdate();
资源列表:
数据库脚本:
Use master
Go
if exists (select * from sysobjects where id = users)
drop table users
GO
CREATE TABLE users](
uid int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
f_name varchar](50) NOT NULL ,
l_name varchar(50) NOT NULL
)
GO
自定义存储过程my_proc:
CREATE PROCEDURE my_proc
@f_name varchar(50),
@l_name varchar(50) output
as
select @l_name = l_name from users where f_name = @f_name;
GO
阅读了本文章的还阅读了以下文章:
评价等级:0 用户对这篇文章进行评级
阅读次数:这篇文章已被阅读 271 次
标签: 北大青鸟名师
您如何评价这篇新闻?