1. 程式人生 > >jdbc篇第3課:使用jdbc做查詢操作

jdbc篇第3課:使用jdbc做查詢操作

  這節課我們來講如何用jdbc做查詢操作:

 

Demo 01:

package jdbc;



import jdbc.bean.Employee;



import java.sql.*;

import java.util.ArrayList;

import java.util.List;



//Jdbc查詢教學

public class JdbcQueryTeach {



    public static void main(String[] args) throws SQLException {

        
/**          * jdbc查詢操作:          * 1. 建立好表對應的類(我們稱為bean),要求每一列對應一個屬性,且資料型別對應上          * 2. 建立連線,獲取Connection物件          * 3. 使用Connection物件獲取Statement或PreparedStatement物件          * 4. 寫好sql          * 5. 使用Statement或PreparedStatement執行查詢語句,獲取ResultSet物件          * 6. 建一個或多個bean物件          * 7. 獲取ResultSet裡儲存的值,並封裝到bean物件中          * 8. 關閉連線          */        
Connection connection = null;         try {             //2. 獲取Connection連線             Class.forName("com.mysql.jdbc.Driver");            
String url = "jdbc:mysql://localhost:3306/teach";             String user = "root";             String password = "root";             connection = DriverManager.getConnection(url, user, password);             //3. 使用Connection物件獲取Statement或PreparedStatement物件             Statement statement = connection.createStatement();             //4. 寫好sql             //暫時取5條資料             String sql = "select * from tbl_employee where id <= 5";             //5. 使用Statement或PreparedStatement物件執行sql,獲得ResultSet物件             ResultSet resultSet = statement.executeQuery(sql);             //6. 建立一個或多個bean物件             List<Employee> employeeList = new ArrayList<>();             //看來沒有直接獲取記錄數的方法             //next()方法就是獲取下一條記錄,如果下一條記錄存在就返回true,並且自己執行該條記錄             //如果沒有下一條記錄就返回false             while (resultSet.next())             {                 Employee employee = new Employee();                 /**                  *  ResultSet.getXxx()                  *                  *  可接受引數:                  *  columnIndex: 表示第幾列,從1開始                  *  columnLabel: 表示列名                  *                  *  返回值:                  *  根據列索引或者列名返回Xxx型別的物件                  */                 //獲取ResultSet裡儲存的值,並封裝到bean物件中                 employee.setId(resultSet.getInt(1));                 employee.setLastName(resultSet.getString(2));                 employee.setEmail(resultSet.getString(3));                 employee.setGender(resultSet.getString(4));                 employee.setdId(resultSet.getInt(5));                 employeeList.add(employee);             }             for (Employee employee : employeeList) {                 System.out.println(employee.toString());             }         } catch (ClassNotFoundException e) {             e.printStackTrace();         } catch (SQLException e) {             e.printStackTrace();         }finally {             if (connection != null)                 connection.close();//這個異常沒必要捕獲,有需要的時候再捕獲         }     } }

 

結果:

Employee{id=1, lastName='aa', email='[email protected]', gender='1', dId=1001}

Employee{id=2, lastName='bb', email='[email protected]', gender='0', dId=1003}

Employee{id=3, lastName='cc', email='[email protected]', gender='0', dId=1002}

Employee{id=4, lastName='dd', email='[email protected]', gender='1', dId=1001}

Employee{id=5, lastName='ee', email='[email protected]', gender='0', dId=1003}

 

 

Demo 02:

package jdbc;



import com.sun.xml.internal.bind.v2.model.core.ID;

import jdbc.bean.Employee;



import java.sql.*;

import java.util.ArrayList;

import java.util.List;



//這個專門講PreparedStatement

public class JdbcPreparedStatementTeach {



    public static void main(String[] args) throws Exception{

        /**

         * 1. public interface PreparedStatement extends Statement

         *      PreparedStatement是Statement的子介面

         * 2. 所以PreparedStatement和Statement使用方法及其相似

         * 3. PreparedStatement和Statement的區別在於

         *      PreparedStatement支援預處理的sql,即支援用?當做佔位符的sql

         *      Statement物件是使用字串拼接的方式來構造sql語句

         */



        Employee employee1 = selectByIdUseStatement(1);

        Employee employee2 = selectByIdUsePreparedStatement(2);



        System.out.println(employee1);

        System.out.println(employee2);

    }



    public static Employee selectByIdUseStatement(int id) throws SQLException {

        Connection connection = null;

        try {



            //2. 獲取Connection連線

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/teach";



            String user = "root";

            String password = "root";

            connection = DriverManager.getConnection(url, user, password);



            //3. 使用Connection物件獲取Statement或PreparedStatement物件

            Statement statement = connection.createStatement();



            //4. 寫好sql

            //暫時取5條資料

            //Statement物件是使用字串拼接的方式來構造sql語句

            String sql = "select * from tbl_employee where id = " + id;

            

            //5. 使用Statement或PreparedStatement物件執行sql,獲得ResultSet物件

            //ResultSet物件一開始指向的是第0行(其實就是沒有資料)

            ResultSet resultSet = statement.executeQuery(sql);

            resultSet.next();



            //6. 建立一個或多個bean物件

            Employee employee = new Employee();



            employee.setId(resultSet.getInt(1));

            employee.setLastName(resultSet.getString(2));

            employee.setEmail(resultSet.getString(3));

            employee.setGender(resultSet.getString(4));

            employee.setdId(resultSet.getInt(5));



            return  employee;

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            if (connection != null)

                connection.close();//這個異常沒必要捕獲,有需要的時候再捕獲

        }

        return null;

    }



    public static Employee selectByIdUsePreparedStatement(int id) throws SQLException {

        Connection connection = null;

        try {



            //2. 獲取Connection連線

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/teach";



            String user = "root";

            String password = "root";

            connection = DriverManager.getConnection(url, user, password);



            //4. 寫好sql

            //暫時取5條資料

            //PreparedStatement使用方法和Statement基本相似

            //但是PreparedStatement支援使用?當做佔位符

            //等下,再暫停下

            String sql = "select * from tbl_employee where id = ?";



            //獲取PreparedStatement時強制要求傳入一個sql語句

            PreparedStatement preparedStatement = connection.prepareStatement(sql);



            //剛才寫好的sql中有一個佔位符

            /**

             * PreparedStatement的setXxx(int parameterIndex, Xxx x)方法

             * 引數:

             *  1. parameterIndex 引數索引,表示要設定第幾個引數,從1開始計數

             *  2. x ,Xxx型別,要傳入的物件

             */

            preparedStatement.setInt(1,id);



            //5. 使用Statement或PreparedStatement物件執行sql,獲得ResultSet物件

            //發現問題了, PreparedStatement介面過載了executeQuery()方法

            //PreparedStatement提供了一個無參的executeQuery()方法

            //如果傳引數,呼叫的是父介面的那個executeQuery

            //sql是在獲取PreparedStatement物件時傳入的

            //因此在呼叫PreparedStatement物件的executeQuery方法時不需要傳引數

            ResultSet resultSet = preparedStatement.executeQuery();



            resultSet.next();

            //6. 建立一個或多個bean物件

            Employee employee = new Employee();

            employee.setId(resultSet.getInt(1));

            employee.setLastName(resultSet.getString(2));

            employee.setEmail(resultSet.getString(3));

            employee.setGender(resultSet.getString(4));

            employee.setdId(resultSet.getInt(5));



            return  employee;

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally {

            if (connection != null)

                connection.close();//這個異常沒必要捕獲,有需要的時候再捕獲

        }

        return null;

    }

}

 

結果:

Employee{id=1, lastName='aa', email='[email protected]', gender='1', dId=1001}

Employee{id=2, lastName='bb', email='[email protected]', gender='0', dId=1003}

 

 

Demo 03:

public static void main(String[] args) throws Exception{

    /**

     * 1. public interface PreparedStatement extends Statement

     *      PreparedStatement是Statement的子介面

     * 2. 所以PreparedStatement和Statement使用方法及其相似

     * 3. PreparedStatement和Statement的區別在於

     *      PreparedStatement支援預處理的sql,即支援用?當做佔位符的sql

     *      Statement物件是使用字串拼接的方式來構造sql語句

     */



    Employee employee = new Employee(1,"xiaoye","[email protected]","1",1001);

    updateEmployeeUsePreparedStatement(employee);

}



public static void updateEmployeeUsePreparedStatement(Employee employee) throws SQLException {

    //?佔位符不僅可以用在select語句的where裡,還可以用在update的set等地方,這裡就拿update語句舉例

    Connection connection = null;

    try {



        //2. 獲取Connection連線

        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/teach";



        String user = "root";

        String password = "root";

        connection = DriverManager.getConnection(url, user, password);



        //4. 寫好sql

        //暫時取5條資料

        //PreparedStatement使用方法和Statement基本相似

        //但是PreparedStatement支援使用?當做佔位符


        String sql = "update tbl_employee set last_name=?,email=?,gender=?,d_id=? where id = ?";



        //獲取PreparedStatement時強制要求傳入一個sql語句

        PreparedStatement preparedStatement = connection.prepareStatement(sql);



        //剛才寫好的sql中有一個佔位符

        /**

         * PreparedStatement的setXxx(int parameterIndex, Xxx x)方法

         * 引數:

         *  1. parameterIndex 引數索引,表示要設定第幾個引數,從1開始計數

         *  2. x ,Xxx型別,要傳入的物件

         */

        preparedStatement.setString(1,employee.getLastName());

        preparedStatement.setString(2,employee.getEmail());

        preparedStatement.setString(3,employee.getGender());

        preparedStatement.setInt(4,employee.getdId());

        preparedStatement.setInt(5,employee.getId())//這裡方法調錯了



        //5. 使用Statement或PreparedStatement物件執行sql,獲得ResultSet物件

        //發現問題了, PreparedStatement介面過載了executeQuery()方法

        //PreparedStatement提供了一個無參的executeQuery()方法

        //如果傳引數,呼叫的是父介面的那個executeQuery

        //sql是在獲取PreparedStatement物件時傳入的

        //因此在呼叫PreparedStatement物件的executeQuery方法時不需要傳引數

        preparedStatement.execute();

        //暫停下



    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    } catch (SQLException e) {

        e.printStackTrace();

    }finally {

        if (connection != null)

            connection.close();//這個異常沒必要捕獲,有需要的時候再捕獲

    }

}
 

 

原來的資料:

執行後:

可以看到id為1的這行資料已經被更改了

 

總結:

 jdbc查詢操作:
     1. 建立好表對應的類(我們稱為bean),要求每一列對應一個屬性,且資料型別對應上
     2. 建立連線,獲取Connection物件
     3. 使用Connection物件獲取Statement或PreparedStatement物件
     4. 寫好sql
     5. 使用Statement或PreparedStatement執行查詢語句,獲取ResultSet物件
     6. 建一個或多個bean物件
     7. 獲取ResultSet裡儲存的值,並封裝到bean物件中
     8. 關閉連線

 

  1. public interface PreparedStatement extends Statement
         PreparedStatement是Statement的子介面
    2. 所以PreparedStatement和Statement使用方法及其相似
    3. PreparedStatement和Statement的區別在於
          PreparedStatement支援預處理的sql,即支援用?當做佔位符的sql
          Statement物件是使用字串拼接的方式來構造sql語句

 

PreparedStatement的setXxx(int parameterIndex, Xxx x)方法
 引數:
  1. parameterIndex 引數索引,表示要設定第幾個引數,從1開始計數
  2. x ,Xxx型別,要傳入的物件

 


PreparedStatement介面過載了executeQuery()方法
         PreparedStatement提供了一個無參的executeQuery()方法
         如果傳引數,呼叫的是父介面的那個executeQuery
         sql是在獲取PreparedStatement物件時傳入的
         因此在呼叫PreparedStatement物件的executeQuery方法時不需要傳引數

 

ResultSet物件一開始指向的是第0行(其實就是沒有資料)