目录
Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。今天我们就来学习一下Prestatement和Statement的区别以及它们用法。
(1)PreparedStatement继承自Statement,都是接口;
(2)PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象;
(3)作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。常用的方法有:execute、executeUpdate和executeQuery,已被更改,所以它们使用的时候不需要再传入参数。
假设在数据库test下,新建了一个stu表,分别有number(学号)、name(姓名)、grade(成绩)三个字段。现在我们试着用两种方法来实现数据的增删查改,可以对比一下:
student.jsp:
<form action="accept.jsp" method="post">
<label for="number">学号:</label>
<input id="number" type="text" name="number">
<label for="name">姓名::</label>
<input id="name" type="text" name="name">
<label for="grade">成绩:</label>
<input id="grade" type="text" name="grade">
<button type="submit" id="btn">提交</button>
</form>
Statement
accept.jsp:
<%
/*定义一些连接数据库的变量*/
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password="";
/*获得表单数据*/
String number=new String(request.getParameter("number")).trim();
String name=new String(request.getParameter("name")).trim();
String grade=new String(request.getParameter("grade")).trim();
try{
/*连接数据库*/
Class.forName("com.mysql.jdbc.Driver");
out.println("com.mysql.jdbc.Driver类实例化成功!");
Connection con=DriverManager.getConnection(url,user,password);
out.println("创建连接对象成功!");
/*写插入语句,更新数据*/
String sqlinsert="insert into stu(number,name,grade) values(\'"+number+"\',\'"+name+"\',\'" + grade + "\')";
Statement st=con.createStatement();
out.println("创建statement成功!");
int i=st.executeUpdate( sqlinsert );
/*写查询语句,获取数据表里的数据*/
String sqlQuery = "select * from stu";
ResultSet rs = st.executeQuery( sqlQuery );
out.println( "操作数据表成功!" );
/*显示操作*/
out.println("<table border=1 width=800>");
out.println("<tr><td>学号</td><td>姓名</td><td>成绩</td></tr>");
while(rs.next()){
String col1=rs.getString("number");
String col2=rs.getString("name");
String col3=rs.getString("grade");
out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");
}
out.println("</table>");
rs.close();
st.close();
con.close();
}catch (Exception err){
err.printStackTrace();
}
%>
Preparedstatement
accept.jsp:
<%
/*定义一些连接数据库的变量*/
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password="";
/*获得表单数据*/
String number=new String(request.getParameter("number")).trim();
String name=new String(request.getParameter("name")).trim();
String grade=new String(request.getParameter("grade")).trim();
try{
/*连接数据库*/
Class.forName("com.mysql.jdbc.Driver");
out.println("com.mysql.jdbc.Driver类实例化成功!");
Connection con=DriverManager.getConnection(url,user,password);
out.println("创建连接对象成功!");
/*写插入语句,利用占位符*/
String sql="insert into stu values(?,?,?)";
/*预编译*/
PreparedStatement ps=con.prepareStatement(sql);
ps.setString(1,number);
ps.setString(2,name);
ps.setString(3,grade);
/*execute不用传参*/
ps.execute();
/*写插入语句,利用占位符*/
String query="select * from stu";
ResultSet rs=ps.executeQuery(query);
out.println( "操作数据表成功!" );
out.println( "=========================!" );
out.println("<table border=1 width=800>");
out.println("<tr><td>学号</td><td>姓名</td><td>成绩</td></tr>");
while (rs.next()){
String col1=rs.getString("number");
String col2=rs.getString("name");
String col3=rs.getString("grade");
/* 打印所有的数据*/
out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");
}
out.println("</table>");
rs.close();
ps.close();
con.close();
}catch (Exception err){
err.printStackTrace();
}
%>
运行效果如下:
stu表原已有一些数据。