java中对数据库的操作Statement和PrepareStatement这两个方法有什么不...

发布网友

我来回答

3个回答

懂视网

插入操作 public void insert(Vector<Person> vt) { PreparedStatement ps = null; try { dbHelper = new DBHelper(); conn = dbHelper.getConn(); conn.setAutoCommit(false);// 首先把Auto commit设置为false,不让它自动提交 String sql = "insert into " + Constant.TABLE_NAME + " values (?,?,?,?,?,?)"; ps = conn.prepareStatement(sql); for (Person person : vt) { ps.setInt(1, person.getId()); ps.setString(2, person.getName()); ps.setString(3, person.getAge()); ps.setString(4, person.getSex()); ps.setString(5, person.getTelNum()); ps.setString(6, person.getAddress()); ps.addBatch(); } ps.executeBatch(); conn.commit();// 进行手动提交(commit) conn.setAutoCommit(true);// 提交完成后回复现场将Auto commit,还原为true System.out.println("添加成功"); } catch (SQLException e) { e.printStackTrace(); try {// 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态 if (!conn.isClosed()) { // 当异常发生执行catch中SQLException时,记得要rollback(回滚); conn.rollback(); System.out.println("插入失败,回滚!"); conn.setAutoCommit(true); } } catch (SQLException e1) { e1.printStackTrace(); } } finally { try { ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } // 查询操作 public Vector<Person> selectAll() { Vector<Person> vt = new Vector<Person>(); try { dbHelper = new DBHelper(); conn = dbHelper.getConn(); String sql = "select * from " + Constant.TABLE_NAME; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { Person person = new Person(); person.setId(rs.getInt(1)); person.setName(rs.getString(2)); person.setAge(rs.getString(3)); person.setSex(rs.getString(4)); person.setTelNum(rs.getString(5)); person.setAddress(rs.getString(6)); vt.add(person); } stmt.close(); rs.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return vt; } // 删除所有 public void deleteAll() { try { dbHelper = new DBHelper(); conn = dbHelper.getConn(); String sql = "truncate table " + Constant.TABLE_NAME; PreparedStatement ps = conn.prepareStatement(sql); ps.executeUpdate(); ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } }

 

分别使用Statement和PreparedStatement对数据库进行操作

标签:

热心网友

它们是JDBC提供的类:statement 与preparestatement 区别 1.
PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需要更改其中变量的值,便可重新执行SQL语句。选择 PreParedStatement对象与否,在于相同的句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量不同,如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出她预编译的优越性。 2.prepareStatement是把你的sql语句预先“编译”好,每次只替换定义的变量,
他的作用是减少与数据库的通信量,从而加快执行速度,主要用在循环执行SQL语句 3.
prepareStatement已经予编译,速度比Statement快些
prepareStatement解决有关特殊字符插入到数据库的问题。如(',",),?) 4.
Statement ─ 由方法 createStatement 所创建。Statement 对象用于发送简单的 SQL 语句。 
PreparedStatement ─ 由方法 prepareStatement 所创建。PreparedStatement 对象用于发送带有一个或多个输入参数( IN 参数)的 SQL 语句。PreparedStatement 拥有一组方法,用于设置 IN 参数的值。执行语句时,这些 IN 参数将被送到数据库中。PreparedStatement 的实例扩展了 Statement ,因此它们都包括了 Statement 的方法。PreparedStatement 对象有可能比 Statement 对象的效率更高,因为它已被预编译过并存放在那以供将来使用。 
CallableStatement ─ 由方法 prepareCall 所创建。CallableStatement 对象用于执行 SQL 储存程序 ─ 一组可通过名称来调用(就象函数的调用那样)的 SQL 语句。CallableStatement 对象从 PreparedStatement 中继承了用于处理 IN 参数的方法,而且还增加了用于处理 OUT 参数和 INOUT 参数的方法。 

以下所列提供的方法可以快速决定应用哪个 Connection 方法来创建不同类型的 SQL 语句: 

createStatement 方法用于:

简单的 SQL 语句(不带参数) 

prepareStatement 方法用于: 

带一个或多个 IN 参数的 SQL 语句 

经常被执行的简单 SQL 语句

prepareCall 方法用于: 
调用已储存过程 Statement用法 stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); prepareStatement用法
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
Statement没有设置缓存,prepareStatement有,并且一次性可以插入n个数据 利用PreparedStatement对象提高数据库的总体效率
  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象

热心网友

它们是属于不同的两个类,Statement用于执行拼接的SQL语句,PrepareStatement可以预加载语句,把变量的值设为问号,然后再对应问号顺序赋值,这样能防止一个安全漏洞。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com