知识点:
利用Statement接口实现数据表的更新操作与查询;
具体内容:
当取得了数据库连接对象之后,那么实际上就意味着可以进行数据库操作了,而数据库操作可以使用最简单的Statement接口完成。
如果想要取得Statement接口的实例化对象,则需要依靠Connection接口提供的方法完成。
- 取得Statement接口对象:public Statement createStatement() throws SQLException
当取得了Statement接口对象之后可以使用一下两个方法实现数据库操作:
- 数据更新:public int executeUpdate(String sql) throws SQLException,返回更新行数;
- 数据查询:public ResultSet executeQuery(String sql) throws SQLException
范例:编写数据库创建脚本
DROP TABLE member PURGE
DROP SEQUENCE myseq;
CREATE SEQUENCE myseq;
CREATE SEQUENCE myseq;
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20),
birthday DATE DEFAULT SYSDATE,
age NUMBER(3),
note CLOB,
CONSTRAINT pk_mid PRIMARY KEY(mid)
)
以上有序列,mid要通过序列生成,序列操作"nextval"伪列取得下一个增长的数值
数据的更新操作:
数据的更新操作最关键性的问题是每次更新完成之后一定会返回影响的数据行数。
范例:数据增加
INSERTINTO表名称(列,列..) VALUES(值,值....);
package conll;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestDemo {
private static final String DBDEIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:mldn";
private static final String USER="scoot";
private static final String PASSWORD="tiger";
public static void main(String[] args) throws Exception {
//第一步:加载数据库驱动程序,此时不需要实例化,因为由容器自己负责管理
Class.forName(DBDEIVER) ;
//第二步:连接数据库
Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD);
//第三步:进行数据库的数据操作
Statement stmt = conn.createStatement();
//在编写SQL的过程里面,如果太长实践需要增加换行,那么请一定记住前后加上空格
String sql = " INSERT INTO member(mid,name,birthday,age,note) values "
+" (mysel.nextval,'张三',TO_DATE('1998-10-10','yyyy-mm-dd'),17,'是个人')";
int len = stmt.executeUpdate(sql); //执行SQL返回更新的数据行
System.out.println("影响的数据行"+len);
//第四步:关闭数据库
stmt.close(); //这个操作可选并且无用
conn.close();
}
}
范例:数据的修改
语法:UPDATE 表名称 SET 字段=值,.......WHERE 更新条件(S)
package conll;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestDemo {
private static final String DBDEIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:mldn";
private static final String USER="scoot";
private static final String PASSWORD="tiger";
public static void main(String[] args) throws Exception {
//第一步:加载数据库驱动程序,此时不需要实例化,因为由容器自己负责管理
Class.forName(DBDEIVER) ;
//第二步:连接数据库
Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD);
//第三步:进行数据库的数据操作
Statement stmt = conn.createStatement();
//在编写SQL的过程里面,如果太长实践需要增加换行,那么请一定记住前后加上空格
String sql = "UPDTA member SET name='李四',birthday=SYSDATE,age=30 WHERE mid IN(3,5,7,9,11,13,15,17)";
int len = stmt.executeUpdate(sql); //执行SQL返回更新的数据行
System.out.println("影响的数据行"+len);
//第四步:关闭数据库
stmt.close(); //这个操作可选并且无用
conn.close();
}
}
整个更新操作完成后会清楚的感受到,原来只是更换勒一个字符串而已,没有任何任何的本质变化。
数据查询:
每当使用SELECT进行查询的时候实际上会将所有的查询结果返回给用户显示,而显示的基本结构形式就是表的形式,可是如果要进行查询,这些查询的结果应该返回给程序,由用户来进行处理,那么就必须有一种类型可以接收所有的返回结果。在数据库里面虽然有可能有几百张表,但是整个表的组成数据类型都是固定的,所以在ResultSet设计的过程中是按照数据类型的方式来保存返回数据的.
\
在Result接口里面定义了如下的方法:
向下移动指针并判断是否有数据行:public boolean next() throws SQLException;
——移动之后就可以直接提取当前数据行中所有数据列的内容了
取出数据列的内容:getInt()、getDouble()、getString()、getDate();
范例:
package conll;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDemo {
private static final String DBDEIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:mldn";
private static final String USER="scoot";
private static final String PASSWORD="tiger";
public static void main(String[] args) throws Exception {
//第一步:加载数据库驱动程序,此时不需要实例化,因为由容器自己负责管理
Class.forName(DBDEIVER) ;
//第二步:连接数据库
Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD);
//第三步:进行数据库的数据操作
Statement stmt = conn.createStatement();
//在编写SQL的过程里面,如果太长实践需要增加换行,那么请一定记住前后加上空格
String sql = "SELECT mid,name,age,birthday,note,FROM member";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){ //循环取出返回的每一行数据
int mid = rs.getInt("mid");
String name = rs.getString("name");
int age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
String note = rs.getString("note");
System.out.println(mid+","+"name"+","+age+","+birthday+","+"note");
}
//第四步:关闭数据库
rs.close();
stmt.close(); //这个操作可选并且无用
conn.close();
}
}
关于ResultSet的使用有如下几点忠告:
——在使用getXxx()取出列数据的时候,强烈建议按照给定的顺序取;
——每一个列的数据只能按照顺序取一次;
以上代码在取列内容的时候重复编写了列名称,这一点实际上可以忽略,因为在写SQL语句的时候就已经给出了列名称,那么可以 按照序号取出。
package conll;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestDemo {
private static final String DBDEIVER="oracle.jdbc.driver.OracleDriver";
private static final String DBURL="jdbc:oracle:thin:@localhost:1521:mldn";
private static final String USER="scoot";
private static final String PASSWORD="tiger";
public static void main(String[] args) throws Exception {
//第一步:加载数据库驱动程序,此时不需要实例化,因为由容器自己负责管理
Class.forName(DBDEIVER) ;
//第二步:连接数据库
Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD);
//第三步:进行数据库的数据操作
Statement stmt = conn.createStatement();
//在编写SQL的过程里面,如果太长实践需要增加换行,那么请一定记住前后加上空格
String sql = "SELECT mid,name,age,birthday,note,FROM member";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){ //循环取出返回的每一行数据
int mid = rs.getInt("1");
String name = rs.getString("2");
int age = rs.getInt("3");
Date birthday = rs.getDate("4");
String note = rs.getString("5");
System.out.println(mid+","+"name"+","+age+","+birthday+","+"note");
}
//第四步:关闭数据库
rs.close();
stmt.close(); //这个操作可选并且无用
conn.close();
}
}
既然已经可以执行查询了,那么就可以继续添加各种复杂的查询,列如:限定查询、子查询
总结:通过以上代码可以发现statement接口的执行步骤几乎都是固定的,并且最方便的是可以直接执行SQL的字符串操作,但是任何的开发都不可能取使用statement,以后都要去使用PreparedStatement接口。