美文网首页JDBC编程
JDBC---使用 Statement 和ResultSet执行

JDBC---使用 Statement 和ResultSet执行

作者: ZebraWei | 来源:发表于2018-05-24 17:05 被阅读24次

    版权声明:本文为小斑马伟原创文章,转载请注明出处!
    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 向指定的数据表中插入一条记录.
      @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', 'xyz@atguigu.com', '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执行

        本文链接:https://www.haomeiwen.com/subject/juddjftx.html