`
jianfulove
  • 浏览: 120003 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
社区版块
存档分类
最新评论

Statement和PreparedStatement区别:

    博客分类:
  • JDBC
 
阅读更多

PreparedStatementStatement继承而来。

同构sqlsql语句基本一样,只是具体参数数值不同。

异构sqlsql语句完全不一样。

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之间的区别 Statement和PreparedStatement是JDBC中的两种不同的语句对象,用于执行数据库操作。虽然它们都可以执行SQL语句,但是它们之间存在着很大的区别。 首先, Statement对象...

    java中PreparedStatement和Statement的区别

    Java 中 PreparedStatement 和 Statement 的区别 Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 ...

    prepareStatement和Statement的区别

    prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...

    statement和prepared区别

    在使用Java语言进行数据库交互时,JDBC(Java Database Connectivity)是实现...总之,理解Statement和PreparedStatement之间的区别,能够帮助我们更好地使用JDBC进行数据库操作,从而编写出更加高效、安全的Java程序。

    PreparedStatement和Statement

    这个项目可能包含了使用`PreparedStatement`和`Statement`的例子,通过分析这些代码,你可以更好地理解两者的应用和区别。 总结,`PreparedStatement`和`Statement`在Java数据库操作中各有优势。在追求性能、安全性...

    connection 和 preparedstatement 的关闭问题

    正确地选择`Statement`和`PreparedStatement`以及适时地关闭它们对于保证应用程序的性能和稳定性至关重要。理解它们之间的区别,并根据实际需求选择合适的方法,能够显著提升应用的质量。同时,合理管理`Connection`...

    详解Java的JDBC中Statement与PreparedStatement对象

    在Java的JDBC(Java Database Connectivity)中,与数据库交互的核心接口是Statement和PreparedStatement。这两个接口都是用于执行SQL语句的,但它们在特性和效率上有所不同。 Statement接口是最基本的SQL执行方式...

    练习3:使用PreparedStatement插入宠物信息.zip

    在Java编程中,PreparedStatement是Java SQL API中的一个接口,它是Statement接口的子接口。这个练习主要涉及如何使用PreparedStatement来插入宠物信息到数据库中。PreparedStatement的主要优势在于它的预编译能力和...

    JDBC与Java数据库程序设计_0.rar_JAVA数据库_java huffman_java 数据库_jdbc_数据库程序

    3. Statement和PreparedStatement:Statement用于执行静态SQL语句,而PreparedStatement则用于预编译SQL语句,提供更好的性能和安全性,因为它可以防止SQL注入攻击。 4. ResultSet:当执行查询操作后,结果通常会被...

    Java语言SQL接口—JDBC编程技术

    - Statement对象:用于执行SQL查询和更新语句,有三种形式:Statement、PreparedStatement和CallableStatement。 - ResultSet对象:存储查询结果,提供遍历查询结果的方法。 - PreparedStatement:预编译的SQL...

    关于PreparedStatement插入Date类型值的方法.txt

    `PreparedStatement`是`Statement`接口的子接口,用于预编译SQL语句,并可以重复执行这些预编译过的SQL语句。这不仅能够提高应用程序的性能,还能提高安全性,因为它支持参数化查询,避免了SQL注入的风险。 #### 二...

    Pr_St_insert.rar_statement

    在编写数据库操作代码时,我们通常会遇到两种类型的SQL语句对象:Statement和PreparedStatement。这两个类都属于java.sql包,但它们在功能、安全性和性能上存在显著差异。 1. Statement对象: Statement是JDBC中最...

    JAVA-Web阶段重点及面试题汇总.pdf

    【Java Web阶段重点及面试题】涉及到的核心概念主要包括JDBC(Java数据库连接)技术、Statement与PreparedStatement的区别以及数据库连接池的原理。 1. JDBC技术 JDBC是Java平台中用于与关系数据库进行交互的一种...

    JDBC.rar_Table_jdbc

    3. 创建Statement/PreparedStatement对象:根据需求选择创建Statement或PreparedStatement对象。 4. 执行SQL:调用Statement或PreparedStatement的executeQuery()或executeUpdate()方法执行SQL。 5. 处理结果:对于...

    如何获得PreparedStatement最终执行的sql语句

    一种可能的方法是通过日志配置,例如,启用MySQL的`Statement`和`PreparedStatement`日志,这样在执行时会打印出详细的SQL语句。 另外,开发工具如IntelliJ IDEA、Eclipse等,或者数据库管理工具如MySQL Workbench...

    jdbc数据库连接jar包.zip

    - `com.mysql.jdbc.Connection`:表示一个到MySQL服务器的连接,提供了创建Statement和PreparedStatement的方法,以及事务控制等高级功能。 - `com.mysql.jdbc.PreparedStatement`:扩展了Statement类,允许预编译...

    jdbc.rar_WORKING_jdbc

    - 使用PreparedStatement代替Statement,提高性能和安全性。 - 在可能的情况下,关闭自动提交,手动提交事务以增强数据一致性。 - 使用连接池(如C3P0、HikariCP等)管理数据库连接,避免频繁创建和销毁连接。 - ...

Global site tag (gtag.js) - Google Analytics