JSP中的PreparedStatement对象操作数据库的使用教程
PreparedStatement接口继承Statement,并与之在两方面有所不同:
PreparedStatement实例包含已编译的SQL语句。这就是使语句“准备好”。包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX方法来提供。
由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。
作为Statement的子类,PreparedStatement继承了Statement的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,三种方法execute、executeQuery和executeUpdate已被更改以使之不再需要参数。这些方法的Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。
1、创建PreparedStatement对象
以下的代码段(其中con是Connection对象)创建包含带两个IN参数占位符的SQL语句的PreparedStatement对象:
PreparedStatementpstmt=con.prepareStatement("UPDATEtable4SETm=?WHEREx=?");
pstmt对象包含语句"UPDATEtable4SETm=?WHEREx=?",它已发送给DBMS,并为执行作好了准备。
2、传递IN参数
在执行PreparedStatement对象之前,必须设置每个?参数的值。这可通过调用setXXX方法来完成,其中XXX是与该参数相应的类型。例如,如果参数具有Java类型long,则使用的方法就是setLong。setXXX方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为123456789,第二个参数设为100000000:
pstmt.setLong(1,123456789); pstmt.setLong(2,100000000);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。
如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个PreparedStatement可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement对象代替Statement对象来提高性能是没有意义的。
利用pstmt(前面创建的PreparedStatement对象),以下代码例示了如何设置两个参数占位符的值并执行pstmt10次。如上所述,为做到这一点,数据库不能关闭pstmt。在该示例中,第一个参数被设置为"Hi"并保持为常数。在for循环中,每次都将第二个参数设置为不同的值:从0开始,到9结束。
pstmt.setString(1,"Hi"); for(inti=0;i<10;i++){ pstmt.setInt(2,i); introwCount=pstmt.executeUpdate(); }
3、IN参数中数据类型的一致性
setXXX方法中的XXX是Java类型。它是一种隐含的JDBC类型(一般SQL类型),因为驱动程序将把Java类型映射为相应的JDBC类型(遵循该JDBCGuide中§8.6.2“映射Java和JDBC类型”表中所指定的映射),并将该JDBC类型发送给数据库。例如,以下代码段将PreparedStatement对象pstmt的第二个参数设置为44,Java类型为short:
pstmt.setShort(2,44);
驱动程序将44作为JDBCSMALLINT发送给数据库,它是Javashort类型的标准映射。
程序员的责任是确保将每个IN参数的Java类型映射为与数据库所需的JDBC数据类型兼容的JDBC类型。不妨考虑数据库需要JDBCSMALLINT的情况。如果使用方法setByte,则驱动程序将JDBCTINYINT发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常TINYINT可用于SMALLINT适用的任何地方
预处理语句对象PreparedStatement,使用PreparedStatement进行添加数据,更新数据,删除数据和查询数据
实例:
1.添加数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%> <%@pageimport="java.sql.*"%> <!DOCTYPEhtml> <html> <head> <title>获得第二条记录开始的三条记录</title> </head> <body> <% Stringurl="jdbc:mysql://localhost:3306/javaweb";//连接数据库的url地址 Stringuser="root";//登录数据库的用户名 Stringpassword="zhangda890126;;";//登录数据库的用户名的密码 Connectionconn=null;//链接对象 PreparedStatementpstmt=null;//语句对象 //ResultSetrs=null;//结果集对象 try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动程序 conn=DriverManager.getConnection(url,user,password);//链接数据库 }catch(ClassNotFoundExceptione){ out.println("找不到驱动类");//抛出异常时,提示信息 }catch(SQLExceptione){ out.println("链接MySQL数据库失败");//处理SQLException异常 } try{ Stringadduser="INSERTINTOuser(userid,username,password)VALUES(null,?,?)";//添加一条用户信息 pstmt=conn.<spanstyle="color:#e53333;"><b>prepareStatement</b></span>(adduser);//创建预处理语句对象PreparedStatement //设置参数 pstmt.setString(1,"YAO"); pstmt.setString(2,"yao"); //执行语句 pstmt.executeUpdate(); }catch(SQLExceptione){ out.println("添加用户信息失败"); } try{ if(pstmt!=null){ pstmt.close(); conn=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exceptione){ out.println("数据库关闭失败"); } %> </body> </html>
提示一下一定不要用错大小写,红色标记就是因为我前面的字母大写,花费了很长时间
2.更新数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%> <%@pageimport="java.sql.*"%> <!DOCTYPEhtml> <html> <head> <title>获得第二条记录开始的三条记录</title> </head> <body> <% Stringurl="jdbc:mysql://localhost:3306/javaweb";//连接数据库的url地址 Stringuser="root";//登录数据库的用户名 Stringpassword="zhangda890126;;";//登录数据库的用户名的密码 Connectionconn=null;//链接对象 PreparedStatementpstmt=null;//语句对象 //ResultSetrs=null;//结果集对象 try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动程序 conn=DriverManager.getConnection(url,user,password);//链接数据库 }catch(ClassNotFoundExceptione){ out.println("找不到驱动类");//抛出异常时,提示信息 }catch(SQLExceptione){ out.println("链接MySQL数据库失败");//处理SQLException异常 } try{ Stringupdateuser="UPDATEuserSETpassword=?WHEREuserid=?";//添加一条用户信息 pstmt=conn.prepareStatement(updateuser);//创建预处理语句对象PreparedStatement //设置参数 pstmt.setString(1,"helloworld"); pstmt.setInt(2,1); //执行语句 pstmt.executeUpdate(); }catch(SQLExceptione){ out.println("添加用户信息失败"); } try{ if(pstmt!=null){ pstmt.close(); conn=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exceptione){ out.println("数据库关闭失败"); } %> </body> </html>
3.删除数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%> <%@pageimport="java.sql.*"%> <!DOCTYPEhtml> <html> <head> <title>获得第二条记录开始的三条记录</title> </head> <body> <% Stringurl="jdbc:mysql://localhost:3306/javaweb";//连接数据库的url地址 Stringuser="root";//登录数据库的用户名 Stringpassword="zhangda890126;;";//登录数据库的用户名的密码 Connectionconn=null;//链接对象 PreparedStatementpstmt=null;//语句对象 //ResultSetrs=null;//结果集对象 try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动程序 conn=DriverManager.getConnection(url,user,password);//链接数据库 }catch(ClassNotFoundExceptione){ out.println("找不到驱动类");//抛出异常时,提示信息 }catch(SQLExceptione){ out.println("链接MySQL数据库失败");//处理SQLException异常 } try{ Stringdeleteuser="DELETEFROMuserWHEREuserid=?";//添加一条用户信息 pstmt=conn.prepareStatement(deleteuser);//创建预处理语句对象PreparedStatement //设置参数 pstmt.setInt(1,2); //执行语句 pstmt.executeUpdate(); }catch(SQLExceptione){ out.println("添加用户信息失败"); } try{ if(pstmt!=null){ pstmt.close(); conn=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exceptione){ out.println("数据库关闭失败"); } %> </body> </html>
4.查询数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%> <%@pageimport="java.sql.*"%> <!DOCTYPEhtml> <html> <head> <title>获得第二条记录开始的三条记录</title> </head> <body> <% Stringurl="jdbc:mysql://localhost:3306/javaweb";//连接数据库的url地址 Stringuser="root";//登录数据库的用户名 Stringpassword="zhangda890126;;";//登录数据库的用户名的密码 Connectionconn=null;//链接对象 PreparedStatementpstmt=null;//语句对象 ResultSetrs=null;//结果集对象 try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动程序 conn=DriverManager.getConnection(url,user,password);//链接数据库 }catch(ClassNotFoundExceptione){ out.println("找不到驱动类");//抛出异常时,提示信息 }catch(SQLExceptione){ out.println("链接MySQL数据库失败");//处理SQLException异常 } try{ StringqueryAll="SELECT*FROMuserLIMIT?,?;";//添加一条用户信息 pstmt=conn.prepareStatement(queryAll);//创建预处理语句对象PreparedStatement //设置参数 pstmt.setInt(1,2); pstmt.setInt(2,5); //执行语句 rs=pstmt.executeQuery(); while(rs.next()){ intuserid=rs.getInt(1); Stringusername=rs.getString(2); Stringuserpassword=rs.getString(3); out.println("用户的ID:"+userid+"用户名:"+username+"用户的密码:"+userpassword+"<br/>"); } }catch(SQLExceptione){ out.println("添加用户信息失败"); } try{ if(pstmt!=null){ pstmt.close(); conn=null; } if(conn!=null){ conn.close(); conn=null; } }catch(Exceptione){ out.println("数据库关闭失败"); } %> </body> </html>