數據庫基礎入門(三)——通過JDBC對數據庫進行增刪改查操作


 

何謂JDBC

   JDK提供了一組API,讓我們可以在java程序中連結到網絡上的數據庫,並執行SQL語句返回執行結果,這組API的應用我們通常稱作JDBC技術;相關的API都在包java.sql.*下面。

    Connection對象,則是由java.sql.DriverManager類的靜態方法getConnection(…)得到,一但應用程序中得取一個Connection對象,即應用程序與數據庫創建立了連結。隨後,我們就可以通過操作Connection對象,創建Statement對象以執行sql語句,或從執行結果返回的ResultSet中取得查詢結果。

以下是具體代碼實現:

1)  連接到數據庫:

1
2
3
4
5
6
7
8
9
10
11
12
public Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQ    LException{

     Connection conn = null;

     String url = "jdbc:mysql://localhost:3306/pets";//連接數據庫的URL地址

     String username = "root";//連接數據庫的用戶名

     String password = "123456";//連接數據庫的密碼

     String driver = "com.mysql.jdbc.Driver";

     //加載驅動,然後再實例化驅動對象

     Class.forName(driver).newInstance();

     //建立連接對象

     conn = DriverManager.getConnection(url, username, password);

     return conn;

}

需要注意的是以下的幾個參數,URL:本地用戶localhost 端口號默認爲3306 後面是數據庫的名字。Username默認爲root,密碼就是你設置的數據庫密碼。DriverMySQL的驅動名應寫成(驅動jar包要從www.mysql.org上下載):com.mysql.jdbc.Driver

如果是沒有加載驅動將會出現找不到驅動的錯誤:

找不到驅動.png

2)使用預編譯sql

數據庫處理SQL語句時,需要一個預編譯過程,數據庫可以把一些格式固定的SQL編譯後,存入在其內存池中,再次執行時即直接使用,不再執行預編譯過程,這樣可以有效提高數據庫操作效率;我們可以通過預編譯對象實現,如下代碼示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//添加用戶
   //username password mail添加的用戶信息
   public void addMember(String username,String password,String mail){
     try{
        Connection con = this.getConnection();
        //定義SQL語句
        String sql = "insert into user(username,password,mail) values(?,?,?)";
        //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        //給每一個?佔位符指定數據
        pstmt.setString(1, username);
        pstmt.setString(2, password);
        pstmt.setString(3, mail);
  
        int count = pstmt.executeUpdate();//執行並記錄次數
        
        if(count>0){
           System.out.println("插入數據成功!影響的記錄條數是"+count);
        }else{
           System.out.println("插入數據失敗!");
        }
     }catch(Exception e){
        e.printStackTrace();
     }
}

    每一個問號代表了一個表中的數值。其中的:pstmt.setString(1, username);1代表的是第幾個佔位符,既不能多也不能重複使用。

    連結對象創建成功後,即可通過連結對象創建statement對象,以執行SQL語句。我們可將要執行的SQL語句分爲兩類,一類爲需要返回結果表的select語句;一類爲執行insertupdatedelete操作的語句,因用程序只需要這類語句返回操作所生效的行數即可;對於這兩種SQL操作,Statement在執行時可採用不同的方法,如是select語句,則使用executeQuery(sql)方法返回一個ResultSet對象,其中包含查詢到的數據;如是另外三種,則使用executeUpdate(sql)方法,返回一個int型值,代表語句所影響的行數,如下代碼示例:

1
2
3
4
5
6
7
8
Statement stmt=conn.createStatement();
String deleteSQL="delete from post where id=2";
int t=stmt.executeUpdate(sql);
if(count>0){
                System.out.println("刪除數據成功!影響的記錄條數是"+count);
            }else{
                System.out.println("刪除數據失敗!");
            }

    一下是針對具體項目的完整代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class Petsdb {
     
    public static void main(String[] args) {
        Petsdb db = new Petsdb();
        //查詢
        db.queryMember("昭進");
        //添加
//      db.addMember("昭進","123456","123456");
        //刪除字段
        db.delete_field();
        //增加字段
//      db.add_field();
        //刪除用戶
//      db.delete_user("昭進");
        //修改用戶數據
//      db.update("new昭進", 1);
    }
    /**
     * 獲取鏈接對象
     * @return connection對象
     */
    public Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
        Connection conn = null;
        String url = "jdbc:mysql://localhost:3306/pets";//連接數據庫的URL地址
        String username = "root";//連接數據庫的用戶名
        String password = "123456";//連接數據庫的密碼
        String driver = "com.mysql.jdbc.Driver";
         
        //加載驅動,然後再實例化驅動對象
        Class.forName(driver).newInstance();
        //建立連接對象
        conn = DriverManager.getConnection(url, username, password);
        return conn;
    }
     
    /**
     * 添加用戶
     * @param username用戶名
     * @param password密碼
     * @param mail郵箱
     */
    public void addMember(String username,String password,String mail){
        try{
            Connection con = this.getConnection();
            //定義SQL語句
            String sql = "insert into user(username,password,mail) values(?,?,?)";
            //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
            PreparedStatement pstmt = con.prepareStatement(sql);
             
            //給每一個?佔位符指定數據
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            pstmt.setString(3, mail);
 
            int count = pstmt.executeUpdate();//執行並記錄次數
             
            if(count>0){
                System.out.println("插入數據成功!影響的記錄條數是"+count);
            }else{
                System.out.println("插入數據失敗!");
            }
             
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
    /** 
     * 查詢用戶
     * @param condition 查詢條件
     */
    public void queryMember(String condition){
        try{
            Connection con = this.getConnection();
            //定義SQL語句
            String sql2 = "select * from user where username = ?";
             
//          //獲取拼接SQL的執行對象
//          Statement stmt = con.createStatement();
//          //執行拼接SQL語句返回一個結果集對象
//          ResultSet rs = stmt.executeQuery(sql1);
             
            //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
            PreparedStatement pstmt = con.prepareStatement(sql2);
             
            //給每一個?佔位符指定數據
            pstmt.setString(1, condition);
             
            ResultSet rs = pstmt.executeQuery();//執行
             
            System.out.println("id     username    password    mail");
            while(rs.next()){//檢測是否還有下一條記錄
                int id = rs.getInt("id");
                String username = rs.getString("username");
                String password = rs.getString("password");
                String mail = rs.getString("mail");
                 
                System.out.println(id+"          "+username+"                     "+password+"    "+mail);
            }
             
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
    /**
     * 刪除字段
     */
    public void delete_field(){
        try{
            Connection con = this.getConnection();
            //定義SQL語句
            String sql = "alter table user drop sex";
            //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
            PreparedStatement pstmt = con.prepareStatement(sql);
             
            int count = pstmt.executeUpdate();//執行並記錄次數
             
            //判斷如何執行成功?pstmt.executeUpdate();只返回被影響行數 count=0;
//          if(count>0){
//              System.out.println("刪除字段成功!影響的記錄條數是"+count);
//          }else{
//              System.out.println("刪除字段失敗!"+count);
//          }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
        /**
         * 添加字段  
         */
        public void add_field(){
            try{
                Connection con = this.getConnection();
                //定義SQL語句
                String sql = "alter table user add sex boolean";
                //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
                PreparedStatement pstmt = con.prepareStatement(sql);
                 
                int count = pstmt.executeUpdate();//執行並記錄次數
                 
                //判斷如何執行成功?pstmt.executeUpdate();只返回被影響行數 count=0;
//              if(count>0){
//                  System.out.println("添加字段成功!影響的記錄條數是"+count);
//              }else{
//                  System.out.println("添加字段失敗!"+count);
//              }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
     
    /**
     * 刪除用戶
     * @param username 用戶名
     */
    public void delete_user(String username){
        try{
            Connection con = this.getConnection();
            //定義SQL語句
            String sql = "delete from user where username = ?";
            //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
            PreparedStatement pstmt = con.prepareStatement(sql);
             
            //給每一個?佔位符指定數據
            pstmt.setString(1, username);
             
            int count = pstmt.executeUpdate();//執行並記錄次數
             
            if(count>0){
                System.out.println("刪除數據成功!影響的記錄條數是"+count);
            }else{
                System.out.println("刪除數據失敗!");
            }
             
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
    /**
     * 修改用戶資料
     * @param username用戶名
     * @param id用戶id
     */
    public void update(String username,int id){
        try{
             
            Connection con = this.getConnection();
            //定義SQL語句
            String sql = "update user set username = ? where id = ?";
            //獲取預編譯SQL執行對象,同時檢測數據庫中是否已經存在該SQL語句,如果存在,不存入SQL語句,如果不存在則存入SQL語句
            PreparedStatement pstmt = con.prepareStatement(sql);
            //給每一個?佔位符指定數據
            pstmt.setString(1, username);
            pstmt.setInt(2, id);
             
            int count = pstmt.executeUpdate();//執行並記錄次數
             
            if(count>0){
                System.out.println("修改數據成功!影響的記錄條數是"+count);
            }else{
                System.out.println("修改數據失敗!");
            }
             
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
}

 

 

 

發佈了54 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章