JDBC---使用 Statement 和ResultSet执行操作

版权声明:本文为小斑马伟原创文章,转载请注明出处!
Statement:通过调用 Connection 对象的 createStatement 方法创建该对象。该对象用于执行静态的 SQL 语句,并且返回执行结果。Statement 接口中定义了下列方法用于执行 SQL 语句:

  • ResultSet excuteQuery(String sql)
  • int excuteUpdate(String sql)

ResultSet:通过调用 Statement 对象的 excuteQuery() 方法创建该对象。ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现。ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
。ResultSet 接口的常用方法:
boolean next()
getString()

JDBC---使用 Statement 和ResultSet执行操作_第1张图片

通过 JDBC 向指定的数据表中插入一条记录.

  @Test
   public void testStatement() throws Exception{
    //1. 获取数据库连接
    Connection conn = null;
    Statement statement = null;
    
    try {
        conn = getConnection2();
        
        //3. 准备插入的 SQL 语句
        String sql = null;
        
       //sql = "INSERT INTO customers (NAME, EMAIL, BIRTH) " +
            //"VALUES('XYZ', '[email protected]', '1990-12-12')";
      //sql = "DELETE FROM customers WHERE id = 1";
        sql = "UPDATE customers SET name = 'TOM' " +
                "WHERE id = 4";
        System.out.println(sql);
        
        //4. 执行插入. 
        //1). 获取操作 SQL 语句的 Statement 对象: 
        //调用 Connection 的 createStatement() 方法来获取
        statement = conn.createStatement();
        
        //2). 调用 Statement 对象的 executeUpdate(sql) 执行 SQL 语句进行插入
        statement.executeUpdate(sql);
    } catch (Exception e) {
        e.printStackTrace();
    } finally{
        try {
            //5. 关闭 Statement 对象.
            if(statement != null)
                statement.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            //2. 关闭连接
            if(conn != null)
                conn.close();                           
        }
    }
   }

1. Statement: 用于执行 SQL 语句的对象
* 1). 通过 Connection 的 createStatement() 方法来获取。
* 2). 通过 executeUpdate(sql) 可以执行 SQL 语句。
* 3). 传入的 SQL 可以是 INSRET, UPDATE 或 DELETE. 但不能是 SELECT。
* 2. Connection、Statement 都是应用程序和数据库服务器的连接资源. 使用后一定要关闭.
* 需要在 finally 中关闭 Connection 和 Statement 对象。
* 3. 关闭的顺序是: 先关闭后获取的. 即先关闭 Statement 后关闭 Connection。

/**
 * 通用的更新的方法: 包括 INSERT、UPDATE、DELETE
 * 版本 1.
 */
public void update(String sql){
    Connection conn = null;
    Statement statement = null;
    
    try {
        conn = JDBCTools.getConnection();
        statement = conn.createStatement();
        statement.executeUpdate(sql);
    } catch (Exception e) {
        e.printStackTrace();
    } finally{
        JDBCTools.release(statement, conn);
    }
}

具体的getConnection2()数据库连接方式见

@Test
public void testResultSet(){
    //获取 id=4 的 customers 数据表的记录, 并打印
    
    Connection conn = null;
    Statement statement = null;
    ResultSet rs = null;
    
    try {
        //1. 获取 Connection
        conn = JDBCTools.getConnection();
        System.out.println(conn);
        
        //2. 获取 Statement
        statement = conn.createStatement();
        System.out.println(statement);
        
        //3. 准备 SQL
        String sql = "SELECT id, name, email, birth " +
                "FROM customers";
        
        //4. 执行查询, 得到 ResultSet
        rs = statement.executeQuery(sql);
        System.out.println(rs);
        
        //5. 处理 ResultSet
        while(rs.next()){
            int id = rs.getInt(1);
            String name = rs.getString("name");
            String email = rs.getString(3);
            Date birth = rs.getDate(4);
            
            System.out.println(id);
            System.out.println(name);
            System.out.println(email);
            System.out.println(birth);
        }
        
    } catch (Exception e) {
        e.printStackTrace();
    } finally{
        //6. 关闭数据库资源. 
        JDBCTools.release(rs, statement, conn);
    }
}

ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果.

    1. 调用 Statement 对象的 executeQuery(sql) 可以得到结果集。
    1. ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一样的前面. 可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于 Iterator 对象的 hasNext() 和 next() 方法的结合体。
    1. 当指针对位到一行时, 可以通过调用 getXxx(index) 或 getXxx(columnName) 获取每一列的值. 例如: getInt(1), getString("name")。
    1. ResultSet 当然也需要进行关闭.。
public static void release(ResultSet rs, 
        Statement statement, Connection conn) {
    if(rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    
    if (statement != null) {
        try {
            statement.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }

    if (conn != null) {
        try {
            conn.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
}

/**
 * 关闭 Statement 和 Connection
 * @param statement
 * @param conn
 */
public static void release(Statement statement, Connection conn) {
    if (statement != null) {
        try {
            statement.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }

    if (conn != null) {
        try {
            conn.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
}

SQL 注入攻击:SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法。对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了。

 /**
 * SQL 注入.
 */
@Test
public void testSQLInjection() {
    String username = "a' OR PASSWORD = ";
    String password = " OR '1'='1";

    String sql = "SELECT * FROM users WHERE username = '" + username
            + "' AND " + "password = '" + password + "'";

    System.out.println(sql);

    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = JDBCTools.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(sql);

        if (resultSet.next()) {
            System.out.println("登录成功!");
        } else {
            System.out.println("用户名和密码不匹配或用户名不存在. ");
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JDBCTools.releaseDB(resultSet, statement, connection);
    }
}

你可能感兴趣的:(JDBC---使用 Statement 和ResultSet执行操作)