1.首先两个都是java向数据库执行sql语句的对象!
java代码连接数据库,并且执行sql语句的步骤如下:
//1.注册数据库的驱动程序
Class.forName(driverClass); /2/获得数据库的连接 conn=DriverManager.getConnection(url,username,password); //3创建sql执行对象 Statement stmt=conn.createStatement(); //执行sql语句返回执行结果集rs ResultSet rs=stmt.executeQuery(sql);Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句:Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。
综上所述,总结如下:Statement每次执行sql语句,数据库都要执行sql语句的编译,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.但存在sql注入风险。PreparedStatement是预编译执行的。在执行可变参数的一条SQL时,PreparedStatement要比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率高。安全性更好,有效防止SQL注入的问题。对于多次重复执行的语句,使用Prepared
Statement效率会更高一点。执行SQL语句是可以带参数的,并支持批量执行SQL。由于采用了Cache机制,则预编译的语句,就会放在Cache中,下次执行相同的SQL语句时,则可以直接从Cache中取出来。
示例:PreparedStatement
public void save(Stu s) {
//定义要执行的sql String sql="insert into person(id,name,age) values(?,?,?)"; DBUtil util=new DBUtil(); //得到连接 Connection conn=util.getConnection(); try { //创建sql执行对象 PreparedStatement psmt=conn.prepareStatement(sql); psmt.setInt(1, s.getId() ); psmt.setString(2, s.getName() ); psmt.setInt(3, s.getAge()); psmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { util.close(conn); } }示例:Statement
public List list() {
//定义要执行的sql String sql="select id,name,age from person"; DBUtil util=new DBUtil(); //得到连接 Connection conn=util.getConnection(); try { //创建sql执行对象 java.sql.Statement stmt=conn.createStatement(); //拿到查询的结果集rs ResultSet rs=stmt.executeQuery(sql); //定义一个数组,把结果放进去 List list=new ArrayList(); while(rs.next()) { int id=rs.getInt(1); String name=rs.getString(2); int age=rs.getInt(3); Stu s=new Stu(); s.setId(id); s.setName(name); s.setAge(age); list.add(s); } return list; } catch (SQLException e) { e.printStackTrace(); }finally { util.close(conn); } return null; }