JDBC:(java database Connection) java資料庫連接。

  • 2021 年 10 月 25 日
  • 筆記

JDBC 指 Java 資料庫連接,是一種標準Java應用編程介面( JAVA API),用來連接 Java 程式語言和廣泛的資料庫。

JDBC連接步驟:

  1.先導入jar包,把jar放入到工程下並 add Libar ay
  2.載入驅動 Class.forName(“com.mysql.jdbc.Driver”);
  3.獲取連接對象 Connection connection=DriverManger.getConnection(url,user,password);
  4.獲取執行sql語句的對象: Statement

1. 如何防止被sql注入

  1.什麼是sql注入 —> sql拼接安全問題

  statement存在sql注入問題 : 因為它的sql字元串拼接

  解決方案 : 使用PrepareStatement來進行sql的預編譯

2.常見的JDBC組件

JDBC 的 API 提供了以下介面和類:

DriverManager :這個類管理一系列資料庫驅動程式。匹配連接使用通訊子協議從 JAVA 應用程式中請求合適的資料庫驅動程式。識別 JDBC 下某個子協議的第一驅動程式將被用於建立資料庫連接。

Driver : 這個介面處理與資料庫伺服器的通訊。你將很少直接與驅動程式互動。相反,你使用 DriverManager 中的對象,它管理此類型的對象。它也抽象與驅動程式對象工作相關的詳細資訊。

Connection : 此介面具有接觸資料庫的所有方法。該連接對象表示通訊上下文,即,所有與資料庫的通訊僅通過這個連接對象進行。

Statement : 使用創建於這個介面的對象將 SQL 語句提交到資料庫。除了執行存儲過程以外,一些派生的介面也接受參數。

ResultSet : 在你使用語句對象執行 SQL 查詢後,這些對象保存從數據獲得的數據。它作為一個迭代器,讓您可以通過它的數據來移動。

SQLException : 這個類處理髮生在資料庫應用程式的任何錯誤。

 

3.程式碼演示

下面是我的程式碼舉例:

1.首先要創建一個後綴為 properties 的文件,(注意必須要寫在src路徑下) 寫入硬編碼,目的是為了程式日後有變動的話直接在這個文件中更改,源程式碼保持不動。

url=jdbc:mysql://localhost:3306/abc?  
serverTimezone=Asia/Shanghai
user=root
password=123@qwe
drivername=com.mysql.cj.jdbc.Driver

//都是以鍵值對的形式,(注意:這裡面不需要在每段程式碼結尾加 ; )
//url = jdbc:mysql://路徑(埠)/庫名?serverTimezone(時區)=Asia(亞洲)/Shanghai
//user=(mysql帳號)
//password=(mysql密碼)
//drivername(這個可以自行定義)=com.mysql.cj.jdbc.Driver(這個路徑是導入jar包的路徑)

 

2.創建實體類  包名命名為 entiy(實體)

 1 public class User3 {
 2     private Integer id;
 3     private String name;
 4     private String password;
 5 
 6     public Integer getId() {
 7         return id;
 8     }
 9 
10     public void setId(Integer id) {
11         this.id = id;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public String getPassword() {
23         return password;
24     }
25 
26     public void setPassword(String password) {
27         this.password = password;
28     }
29 
30     @Override
31     public String toString() {
32         return "User3{" +
33                 "id=" + id +
34                 ", name='" + name + '\'' +
35                 ", password='" + password + '\'' +
36                 '}';
37     }
38 }

3.建立util包,裡面建立BaseDao類

-類作用主要用於將UserDao3類中的重複程式碼進行提取,提高效率;實現程式碼簡潔。

 1  public Connection connection;
 2     public PreparedStatement ps;
 3     public ResultSet resultSet;
 4 
 5     private static String url;
 6     private static String user;
 7     private static String password;
 8     private static String drivername;
 9 
10     static{
11         try {
12         //先建立輸入流 創建properrties對象 載入資源流
13         InputStream  resourceAsStream = BaseDao3.class.getResourceAsStream("/db2.properties");
14         Properties properties = new Properties();
15             properties.load(resourceAsStream);
16             //導入數據
17             url = properties.get("url").toString();
18             user = properties.get("user").toString();
19             password = properties.get("password").toString();
20             drivername=properties.get("drivername").toString();
21             //載入驅動(驅動只需要載入一次就可以了)
22             Class.forName(drivername);
23 
24         } catch (Exception e) {
25             e.printStackTrace();
26         }
27 
28     }
29 
30     public void getconnection(){ //建立連接方法
31         try {
32             connection = DriverManager.getConnection(url,user,password);
33         } catch (Exception throwables) {
34             throwables.printStackTrace();
35         }
36     }
37 
38     public int  change(String sql,Object... arg){ //增刪改方法
39         try {
40             getconnection();
41             ps=connection.prepareStatement(sql);//預編譯
42             for(int index=0;index<arg.length;index++){
43                 ps.setObject(index+1,arg[index]);
44             }
45             int row =ps.executeUpdate(); //執行更新
46             return row;
47         } catch (Exception throwables) {
48             throwables.printStackTrace();
49         }finally{
50             closeAll();
51         }
52         return 0;
53     }
54 
55 
56     public void closeAll() { //關閉連接, 從內往外關閉
57         try {
58             if (resultSet != null) { resultSet.close(); }
59             if (ps != null) { ps.close(); }
60             if (connection != null) { connection.close(); }
61         }catch(Exception e){
62             e.printStackTrace();
63         }
64     }

 

 

4.創建實體類後緊跟要創建實體類Dao, 上面我的實體類名為 user3  那麼Dao類名就可以為 user3Dao

  Dao方法用來建立連接mysql資料庫,實現程式連接資料庫功能。

  裡面寫入方法,需求(增刪改查)

public class UserDao3 extends BaseDao3 { //繼承剛才寫好的BaseDao父類
    //添加數據
    public int insert(User3 user3){
        String a="insert into user (id,name,password) values (?,?,?)";
        return change(a,user3.getId(),user3.getName(),user3.getPassword());
    }

    //使用list遍歷表中數據
    public List<User3> select(){
        List<User3> list =new ArrayList<>();

        try {
            getconnection();
            String a ="select * from user";
            ps=connection.prepareStatement(a);
            resultSet = ps.executeQuery();
            while(resultSet.next()){
                User3 user3 =new User3();
                user3.setId(resultSet.getInt(1));
                user3.setName(resultSet.getString(2));
                user3.setPassword(resultSet.getString(3));
                list.add(user3);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return list;
    }

    public int update(User3 user3){ //修改資料庫表中數據
        String a ="update user set password=? where id=?";
        return change(a,user3.getPassword(),user3.getId());
    }

    public int delete(User3 user3){ //刪除表中數據
        String a = "delete from user where id=?";
        return change(a,user3.getId());
    }
}