虽然可以利用Statement操作数据库,但是如果在开发之中,Statement是不可能使用的,以增加数据为例,在本表之中姓名、生日、介绍应该由用户自己输入。
范例:问题引出
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
String name = "Mr'SMITH" ;
String birthday = "2012-12-25" ;
String note = "荒唐的世界末日" ;
Connection conn = null; // 每一个Connection对象都表示一个连接
Statement stmt = null ; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
stmt = conn.createStatement() ; // 创建Statement对象
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = " INSERT INTO member(mid,name,birthday,note) "
+ " VALUES (myseq.nextval,'"+name+"', "
+ " TO_DATE('"+birthday+"','yyyy-mm-dd'),'"+note+"') " ;
System.out.println(sql);
int len = stmt.executeUpdate(sql) ; // 执行SQL
System.out.println("更新行数:" + len);
conn.close() ;
}
}
INSERT INTO member(mid,name,birthday,note) VALUES (myseq.nextval,'Mr'SMITH', TO_DATE('2012-12-25','yyyy-mm-dd'),'荒唐的世界末日')
Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00917: 缺失逗号
此时的程序中由于SQL需要拼凑的原因,那么用户一旦输入了一些敏感的字符,就有可能造成错误,严重的就有可能出现严重的安全漏洞,所以就得出结论:拼凑的SQL不能用。
在实际的开发之中永恒不会有人去使用Statement,而都使用Statement的子接口:PreparedStatement(预处理)。提升操作的性能。那么现在如果要使用PreparedStatement接口,则就必须通过Connection接口中的新方法实例化对象:
· 方法:public PreparedStatement prepareStatement(String sql) throws SQLException ;。
当取得了PreparedStatement接口对象之后,就可以利用新的方法操作:
· 更新操作:public int executeUpdate() throws SQLException;
· 查询操作:public ResultSet executeQuery() throws SQLException。
而最为重要的是,在创建PreparedStatement的时候所需要设置的内容都要通过一个占位符“?”表示,而在执行更新和查询之前,需要使用一系列的setXxx()方法设置“?”的数据。
但是在进行setDate()方法操作的时候需要注意一点:操作的是java.sql.Date,而不是java.util.Date。java.sql.Date是java.util.Date的子类,而在java.util.Date下一共有三个子类,而且这三个子类都是保存在java.sql包之中:Date(保存日期)、Time(保存时间)、TimeStamp(时间戳,日期 + 时间)。
范例:实现数据增加
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Date;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
String name = "Mr'SMITH" ;
Date birthday = new Date() ;
String note = "荒唐的世界末日" ;
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null ; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = " INSERT INTO member(mid,name,birthday,note) "
+ " VALUES (myseq.nextval,?,?,?) " ;
pstmt = conn.prepareStatement(sql) ; // 创建PreparedStatement接口对象
pstmt.setString(1, name);
pstmt.setDate(2, new java.sql.Date(birthday.getTime()));
pstmt.setString(3, note);
int len = pstmt.executeUpdate() ; // 执行SQL
System.out.println("更新行数:" + len);
conn.close() ;
}
}
在开发之中为了保证更新的质量,所有的操作一定使用的是PreparedStatement,以上做的只是一个增加(修改和删除也一样),而重点在于下面的查询操作上。
范例:查询全部数据
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null ; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = " SELECT mid,name,birthday,note FROM member " ;
pstmt = conn.prepareStatement(sql) ;
ResultSet rs = pstmt.executeQuery() ;
while (rs.next()) {
int mid = rs.getInt(1) ;
String name = rs.getString(2) ;
Date birthday = rs.getDate(3) ;
String note = rs.getString(4) ;
System.out.println(mid + "," + name + "," + birthday + "," + note);
}
conn.close() ;
}
}
范例:根据编号查询,查询指定编号的数据,此时只会返回单行多列数据。
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
int mid = 15 ; // 查询数据
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null ; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = " SELECT mid,name,birthday,note "
+ " FROM member WHERE mid=?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setInt(1, mid);
ResultSet rs = pstmt.executeQuery() ;
if (rs.next()) {
mid = rs.getInt(1) ;
String name = rs.getString(2) ;
Date birthday = rs.getDate(3) ;
String note = rs.getString(4) ;
System.out.println(mid + "," + name + "," + birthday + "," + note);
} else {
System.out.println("没有数据返回!");
}
conn.close() ;
}
}
范例:模糊查询
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
String keyWord = "谢" ;
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null ; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = " SELECT mid,name,birthday,note "
+ " FROM member WHERE name LIKE ?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1, "%" + keyWord + "%"); // 在此写%
ResultSet rs = pstmt.executeQuery() ;
while (rs.next()) {
int mid = rs.getInt(1) ;
String name = rs.getString(2) ;
Date birthday = rs.getDate(3) ;
String note = rs.getString(4) ;
System.out.println(mid + "," + name + "," + birthday + "," + note);
}
conn.close() ;
}
}
如果在执行模糊查询的时候不设置任何的关键字,表示查询全部。
范例:分页显示
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
int currentPage = 2;
int lineSize = 5;
String keyWord = "";
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = "SELECT * FROM ("
+ " SELECT mid,name,birthday,note,ROWNUM rn "
+ " FROM member WHERE name LIKE ? AND ROWNUM<=?) temp "
+ " WHERE temp.rn>? ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "%" + keyWord + "%"); // 在此写%
pstmt.setInt(2, currentPage * lineSize);
pstmt.setInt(3, (currentPage - 1) * lineSize);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int mid = rs.getInt(1);
String name = rs.getString(2);
Date birthday = rs.getDate(3);
String note = rs.getString(4);
System.out.println(mid + "," + name + "," + birthday + "," + note);
}
conn.close();
}
}
范例:统计数据行
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
String keyWord = "";
Connection conn = null; // 每一个Connection对象都表示一个连接
PreparedStatement pstmt = null; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
// 如果在编写SQL过程之中出现换行,请一定要保证前后各加一个空格
String sql = "SELECT COUNT(mid) FROM member WHERE name LIKE ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "%" + keyWord + "%"); // 在此写%
ResultSet rs = pstmt.executeQuery();
if (rs.next()) { // 永恒有数据返回
System.out.println(rs.getInt(1));
}
conn.close();
}
}
以上所给出的几个基本的数据库操作,一定要拿下,明天就要用。