Preparedstatement和Statement的区别和用例

目录

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表原已有一些数据。
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ariel_201311/article/details/80426686
今日推荐