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. 關閉連線
- 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行(其實就是沒有資料)