一、Statement
(1)Connection 是数据库连接的代表对象,要执行SOL 的话,必须取得java.sql.Statement 操作对象,它是 SQL 描述的代表对象。可以使用Connection的createStatement()建立Statement对象:
Statement stmt =conn.createStatement();
取得Statement对象之后,可以使用executeUpdate() , executeQuery()等方法来执行SQL.executeUpdate()主要用来执行CREATE TABLE、工NSERT、DROP TABLE
ALTER TABLE等会改变数据库内容的SQL。
(2)Statement 的executeQuery()方法用于SELECT 等查询数据库的SQL,executeUpdate()会返回int结果,表示数据变动的笔数,executeQuery()会返回java.sql.ResultSet对象,代表查询结果,查询结果会是一笔一笔的数据。可以使用Resultset的next()移动至下一笔数据,它会返回true 或false表示是否有下一笔数据,接着可以使用get×××()取得数据,如getString()、getInt()、getFloat()、getDouble()等方法,分别取得相对应的字段类型数据。getx××()方法都提供有依域名取得数据,或是依字段顺序取得数据的方法。
(3)Statement的execute()可以用来执行SQL,并可以测试SQL 是执行查询或更新,返回true表示 SQL 执行将返回 ResultSet 作为查询结果,此时可以使用getResultSet()取得ResultSet对象。如果execute()返回false,表示 SQL执行会返回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数。如果事先无法得知SQL是进行查询或更新,就可以使用execute()。视需求而定,Statement或ResultSet在不使用时,可以使用close()将之关闭,以释放相关资源。Statement关闭时,所关联的ResultSet也会自动关闭。
二、PreparedStatement、CallableStatement
如果有些操作只是SQL语句当中某些参数会有所不同,其余的SQL子句皆相同,则可以使用java.sql.PreparedStatement。可以使用Connection的preparedstatement()方法建立好预先编译(Precompile)的SQL 语句,当中参数会变动的部分,先指定"?"这个占位字符。例如:
PreparedStatement stmt = conn.preparestatement (
"INSERT INTO t_message VALUES(?,?,?,?)");
等到需要真正指定参数执行时,再使用相对应的setInt()、setString()等方法,指定"?"处真正应该有的参数。例如:
stmt.setInt (1,2); stmt.setString(2,"momor"); stmt.setString(3,"momo@mail.com"); stmt.setString(4,"message2..."); stmt.executeUpdate(); stmt.clearParameters();
要让 SQL执行生效,要执行executeUpdate()或executeQuery(方法(如果是查询的话)。
在这次的SQL执行完毕后,可以调用clearParameters()清除设置的参数,之后就能再次使用这个 PreparedStatement实例,所以使用PreparedStatement,可以让你先准备好一段SQL,并重复使用这段SQL语句。
(2)如果撰写数据库的预存程序(Stored Procedure),并想使用JDBC来调用,则可使用java.sql.CallableStatement。调用的基本语法如下:
{?= call <程序名称>[<自变量1>,<自变量2>,...]}
{call <程序名称>[<自变量1>,<自变量2>,...]}
CallableStatement的 API使用,基本上与PreparedStatement差别不大,除了必须调用prepareCall()建立CallableStatement 异常外,一样是使用 setxxx()设定参数,如果是查询操作,使executeQuery(),如果是更新操作,使用executeUpdate()。另外,可以使用registerOutParameter()注册输出参数等。
在使用PreparedStatement或CallableStatement时,必须注意SQL类型与 Java数据类型的对应,因为两者本身并不是一对一对应,java.sql.Types定义了一些常数代表SQL类型。下表所示为JDBC规范建议的SQL类型与Java类型的对应。
Java类型 | SQL类型 |
boolean | BIT |
byte | TINYINT |
short | SMALLINT |
int | INTEGER |
long | BIGINT |
float | FLOAT |
double | DOUBLE |
byte[] | BINARY、VARBINARY、LONGBINARY |
java.lang.String | CHAR、VARCHAR、LONGVARCHAR |
java.math.BigDecimal | NUMERIC、DECIMAL |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
其中要注意的是,日期时间在 JDBC中,并不是使用java.util.Date,这个对象可代表的日期时间格式是“年、月、日、时、分、秒、毫秒”。在 JDBC 中要表示日期,是使用java.sql.Date,其日期格式是“年、月、日”,要表示时间的话则是使用java.sql.Time,其时间格式为“时、分、秒”,如果要表示“时、分、秒、微秒”的格式,则是使用java.sql.Timestamp。