Statement:
通过类的名字,把类(元数据对象)加载到内存中,加载驱动,由于是对数据流做操作,一定要加异常处理,后面也是
<span style="white-space:pre"> </span>// 通过类的名字,把类(元数据对象)加载到内存中 <span style="white-space:pre"> </span>Class.forName("com.mysql.jdbc.Driver");
创建一个数据库链接,getConnection方法中的第一个参数是指数据库类型和所操作数据库的名称,第二个参数是指用户名,第三个参数是指password<密码>
<span style="white-space:pre"> </span>Connection conn = DriverManager.getConnection( <span style="white-space:pre"> </span>"jdbc:mysql://localhost:3306/score", "root", "123456");然后创建一个Statement对象
<span style="white-space:pre"> </span>Statement stm = conn.createStatement();
一般执行SQL语句就是用,如果是查询则返回的是一张二维关系表,所以用ResultSet对象收集
<span style="white-space:pre"> </span>//执行增、删、改语句,返回int型,受影响的行数 stm.executeUpdate(strSql); //返回一个ResultSet对象,其实就是一个表或者视图 rst = stm.executeQuery(strSql);
ResultSet对象集,然后输出结果,如下
<span style="white-space:pre"> </span>//输出结果 while(rst.next()) {// 游标下移一行 System.out.println(rst.getString("Sid") + "\t" + rst.getString("Sname")); }
如果对数据库的操作完成了,则需要在finally里面关闭前面创建的对象,对象销毁按照创建的栈来进行
<span style="white-space:pre"> </span><pre name="code" class="java"><span style="white-space:pre"> </span>finally { //打开是先打开Connection,再打开ResultSet //关闭是反的关闭 if(rst != null) { try { rst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stm != null) { try { stm.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
PreparedStatement:
package JDBC_Study; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class PreparedStatementDemo { public static void main(String[] args) { Connection conn = null; PreparedStatement stmt = null; ResultSet rst = null ; String strSql = "select * from student where sid = ?"; try { // 通过类的名字,把类(元数据对象)加载到内存中 Class.forName("com.mysql.jdbc.Driver"); // conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/score", "root", "123456"); //执行增、删、改语句,返回int型,受影响的行数 // pStm.executeUpdate(); //返回一个ResultSet对象,其实就是一个表或者视图 stmt = conn.prepareStatement(strSql); stmt.setString(1, "100081"); rst = stmt.executeQuery(); //输出结果 while(rst.next()) {// 游标下移一行 System.out.println(rst.getString("Sid") + "\t" + rst.getString("Sname")); } } catch (ClassNotFoundException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //打开是先打开Connection,再打开ResultSet //关闭是反的关闭 if(rst != null) { try { rst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stmt != null) { try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
Statement 与 PreparedStatement 的优点和缺点:
PreparedStatement接口继承Statement接口
PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率
提高了代码的可读性和可维护性
提高了SQL语句执行的性能
提高了安全性