本章目标
掌握PreparedStatement接口的工作原理
可以使用PreparedStatement进行数据库的更新及查询操作
PreparedStatement简介
PreparedStatement是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表之中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置,以插入数据为例,使用PreparedStatement插入数据时,数据表中的指针首先指向最后一条数据之后,但是里面的内容是不知道的,而是等待用户分别设置。
PreparedStatement的基本操作方法
执行插入操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class PreparedStatementDemo01 {
public static void main(String[] args) throws Exception {
Connection conn=null; //数据库连接
PreparedStatement pstmt = null;//数据库操作
String name = "ichaoyi";//姓名
int age = 35;//年龄
String sex ="男";//性别
String birthday = "2014-07-02";//生日
String sql =" insert into consumer (ID, NAME, AGE, SEX, BIRTHDAY)" +
"values (id_seq.nextval, ?, ?, ?, to_date(?, 'yyyy-mm-dd'))";//编写预处理 SQL
Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动程序
//连接数据库
conn=DriverManager.getConnection("jdbc:oracle:thin:gome/gome@localhost:1521:oracle11");
pstmt = conn.prepareStatement(sql);//实例化 PreparedStatement
pstmt.setString(1, name);//设置第一个 “?”的内容
pstmt.setInt(2, age);//设置第二个 “?”的内容
pstmt.setString(3, sex);//设置第三个 “?”的内容
pstmt.setString(4, birthday);//设置第四个 “?”的内容
pstmt.executeUpdate();//执行数据库更新操作,不需要 SQL
pstmt.close();//操作关闭
conn.close(); //数据库关闭
}
/* 结果:使用 PreparedStatement 完成数据插入操作
* */
}
/*备注:
* 创建序列号
* create sequence id_seq -- 尽量使用统一前缀命名,方便管理 建议使用table名+_seq 例如:gome_user_seq
* increment by 1 -- 自增步长 这里设置为1
* start with 10 -- 计数起点 这里设置为1
* nomaxvalue -- 不设置最大值 可选项 maxvalue|minvalue
* nocycle -- 一直累加,不循环
* cache 10;
*
* 插入数据
* insert into consumer (ID, NAME, AGE, SEX, BIRTHDAY)
* values (id_seq.nextval, 'chaoyi', 40, '男', to_date('1991-10-16', 'yyyy-mm-dd'));
* */
模糊查询
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class PreparedStatementDemo02 {
public static void main(String[] args) throws Exception {
Connection conn=null; //数据库连接
PreparedStatement pstmt = null;//数据库操作
String keyWord = "c";//设置查询关键字
ResultSet rs = null;//保存查询结果
String sql = "select id, name, age, sex, birthday from consumer where name like ? or sex like ?";
Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动程序
//连接数据库
conn=DriverManager.getConnection("jdbc:oracle:thin:gome/gome@localhost:1521:oracle11");
pstmt = conn.prepareStatement(sql);//实例化对象
pstmt.setString(1, "%"+keyWord+"%");//设置第一个 “?”的内容,要使用模糊查询
pstmt.setString(2, "%"+keyWord+"%");//设置第二个 “?”的内容,要使用模糊查询
rs = pstmt.executeQuery();//实例化 ResultSet 对象
while(rs.next()){//指针向下移动
int id = rs.getInt(1);//取得 id 内容
String name = rs.getString(2);//取得 name 内容
int age = rs.getInt(3);//取得 age 内容
String sex = rs.getString(4);//取得 sex 内容
java.util.Date d = rs.getDate(5);//取得 生日 内容
System.out.print("编号:"+id+"; ");//输出编号
System.out.print("姓名:"+name+"; ");//输出姓名
System.out.print("年龄:"+age+"; ");//输出年龄
System.out.print("性别:"+sex+"; ");//输出性别
System.out.print("生日:"+d);//输出生日
System.out.println("\n-----------------------------");//换行
}
rs.close();//关闭结果集
pstmt.close();//操作关闭
conn.close(); //数据库关闭
}
/* 结果:模糊查询
* 编号:6; 姓名:chaoyi; 年龄:30; 性别:男; 生日:2009-10-16
* -----------------------------
* 编号:8; 姓名:chaoyi; 年龄:30; 性别:男; 生日:1992-10-10
* -----------------------------
* 编号:7; 姓名:ichaoyi; 年龄:35; 性别:男; 生日:2014-07-02
* -----------------------------
* 编号:16; 姓名:chaoyi; 年龄:30; 性别:c; 生日:2014-07-03
* -----------------------------
* 编号:17; 姓名:yike; 年龄:30; 性别:c; 生日:2014-07-03
-----------------------------
* */
}
/*备注:模糊查询语句
* select id, name, age, sex, birthday from consumer where name like '%c%' or sex like '%c%'
* */