当获取了java.sql.Connection接口对象之后,那么其核心目的一定不是只为了连接,而是为了进行数据库的操作,而进行数据库的开发操作应该使用标准SQL语句来完成,所以需要有一个SQL的执行器,而执行器就可以利用Statement接口完成。
Statement接口简介
java.sql.Statement是JDBC之中提供的数据库的操作接口,利用其可以实现数据的更新与查询的处理操作,该接口定义如下:
public interface Statement extends Wrapper,AutoCloseable
该接口是AutoCloseable子接口,所以可以得出结论:每一次进行数据库操作完成之后都应该关闭Statement操作,即:一条SQL的执行到一定是一个Statement接口对象。如果要想获取Statement接口对象,那么必须依靠Connection接口提供的方法完成。
- 获取Statement接口对象:
public Statement createStatement() throws SQLException
;
|- 此时抛出的SQLException是JDBC数据库开发之中的最大异常;
当获取了Statement接口对象之后,就可以使用SQL进行处理了,而这里面需要两个方法支持:
- 数据更新处理(INSERT、UPDATE、DELETE):
public int executeUpdate(String sql) throws SQLException
- 数据查询处理(SELECT、统计查询、复杂查询):
public ResultSet executeQuery(String sql) throws SQLException
.
这两个数据库的操作里面都需要接收SQL的字符串,也就是说Statement接口可以直接使用SQL语句实现开发。
【定义】数据库脚本
DROP TABLE news PUGRE ;
DROP SEQUENCE news_seq ;
CREATE SEQUENCE news_seq;
CREATE TABLE news(
nid NUMBER,
title VARCHAR2(30),
read NUMBER,
price NUMBER,
content CLOB,
pubdate DATE,
CONSTRAINT pk_nid PRIMARY KEY(nid)
) ;
数据更新操作
在SQL语句之中数据的更新操作一共分为三种:增加 INSERT、修改 UPDATE、删除 DELETE。Statement接口的最大特点是可以直接执行一个标准的SQL语句。
【范例】实现数据的增加处理。
- 增加SQL语法:INSERTINTO 表名称(字段,字段,…)VALUES(值,值,…);
INSERT INTO news(nid,title,read,price,content,pubdate) VALUES (news_seq.nextval,'MLDN-News',10,9.9,'希望你能好好的做好每一天的自己。',TO_DATE('1994-05-25','yyyy-mm-dd'));
对于SQL语句而言,由于一般比较长,所以一定要考虑换行编写,一旦换行了,强烈建议在每个字符串的前后多追加一个空格(避免错误带来的麻烦。)
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;
public class JDBCDemo {
private static final String DATABASE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String DATABASE_USER = "system";
private static final String DATABASE_PASSWORD = "Yww19930813";
public static void main(String[] args) throws Exception {
Connection conn = null;//每一个COnnection接口对象秒速的就说一个用户连接
String sql = " INSERT INTO news(nid,title,read,price,content,pubdate) VALUES "
+ " (news_seq.nextval,'MLDN-News',10,9.9,'希望你能好好的做好每一天的自己。', "
+ " TO_DATE('1994-05-25','yyyy-mm-dd'))";
Class.forName(DATABASE_DRIVER);//向容器之中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
System.out.println(conn);
Statement stmt = conn.createStatement();//创建数据库操作对象
int count = stmt.executeUpdate(sql);//返回影响行数
System.out.println("更新操作影响的数据行数:" + count);
conn.close();//数据库资源有限一定要关闭
}
}
【范例】:更新操作,在更新操作的时候一般都是做条件性的更新;
- 更新的SQL语法:IPDATE 表名称 SET 字段=值,… WHERE 更新条件;
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;
public class JDBCDemo {
private static final String DATABASE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String DATABASE_USER = "system";
private static final String DATABASE_PASSWORD = "Yww19930813";
public static void main(String[] args) throws Exception {
Connection conn = null;//每一个COnnection接口对象秒速的就说一个用户连接
String sql = "UPDATE news SET content='尝试一下更新操作',read=999,price=100 WHERE nid=5";
Class.forName(DATABASE_DRIVER);//向容器之中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
System.out.println(conn);
Statement stmt = conn.createStatement();//创建数据库操作对象
int count = stmt.executeUpdate(sql);//返回影响行数
System.out.println("更新操作影响的数据行数:" + count);
conn.close();//数据库资源有限一定要关闭
}
}
查询执行结果
【范例】数据删除
- 删除语法:DELETE FROM 表名称 WHERE 删除条件(s);
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;
public class JDBCDemo {
private static final String DATABASE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String DATABASE_USER = "system";
private static final String DATABASE_PASSWORD = "Yww19930813";
public static void main(String[] args) throws Exception {
Connection conn = null;//每一个COnnection接口对象秒速的就说一个用户连接
String sql = "DELETE FROM news WHERE nid IN(1,2,3,4)";
Class.forName(DATABASE_DRIVER);//向容器之中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
System.out.println(conn);
Statement stmt = conn.createStatement();//创建数据库操作对象
int count = stmt.executeUpdate(sql);//返回影响行数
System.out.println("更新操作影响的数据行数:" + count);
conn.close();//数据库资源有限一定要关闭
}
}
数据修改里面只需要考虑到不同的SQL语句即可,这也是Statement接口的最大特点:直接执行SQL语句。
数据查询操作
数据更新主要是接收器影响的数据行数,但是数据查询就比较麻烦,因为查询一定要将结果返回给程序,由程序来进行结果的处理,所以在java里面通过ResultSet接口来描述查询结果。
【范例】实现数据查询处理
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
import oracle.jdbc.driver.OracleDriver;
public class JDBCDemo {
private static final String DATABASE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DATABASE_URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String DATABASE_USER = "system";
private static final String DATABASE_PASSWORD = "Yww19930813";
public static void main(String[] args) throws Exception {
//在程序开发之中SELECT字句后面必须跟上具体的字段名称,写“*”的都叫垃圾代码~~不能维护
Connection conn = null;//每一个Connection接口对象秒速的就说一个用户连接
String sql = "SELECT nid,title,read,price,content,pubdate FROM news";
Class.forName(DATABASE_DRIVER);//向容器之中加载数据库驱动程序
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
System.out.println(conn);
Statement stmt = conn.createStatement();//创建数据库操作对象
ResultSet rs = stmt.executeQuery(sql);//查询语句
while(rs.next()){//现在如果发现还有数据未输出
int nid = rs.getInt(1);
String title = rs.getNString(2);
int read = rs.getInt(3);
double price = rs.getDouble(4);
String content = rs.getString(5);
Date pudate = rs.getDate(6);
System.out.println(nid + "、" + title+"、"+ read+"、" +price +"、" +content + "、" + pudate);
}
conn.close();//数据库资源有限一定要关闭
}
}
oracle.jdbc.driver.T4CConnection@72d818d1
5、MLDN-News、999、100.0、尝试一下更新操作、1994-05-25
6、MLDN-News、10、9.9、希望你能好好的做好每一天的自己。、1994-05-25
需要注意的是,ReslutSet对象是保存在内存之中的,如果说你查询数据的返回结果过大,那么程序也将出现问题。
参考:https://edu.aliyun.com/lesson_1012_9105#_9105