PreparedStatement从Statement继承而来。
同构sql:sql语句基本一样,只是具体参数数值不同。
异构sql:sql语句完全不一样。
Statement不足:
1. 效率比较低 2. 对字段类型的支持比较差 3. 语法含义不清晰(结构不清楚)。
由于编译不需要参数,PreparedStatement可以使用“?”来替代sql语句中的某些参数,它先将不带参数的sql语句发送到数据库,进行预编译,然后PreparedStatement会再将设置好的参数发送给数据库。
在使用PreparedStatement设置相应参数时,要指明参数的位置和类型,以及给出参数的具体值,根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数。
如:String sql=”update student set name=? where id=4;”
//其中的?代表占位符,在这里并没有设置具体值。
PreparedStatement pstm=con.prepareStatement(sql);
// sql语句已经发送到数据库去编译了,即预编译。
pstm.setXXX(参数的位置,参数的值)
//把参数值存放在PreparedStatement对象中。
Pstm.executeUpdate();
// 由于已经预编译过,因此不需要再传入sql语句,就可以直接执行。
Statement代码如下: package com.ambow.day19.jdbc; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.ambow.day19.jdbc.util.JDBCConAndClo; //注:当执行多插入和多修改时可以使用批量处理addBatch,executeBatch; public class JDBCStatementTest { public static void main(String args[]){ Connection con = null; Statement stm = null; ResultSet rs = null; try { //1.加载JDBC驱动和连接数据库 con=JDBCConAndClo.getConnectionBao(); System.out.println("con="+con); // //*用Statement向数据库插入数据: // String sql1="insert into student values(12,'wang','java',55)"; // String sql2="insert into student values(13,'wang','java',95)"; // String sql3="insert into student values(14,'wadedng','java',45)"; // stm = con.createStatement(); // stm.executeUpdate(sql1); // stm.executeUpdate(sql2); // stm.executeUpdate(sql3); // System.out.println("插入成功!"); //*用Statement从数据库中删除数据: String sql11="delete from student where id=1"; String sql12="delete from student where id=2"; String sql13="delete from student where id=3"; stm = con.createStatement(); stm.executeUpdate(sql11); stm.executeUpdate(sql12); stm.executeUpdate(sql13); System.out.println("删除成功!"); //*用Statement从数据库查询数据: //2. 执行sql语句: String sql = "select * from student"; // 创建一个statement(发送sql) stm = con.createStatement(); // 执行查询sql语句 rs = stm.executeQuery(sql); // 3.获取sql结果集: while(rs.next()){ System.out.print(rs.getString("id")+" "); System.out.print(rs.getString("name")+" "); System.out.print(rs.getString("course")+" "); System.out.println(rs.getString("score")); } } catch (SQLException e) { e.printStackTrace(); } finally { //4.关闭数据库,并释放资源: JDBCConAndClo.closeResultSet(rs); JDBCConAndClo.closeStatement(stm); JDBCConAndClo.closeConnection(con); } } } PreparedStatement代码如下: package com.ambow.day19.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.ambow.day19.jdbc.util.JDBCConAndClo; //注:当执行多插入和多修改时可以使用批量处理addBatch,executeBatch; public class JDBCPreparedStatementTest { public static void main(String args[]){ Connection con=null; PreparedStatement pstm=null; ResultSet rs=null; try { con=JDBCConAndClo.getConnectionBao(); //*用PreparedStatement向数据库中插入数据; //String sql="insert into student values(10,'李四','高数',90)"; String sql="insert into student values(?,?,?,?)"; //1.先创建PreparedStatement语句(发送slq请求): pstm=con.prepareStatement(sql); //2.在设置sql语句: pstm.setInt(1,11); pstm.setString(2,"wangqinqin"); pstm.setString(3, "hibernate"); pstm.setInt(4, 85); //3.再执行sql语句: pstm.executeUpdate(); System.out.println("插入成功!"); //*用PreparedStatement从数据库中删除数据; String sql2="delete from student where id=?"; pstm=con.prepareStatement(sql2); pstm.setInt(1,5); pstm.executeUpdate(); System.out.println("删除成功!"); //*用PreparedStatement从数据库中查询出数据; String sql1="select * from student where id=?"; pstm=con.prepareStatement(sql1); pstm.setInt(1,8); rs=pstm.executeQuery(); System.out.println("查询结果为:"); //循环取得结果; while(rs.next()){ System.out.print(rs.getString("id")+" "); System.out.print(rs.getString("name")+" "); System.out.print(rs.getString("course")+" "); System.out.println(rs.getString("score")); } } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCConAndClo.closeResultSet(rs); JDBCConAndClo.closePreparedStatement(pstm); JDBCConAndClo.closeConnection(con); } } } 其中连接和关闭数据库已经封装到另一个包JDBCConAndClo类中: package com.ambow.day19.jdbc.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCConAndClo { public static void main(String args[]) { JDBCConAndClo jc = new JDBCConAndClo(); jc.getConnectionBao(); } //加载JDBC驱动程序和连接数据库; public static Connection getConnectionBao() { Connection con = null; String URL = "jdbc:oracle:thin:@localhost:1521:ambow"; String user = "system"; String password = "wqq123"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); con = DriverManager.getConnection(URL, user, password); if (!con.isClosed()) { System.out.println("连接数据库成功!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } System.out.println("con=" + con); return con; } //关闭ResultSet public static void closeResultSet(ResultSet rs) { if (rs != null) { try { rs.close(); rs = null; } catch (SQLException e) { e.printStackTrace(); } } } //关闭Statement public static void closeStatement(Statement stm) { if (stm != null) { try { stm.close(); stm = null; } catch (SQLException e) { e.printStackTrace(); } } } //关闭PreparedStatement public static void closePreparedStatement(PreparedStatement pstm) { if (pstm != null) { try { pstm.close(); pstm = null; } catch (SQLException e) { e.printStackTrace(); } } } //关闭Connection public static void closeConnection(Connection con) { if (con != null) { try { con.close(); con = null; } catch (SQLException e) { e.printStackTrace(); } con = null; } } }
挺好的,转自http://wangqinqin.iteye.com/blog/547275
相关推荐
Statement和PreparedStatement之间的区别 Statement和PreparedStatement是JDBC中的两种不同的语句对象,用于执行数据库操作。虽然它们都可以执行SQL语句,但是它们之间存在着很大的区别。 首先, Statement对象...
Java 中 PreparedStatement 和 Statement 的区别 Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 ...
prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...
在使用Java语言进行数据库交互时,JDBC(Java Database Connectivity)是实现...总之,理解Statement和PreparedStatement之间的区别,能够帮助我们更好地使用JDBC进行数据库操作,从而编写出更加高效、安全的Java程序。
这个项目可能包含了使用`PreparedStatement`和`Statement`的例子,通过分析这些代码,你可以更好地理解两者的应用和区别。 总结,`PreparedStatement`和`Statement`在Java数据库操作中各有优势。在追求性能、安全性...
正确地选择`Statement`和`PreparedStatement`以及适时地关闭它们对于保证应用程序的性能和稳定性至关重要。理解它们之间的区别,并根据实际需求选择合适的方法,能够显著提升应用的质量。同时,合理管理`Connection`...
在Java的JDBC(Java Database Connectivity)中,与数据库交互的核心接口是Statement和PreparedStatement。这两个接口都是用于执行SQL语句的,但它们在特性和效率上有所不同。 Statement接口是最基本的SQL执行方式...
在Java编程中,PreparedStatement是Java SQL API中的一个接口,它是Statement接口的子接口。这个练习主要涉及如何使用PreparedStatement来插入宠物信息到数据库中。PreparedStatement的主要优势在于它的预编译能力和...
3. Statement和PreparedStatement:Statement用于执行静态SQL语句,而PreparedStatement则用于预编译SQL语句,提供更好的性能和安全性,因为它可以防止SQL注入攻击。 4. ResultSet:当执行查询操作后,结果通常会被...
- Statement对象:用于执行SQL查询和更新语句,有三种形式:Statement、PreparedStatement和CallableStatement。 - ResultSet对象:存储查询结果,提供遍历查询结果的方法。 - PreparedStatement:预编译的SQL...
`PreparedStatement`是`Statement`接口的子接口,用于预编译SQL语句,并可以重复执行这些预编译过的SQL语句。这不仅能够提高应用程序的性能,还能提高安全性,因为它支持参数化查询,避免了SQL注入的风险。 #### 二...
在编写数据库操作代码时,我们通常会遇到两种类型的SQL语句对象:Statement和PreparedStatement。这两个类都属于java.sql包,但它们在功能、安全性和性能上存在显著差异。 1. Statement对象: Statement是JDBC中最...
【Java Web阶段重点及面试题】涉及到的核心概念主要包括JDBC(Java数据库连接)技术、Statement与PreparedStatement的区别以及数据库连接池的原理。 1. JDBC技术 JDBC是Java平台中用于与关系数据库进行交互的一种...
3. 创建Statement/PreparedStatement对象:根据需求选择创建Statement或PreparedStatement对象。 4. 执行SQL:调用Statement或PreparedStatement的executeQuery()或executeUpdate()方法执行SQL。 5. 处理结果:对于...
一种可能的方法是通过日志配置,例如,启用MySQL的`Statement`和`PreparedStatement`日志,这样在执行时会打印出详细的SQL语句。 另外,开发工具如IntelliJ IDEA、Eclipse等,或者数据库管理工具如MySQL Workbench...
- `com.mysql.jdbc.Connection`:表示一个到MySQL服务器的连接,提供了创建Statement和PreparedStatement的方法,以及事务控制等高级功能。 - `com.mysql.jdbc.PreparedStatement`:扩展了Statement类,允许预编译...
- 使用PreparedStatement代替Statement,提高性能和安全性。 - 在可能的情况下,关闭自动提交,手动提交事务以增强数据一致性。 - 使用连接池(如C3P0、HikariCP等)管理数据库连接,避免频繁创建和销毁连接。 - ...