PreparedStatement简介
PreparedStatement是Statement的子接口,属于预处理操作,与直接使用Statement不同的是,PreparedStatement在操作时,是先在数据表之中准备好了一条SQL语句,但是此SQL语句的具体内容暂时不设置,而是之后再进行设置,以插入数据为例,使用PreparedStatement插入数据时,数据表中的指针首先指向最后一条数据之后,但是里面的内容是不知道的,而是等待用户分别设置。
使用Statement操作的时候,肯定要执行的是一条完整的SQL语句,执行之前是使用Connection直接创建的。
通过Connection接口中的:
prepareStatement
PreparedStatement prepareStatement(String sql)
throws SQLException
通过以上的方法可以得到一个PreparedStatement的一个接口实例。
之后使用一系列的setXXX()方法设置内容,根据位置设置。
如果执行更新语句的话,则会返回更新数据的记录数。
注意:
关于日期的输入问题:在正常情况下都使用java.util.Date表示日期,但是在PreparedStatement中如果要想使用日期则必须使用java.sql.Date类型。
注意:设置日期格式的问题
在PreparedStatement中定义了setDate()方法,此方法可以设置日期内容,但是此方法在使用时,后面的Date类型变量是java.sql.Date,而不是java.util.Date,所以如果要想将一个java.util.Date类型的内容变为java.sql.Date类型的内容应该使用如下的语句形式:
String birthday = “2007-08-27”; //生日
java.util.Date temp = null; //声明一个Date对象
//通过SimpleDateFormat类将一个字符串变为java.util.Date类型。
Temp = new SimpleDateFormat(“YYYY-MM-DD”).parse(birthday);
//通过java.util.Date取出具体的日期数,并将其变为java.sql.Date类型。
java.sql.Date bir = new java.sql.Date(temp.getTime());
例子:使用PreparedStatement执行数据库的插入操作
【PreparedStatementDemo01.java代码如下】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
public class PreparedStatementDemo01{
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "mysqladmin";
public static void main(String args[]) throws Exception{
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
String name = "荷花";
String password = "www.sun.com";
int age = 18;
String sex = "女";
String birthday = "2014-02-16";
java.util.Date temp = null;
temp = new SimpleDateFormat("YYYY-MM-DD").parse(birthday);//将字符串类型的数据变为Date类型的数据。
java.sql.Date bir = new java.sql.Date(temp.getTime());//将java.util.Date类型转换为java.sql.Date类型。
String sql = "INSERT INTO user(name,password,age,sex,birthday) VALUES(?,?,?,?,?)";
Class.forName(DBDRIVER); //加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象
pstmt.setString(1,name);
pstmt.setString(2,password);
pstmt.setInt(3,age);
pstmt.setString(4,sex);
pstmt.setDate(5,bir);
int t = pstmt.executeUpdate();//执行更新
System.out.println(t);
pstmt.close();
conn.close(); //数据库关闭
}
};
编译运行的结果如下:
输出的数据“1”表示已经插入一行。此时user表已经发生改变:
插入数据前:
插入数据后:
可见,数据插入已经成功。
既然可以通过此接口完成更新操作,那么就可以通过此接口完成查询操作。
【PreparedStatementDemo02.java代码如下】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
public class PreparedStatementDemo02{
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "mysqladmin";
public static void main(String args[]) throws Exception{
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
String keyWord = "花"; //设置查询关键字
ResultSet rs = null; //接收查询结果
String sql = "SELECT id,name,password,age,sex,birthday" +
" FROM user WHERE name LIKE ? OR password LIKE ? OR sex LIKE ?";
//双引号和FROM之间如果没有空格的话,则运行的时候会产生错误。
Class.forName(DBDRIVER); //加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象
pstmt.setString(1,"%"+keyWord+"%");
pstmt.setString(2,"%"+keyWord+"%");
pstmt.setString(3,"%"+keyWord+"%");
rs = pstmt.executeQuery(); //执行查询
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.print("编号: " + id + ";");
System.out.print("姓名: " + name + ";");
System.out.print("密码: " + pass + ";");
System.out.print("年龄: " + age + ";");
System.out.print("性别: " + sex + ";");
System.out.println("生日: " + d + ";");
System.out.println("---------------------------");
}
rs.close();
pstmt.close();
conn.close(); //数据库关闭
}
};
编译运行的结果如下:
可见,包含关键字“花”的结果全部列出来了。
如果现在假设查询的是全部记录,不需要设置任何内容的话,只需要创建完PreparedStatement对象后直接查询即可。
【PreparedStatementDemo03.java代码如下】
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
public class PreparedStatementDemo03{
//定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
//定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";
//MySQL数据库的连接用户名
public static final String DBUSER = "root";
//MySQL数据库的连接密码
public static final String DBPASS = "mysqladmin";
public static void main(String args[]) throws Exception{
Connection conn = null; //数据库连接
PreparedStatement pstmt = null; //数据库操作
String keyWord = "花"; //设置查询关键字
ResultSet rs = null; //接收查询结果
String sql = "SELECT id,name,password,age,sex,birthday" + " FROM user ";
//双引号和FROM之间如果没有空格的话,则运行的时候会产生错误。
Class.forName(DBDRIVER); //加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
pstmt = conn.prepareStatement(sql); //实例化preparedStatement对象
rs = pstmt.executeQuery(); //执行查询
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pass = rs.getString(3);
int age = rs.getInt(4);
String sex = rs.getString(5);
java.util.Date d = rs.getDate(6);
System.out.print("编号: " + id + ";");
System.out.print("姓名: " + name + ";");
System.out.print("密码: " + pass + ";");
System.out.print("年龄: " + age + ";");
System.out.print("性别: " + sex + ";");
System.out.println("生日: " + d + ";");
System.out.println("---------------------------");
}
rs.close();
pstmt.close();
conn.close(); //数据库关闭
}
};
编译运行的结果如下:
可见,全部的结果都被查询出来了。
在开发中到底是使用PreparedStatement还是使用Statement接口操作呢?
实际上,在实际的开发应用中是不会有人使用Statement接口的,因为其采用的是拼凑的SQL语句形式,那么这样一来就有可能造成SQL的注入漏洞。举例:最早的国内的大部分站点,大家只要输入“’”,一查询,基本上站点就完蛋。
小结:
1.PreparedStatement的基本工作原理:插入时,先占位,之后再设置内容。
2.开发中建议不要使用Statement接口,而使用PreparedStatement接口。