java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;public class Demo2 { private String url = "jdbc:mysql://localhost:3306/test1"; private String user = "root"; //用户名 private String password ="123"; //密码 /** * 执行DDL语句(创建表) */ @Test public void test1(){ Statement stmt = null; Connection conn = null; try { //1.驱动注册程序 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象 conn = DriverManager.getConnection(url, user, password); //3.创建Statement stmt = conn.createStatement(); //4.准备sql String sql = "CREATE TABLE student2(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),gender VARCHAR(2))"; //5.发送sql语句,执行sql语句,得到返回结果 int count = stmt.executeUpdate(sql); //6.输出 System.out.println("影响了"+count+"行!"); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally{ //7.关闭连接(顺序:后打开的先关闭) if(stmt!=null) try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } if(conn!=null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }}
使用Statement执行sql语句
标签:
小编还为您整理了以下内容,可能对您也有帮助:
java statement到底是怎样执行查询的?
接口 | 作用 |
---|---|
Statement接口 | 用于执行静态的sql语句 |
PreparedStatement接口 | 用于执行预编译sql语句 |
CallableStatement接口 | 用于执行存储过程的sql语句(call xxx) |
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;/** * 使用Statement执行DDL语句(创建表) * @author RK * */public class Demo01{static//静态代码段{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "CREATE TABLE T_Persons(Id INT PRIMARY KEY AUTO_INCREMENT, UserName VARCHAR(20), Pwd VARCHAR(20))";//5.发送sql语句,执行sql语句,得到返回结果int count = stmt.executeUpdate(sql);//6.输出System.out.println("影响了"+count+"行!");//影响了0行!}catch (SQLException e){e.printStackTrace();}finally{//7.关闭连接(顺序:后打开的先关闭)closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;/** * 使用Statement执行DML语句 * @author RK * */public class Demo02{static{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "INSERT INTO T_Persons(UserName,Pwd) VALUES(‘地球人‘,‘123456‘)";//增加//String sql = "UPDATE T_Persons SET UserName=‘火星人‘ WHERE Id=1";//修改//String sql = "DELETE FROM T_Persons WHERE Id=1";//删除//5.发送sql语句,执行sql语句,得到返回结果int count = stmt.executeUpdate(sql);//6.输出System.out.println("影响了"+count+"行!");//影响了1行!}catch (SQLException e){e.printStackTrace();}finally{closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import java.sql.ResultSet;/** * 使用Statement执行DQL语句(查询操作) * @author RK * */public class Demo03{static{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;ResultSet rs = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "SELECT * FROM T_Persons";//5.发送sql语句,执行sql语句,得到返回结果rs = stmt.executeQuery(sql);//6.输出while(rs.next()){int id = rs.getInt("Id");String userName = rs.getString("UserName");String pwd = rs.getString("Pwd");System.out.println(id + "" + userName + "" + pwd);}}catch (SQLException e){e.printStackTrace();}finally{closeQuietly(rs);closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
JDBC系列:(2)使用Statement执行sql语句
标签:jdbc statement
java statement到底是怎样执行查询的?
接口 | 作用 |
---|---|
Statement接口 | 用于执行静态的sql语句 |
PreparedStatement接口 | 用于执行预编译sql语句 |
CallableStatement接口 | 用于执行存储过程的sql语句(call xxx) |
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;/** * 使用Statement执行DDL语句(创建表) * @author RK * */public class Demo01{static//静态代码段{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "CREATE TABLE T_Persons(Id INT PRIMARY KEY AUTO_INCREMENT, UserName VARCHAR(20), Pwd VARCHAR(20))";//5.发送sql语句,执行sql语句,得到返回结果int count = stmt.executeUpdate(sql);//6.输出System.out.println("影响了"+count+"行!");//影响了0行!}catch (SQLException e){e.printStackTrace();}finally{//7.关闭连接(顺序:后打开的先关闭)closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;/** * 使用Statement执行DML语句 * @author RK * */public class Demo02{static{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "INSERT INTO T_Persons(UserName,Pwd) VALUES(‘地球人‘,‘123456‘)";//增加//String sql = "UPDATE T_Persons SET UserName=‘火星人‘ WHERE Id=1";//修改//String sql = "DELETE FROM T_Persons WHERE Id=1";//删除//5.发送sql语句,执行sql语句,得到返回结果int count = stmt.executeUpdate(sql);//6.输出System.out.println("影响了"+count+"行!");//影响了1行!}catch (SQLException e){e.printStackTrace();}finally{closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
package com.rk.db.b_statement;import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import java.sql.ResultSet;/** * 使用Statement执行DQL语句(查询操作) * @author RK * */public class Demo03{static{try{//1.驱动注册程序Class.forName("com.mysql.jdbc.Driver");}catch (ClassNotFoundException e){throw new RuntimeException(e);}}public static void main(String[] args){Connection conn = null;Statement stmt = null;ResultSet rs = null;String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";try{//2.获取连接对象conn = DriverManager.getConnection(url, user, password);//3.创建Statementstmt = conn.createStatement();//4.准备sqlString sql = "SELECT * FROM T_Persons";//5.发送sql语句,执行sql语句,得到返回结果rs = stmt.executeQuery(sql);//6.输出while(rs.next()){int id = rs.getInt("Id");String userName = rs.getString("UserName");String pwd = rs.getString("Pwd");System.out.println(id + "" + userName + "" + pwd);}}catch (SQLException e){e.printStackTrace();}finally{closeQuietly(rs);closeQuietly(stmt);closeQuietly(conn);}}/** * 安静的关闭 */private static void closeQuietly(AutoCloseable ac){if(ac != null){try{ac.close();}catch (Exception e){e.printStackTrace();}}}}
JDBC系列:(2)使用Statement执行sql语句
标签:jdbc statement
java怎么样利用数据库中的数据?
Java可以利用数据库中的数据通过以下步骤:
1. 连接数据库:使用Java提供的JDBC(Java Database Connectivity)API连接数据库,需要提供数据库的URL、用户名和密码等信息。
2. 执行SQL语句:使用Java的Statement或PreparedStatement对象执行SQL语句,可以查询、插入、更新或删除数据库中的数据。
3. 处理结果集:执行SQL语句后,可以通过ResultSet对象获取查询结果集,可以遍历结果集并获取每一行数据的各个字段值。
4. 关闭连接:使用完数据库连接后,需要关闭连接以释放资源。
示例代码:
```java
//连接数据库
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
//执行SQL语句
String sql = "SELECT * FROM user";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id: " + id + ", name: " + name + ", age: " + age);
}
//关闭连接
rs.close();
stmt.close();
conn.close();
```
java怎么样利用数据库中的数据?
Java可以利用数据库中的数据通过以下步骤:
1. 连接数据库:使用Java提供的JDBC(Java Database Connectivity)API连接数据库,需要提供数据库的URL、用户名和密码等信息。
2. 执行SQL语句:使用Java的Statement或PreparedStatement对象执行SQL语句,可以查询、插入、更新或删除数据库中的数据。
3. 处理结果集:执行SQL语句后,可以通过ResultSet对象获取查询结果集,可以遍历结果集并获取每一行数据的各个字段值。
4. 关闭连接:使用完数据库连接后,需要关闭连接以释放资源。
示例代码:
```java
//连接数据库
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
//执行SQL语句
String sql = "SELECT * FROM user";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id: " + id + ", name: " + name + ", age: " + age);
}
//关闭连接
rs.close();
stmt.close();
conn.close();
```
java中执行sql插入语句怎么弄?
1、Connection conn = DriverManager.getConnection(URL,数据库登录名,数据库登录密码);//获得数据库连接。
2、Statement statement = con.createStatement(); //访问数据库。
3、ResultSet resultSet = statement.executeQuery(sql);//执行SQL语句。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
技术应用
1、Android应用
许多的 Android应用都是Java程序员开发者开发。虽然 Android运用了不同的JVM以及不同的封装方式,但是代码还是用Java语言所编写。相当一部分的手机中都支持JAVA游戏,这就使很多非编程人员都认识了JAVA。
2、在金融业应用的服务器程序
Java在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用Java开发,因为相对而言,Java较安全[39] 。大型投资银行用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。
3、网站
Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建web项目,SpringMVC,Struts2.0以及frameworks。即使是简单的 servlet,jsp和以struts为基础的网站在项目中也经常被用到。
4、嵌入式领域
Java在嵌入式领域发展空间很大。在这个平台上,只需130KB就能够使用Java技术。
5、大数据技术
Hadoop以及其他大数据处理技术很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。
6、高频交易的空间
Java平台提高了这个平台的特性和即使编译,他同时也能够像 C++ 一样传递数据。正是由于这个原因,Java成为的程序员编写交易平台的语言,因为虽然性能不比C++,但开发人员可以避开安全性,可移植性和可维护性等问题。
7、科学应用
Java在科学应用中是很好选择,包括自然语言处理。最主要的原因是因为Java比C++或者其他语言相对其安全性、便携性、可维护性以及其他高级语言的并发性更好。
如何用statement执行存储过程
接口 | 作用 |
---|---|
Statement接口 | 用于执行静态的sql语句 |
PreparedStatement接口 | 用于执行预编译sql语句 |
CallableStatement接口 | 用于执行存储过程的sql语句(call xxx) |
package com.rk.db.d_callable;import java.sql.Connection;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.rk.db.utils.JDBCUtil;/** * 使用CablleStatement调用带有输入参数的存储过程 * @author RK * */public class Demo01{public static void main(String[] args){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;try{//获取连接conn = JDBCUtil.getConnection();//准备sqlString sql = "CALL pro_findById(?)";//可以执行预编译的sql//预编译cstmt = conn.prepareCall(sql);//设置输入参数cstmt.setInt(1, 3);//发送参数rs = cstmt.executeQuery();//注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!//遍历结果while(rs.next()){int id = rs.getInt("Id");String userName = rs.getString("UserName");String pwd = rs.getString("Pwd");System.out.println(id + "" + userName + "" + pwd);}}catch (SQLException e){e.printStackTrace();}finally{JDBCUtil.close(conn, cstmt, rs);}}}
package com.rk.db.d_callable;import java.sql.Connection;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.rk.db.utils.JDBCUtil;/** * 使用CablleStatement执行带有输出参数的存储过程 * CALL pro_findById2(5,@NAME); * @author RK * */public class Demo02{public static void main(String[] args){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;try{//获取连接conn = JDBCUtil.getConnection();//准备sqlString sql = "CALL pro_findById2(?,?)";//第一个?是输入参数,第二个?是输出参数//预编译cstmt = conn.prepareCall(sql);//设置输入参数cstmt.setInt(1, 3);//设置输出参数(注册输出参数)/** * 参数一: 参数位置 * 参数二: 存储过程中的输出参数的jdbc类型 VARCHAR(20) */cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);//发送参数,执行结果不是返回到结果集中,而是返回到输出参数中cstmt.executeQuery();//注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!//得到输出参数的值/** * 索引值: 预编译sql中的输出参数的位置 */String result = cstmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数System.out.println(result);}catch (SQLException e){e.printStackTrace();}finally{JDBCUtil.close(conn, cstmt, rs);}}}
JDBC系列:(4)使用CablleStatement调用存储过程
标签:callablestatement jdbc
如何用statement执行存储过程
接口 | 作用 |
---|---|
Statement接口 | 用于执行静态的sql语句 |
PreparedStatement接口 | 用于执行预编译sql语句 |
CallableStatement接口 | 用于执行存储过程的sql语句(call xxx) |
package com.rk.db.d_callable;import java.sql.Connection;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.rk.db.utils.JDBCUtil;/** * 使用CablleStatement调用带有输入参数的存储过程 * @author RK * */public class Demo01{public static void main(String[] args){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;try{//获取连接conn = JDBCUtil.getConnection();//准备sqlString sql = "CALL pro_findById(?)";//可以执行预编译的sql//预编译cstmt = conn.prepareCall(sql);//设置输入参数cstmt.setInt(1, 3);//发送参数rs = cstmt.executeQuery();//注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!//遍历结果while(rs.next()){int id = rs.getInt("Id");String userName = rs.getString("UserName");String pwd = rs.getString("Pwd");System.out.println(id + "" + userName + "" + pwd);}}catch (SQLException e){e.printStackTrace();}finally{JDBCUtil.close(conn, cstmt, rs);}}}
package com.rk.db.d_callable;import java.sql.Connection;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.rk.db.utils.JDBCUtil;/** * 使用CablleStatement执行带有输出参数的存储过程 * CALL pro_findById2(5,@NAME); * @author RK * */public class Demo02{public static void main(String[] args){Connection conn = null;CallableStatement cstmt = null;ResultSet rs = null;try{//获取连接conn = JDBCUtil.getConnection();//准备sqlString sql = "CALL pro_findById2(?,?)";//第一个?是输入参数,第二个?是输出参数//预编译cstmt = conn.prepareCall(sql);//设置输入参数cstmt.setInt(1, 3);//设置输出参数(注册输出参数)/** * 参数一: 参数位置 * 参数二: 存储过程中的输出参数的jdbc类型 VARCHAR(20) */cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);//发送参数,执行结果不是返回到结果集中,而是返回到输出参数中cstmt.executeQuery();//注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!//得到输出参数的值/** * 索引值: 预编译sql中的输出参数的位置 */String result = cstmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数System.out.println(result);}catch (SQLException e){e.printStackTrace();}finally{JDBCUtil.close(conn, cstmt, rs);}}}
JDBC系列:(4)使用CablleStatement调用存储过程
标签:callablestatement jdbc
在Java中 Connection、Statement、ResultSet 、PreparedSta
Connection是建立与数据库的链接,Statement算是一个连接的实例,用来执行SQL语句,ResultSet是查询后得到的结果集,得到结果后必须执行.next()方法
给你个我刚写的例子,区别很好理解的,我一般都用Statement,这是第一次用PreraredStatement 只不过是在后面赋值而已
public class Test {public static void main(String[] args){
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=LIBRARY";
String userName = "sa";
String userPwd = "";
Connection dbConn;
Statement stmt;
PreparedStatement ps;
try {
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
stmt = dbConn.createStatement();
ResultSet rs1 = stmt.executeQuery("select *from borrow where uno = 2011111276");
System.out.println("statement:");
while (rs1.next()) {
System.out.println(rs1.getString(1)+" "+ rs1.getString(2));
}
ps = dbConn.prepareStatement("select *from borrow where uno = ?");
//注意这句
ps.setString(1, "2011111276");
ResultSet rs2 = ps.executeQuery();
System.out.println("preparedstatement:");
while (rs2.next()) {
System.out.println(rs2.getString(1)+" "+ rs2.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC中的Statement和PreparedStatement的区别
以Oracle为例吧
Statement为一条Sql语句生成执行计划,
如果要执行两条sql语句
select colume from table where colume=1;
select colume from table where colume=2;
会生成两个执行计划
一千个查询就生成一千个执行计划!
PreparedStatement用于使用绑定变量重用执行计划
select colume from table where colume=:x;
通过set不同数据只需要生成一次执行计划,可以重用
是否使用绑定变量对系统影响非常大,生成执行计划极为消耗资源
两种实现 速度差距可能成百上千倍
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,preparedstatement支持批处理
4.
Code Fragment 1:
1.String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERECOF_NAME LIKE ′Colombian′";
2. stmt.executeUpdate(updateString);
Code Fragment 2:
1.PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SETSALES = ? WHERE COF_NAME LIKE ? ");
2. updateSales.setInt(1, 75);
3. updateSales.setString(2, "Colombian");
4. updateSales.executeUpdate();
片断2和片断1的区别在于,后者使用了PreparedStatement对象,而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对 象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出 它预编译的优越性。
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为 PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。 PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。
然而,在Oracle环境中,开发人员实际上有更大的灵活性。当使用Statement或PreparedStatement对象时,Oracle数据库 会缓存SQL语句以便以后使用。在一些情况下,由于驱动器自身需要额外的处理和在Java应用程序和Oracle服务器间增加的网络活动,执行 PreparedStatement对象实际上会花更长的时间。
然而,除了缓冲的问题之外,至少还有一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给 PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。
当处理公共Web站点上的用户传来的数据的时候,安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽 略。最简单的情况下,这就意味着当你的程序试着将字符串“D'Angelo”插入到VARCHAR2中时,该语句将不会识别第一个“,”,从而导致悲惨的 失败。几乎很少有必要创建你自己的字符串忽略代码。
在Web环境中,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过 PreparedStatement对象处理的情况下,所有的用户输入都不应该传递给SQL语句。此外,在用户有机会修改SQL语句的地方,如HTML的 隐藏区域或一个查询字符串上,SQL语句都不应该被显示出来。
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个 SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析 和编译。
第一:
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
createStatement不会初始化,没有预处理,没次都是从0开始执行SQL
第二:
prepareStatement可以替换变量
在SQL语句中可以包含?,可以用ps=conn.prepareStatement("select* from Cust where ID=?");
int sid=1001;
ps.setInt(1, sid);
rs = ps.executeQuery();
可以把?替换成变量。
而Statement只能用
int sid=1001;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from Cust where ID="+sid);
来实现。
第三:
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率。
createStatement不会初始化,没有预处理,没次都是从0开始执行SQL