jdbc總結

轉載於:http://ask.csdn.net/questions/274857?sort=votes_count

1. JDBC的簡介

1.1 jdbc:Java DataBase Connectivity,Java數據庫的鏈接html

1.2 好比有一臺電腦,想在電腦上安裝顯卡,須要顯卡的驅動,由顯卡生產廠商提供java

1.3 要想使用java對數據庫進行操做,須要使用由數據庫提供的數據庫驅動mysql

1.4 一個程序,使用java操做數據庫,掌握java代碼,出了掌握java代碼以外,須要掌握數據庫驅動的代碼。程序員

可是咱們有不少的數據庫,好比mysql、oracle,對於程序員來講,須要掌握每種數據庫的代碼,對於程序員來講壓力很大sql

1.5 sun公司針對這種狀況,開發出一套標準接口,各個數據庫只須要實現這個藉口就能夠了,程序員只須要掌握這套藉口就能夠了,這套標準的藉口就是jdbc數據庫

1.6 若是想要使用jdbc對數據庫進行操做,首先安裝數據庫的驅動,不一樣的數據庫提供驅動使用jar的形式提供,須要把jar包房在項目裏面,至關於安裝了數據庫的驅動oracle

1.7 導入jar到項目中(使用開發者工具myeclipse10.x版本)eclipse

· 首先建立一個文件夾lib,把jar包複製到lib裏面,選中jar包右鍵點擊build path -- add to build path,工具

當jar包前面的圖標變成一個「小奶品」圖標,表示導入jar成功ui

2. JDBC的入門案例

2.1 使用jdbc對數據庫進行操做步驟是固定的

2.1.1 使用到的類和接口

DriverManager

Connection

Statement

ResultSet

2.2 jdbc的操做步驟

(1)加載數據庫的驅動

DriveManager裏面的registerDriver(Driver driver)

(2)建立與數據庫的鏈接

DriverManager裏面getConnection(String url, String user, String password)

(3)編寫sql語句

(4)執行sql語句

Statement裏面executeQuery(String sql)

(5)釋放資源(關閉鏈接)

2.3 使用jdbc實現查詢的操做

2.3.1 代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) throws Exception {
     //加載驅動
     DriverManager.registerDriver(new Driver());
     //建立鏈接
     Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdb2" , "root" , "root" );
     //編寫sql
     String sql = "select * from user" ;
     //執行sql
     //獲得statement
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql);
     //遍歷結果集獲得每條記錄
     while(rs. next ()) {
         int id = rs.getInt( "id" );
         String username = rs.getString( "username" );
         int chinese = rs.getInt( "chinese" );
         int english = rs.getInt( "english" );
         System. out .println(id+ " :: " +username+ " :: " +chinese+ " :: " +english);
     }
     //釋放資源
     rs. close ();
     stmt. close ();
     conn. close ();
}

 

 

3. jdbc的DriverManager對象

3.1 在java.sql包裏面

3.2 加載數據庫驅動

registerDriver(Driver driver):參數是數據庫驅動,這個驅動是由數據庫提供的

(1)這個方法在實際開發中,通常是不使用的,由於這個方法會加載驅動兩次

在源代碼中,加載了一次Driver

(2)通常在開發中使用反射的方式加載數據庫的驅動

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

3.3 獲得數據庫的鏈接

getConnection(Strring url, String user, String password),返回Connection

· 有三個參數:

(1)url:表示要鏈接的數據庫

寫法:jdbc:mysql://數據庫的ip:數據庫的端口號/鏈接的數據庫的名稱

示例:jdbc:mysql://localhost:3306/testdb1

簡寫的方式:jdbc:mysql:///testdb1(使用範圍:鏈接的數據庫是本機,端口是3306)

(2)表示鏈接數據庫的用戶名

(3)表示鏈接數據庫的用戶密碼

4. jdbc的Connection對象

4.1 表明數據庫的鏈接,是接口,在java.sql包裏面

4,.2 建立Statement對象:Statement createStatement()

4.3 建立預編譯對象PreparedStatement prepareStatement(String sql)

5. jdbc的Statement對象

5.1 執行sql的對象,接口,在java.sql包裏面

5.2 執行查詢操做方法

ResultSet executeQuery(String sql) , 返回查詢的結果集

5.3 執行增長 修改 刪除的方法

int executeUpdate(String sql),返回成功的記錄數

5.4 執行sql語句的方法

boolean execute(String sql),返回是布爾類型,若是執行的是查詢的操做返回true,不然返回false

5.5 執行批處理的方法

addBatch(String sql) :把多個sql語句放到批處理裏面

int[] executeBatch() :執行批處理裏面的全部的sql

6. jdbc的ResultSet對象

6.1 表明查詢以後返回的結果,藉口,在java.sql包裏面相似於使用select語句查詢出來的表格

6.2 遍歷結果集 next()

6.3 獲得數據的具體指

· 若是是String類型,使用getString("字段的名稱");

· 若是是int類型,使用getInt("字段的名稱");

· 若是是不知道的類型,使用getObject("字段的名稱");

6.4 結果集的遍歷方式

· 在最開始的時候,指向第一行以前,當執行了next方法以後,一行一行的向下進行遍歷,在默認的狀況下,只能向下,不能向上。遍歷出來的結果也是不能修改的

7. jdbc的釋放資源

7.1 關閉的原則:誰最早打開,誰最後關閉

7.2 關閉資源的規範的寫法

 

?
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
finally {
     //釋放資源
     if(rs != null ) {
         try {
             rs. close ();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         rs = null ;
     }
     
     if(stat != null ) {
         try {
             stat. close ();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         stat = null ;
     }
     
     if(conn != null ) {
         try {
             conn. close ();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         conn = null ;
     }          
}

 

8. 使用jdbc進行crud操做:代碼示例

?
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
import java.sql. Connection ;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class TestJDBC1 {
 
     /**
      * 使用jdbc完成數據庫的查詢和增長的操做
      * @param args
      */
     public static void main(String[] args) {
//      addUser(); //添加
//      selectUser();//查詢
//      updateUser();//修改
         dropUser();//刪除
     }
     public static void addUser() {
         Connection conn = null ;
         Statement stat = null ;
         try {
             Class.forName( "com.mysql.jdbc.Driver" );
             conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdb1" , "root" , "root" );
             
             String sql = "insert into user values(null,'sunquan','123')" ;
             
             stat = conn.createStatement();
             stat.executeUpdate(sql);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if(stat!= null ) {
                 try {
                     stat. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 stat = null ;
             }
             if(conn!= null ) {
                 try {
                     conn. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 conn = null ;
             }
         }
     }
 
     //查詢 user 表裏, name =liubei的人的
     public static void selectUser() {
         Connection conn = null ;
         Statement stat = null ;
         ResultSet rs = null ;
         try {
             //加載驅動
             Class.forName( "com.mysql.jdbc.Driver" );
             //建立鏈接
             conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdb1" , "root" , "root" );
             //寫sql語句
             String sql = "select * from user where name='liubei'" ;
             //執行sql
             stat = conn.createStatement();
             rs = stat.executeQuery(sql);
             while(rs. next ()) {
                 int id = rs.getInt( "id" );
                 String name = rs.getString( "name" );
                 String password = rs.getString( "password" );
                 
                 System. out .println(id+ " " + name + " " + password );
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             
             //關閉資源
             if(rs!= null ) {
                 try {
                     rs. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 rs = null ;
             }
             if(stat!= null ) {
                 try {
                     stat. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 stat = null ;
             }
             if(conn!= null ) {
                 try {
                     conn. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 conn= null ;
             }
         }
         
     }
     
     //用jdbc實現刪除操做
     //把id=5的小夥伴刪了
     public static void dropUser() {
         Connection conn = null ;
         Statement stat = null ;
         try {
             //加載驅動,建立鏈接
             Class.forName( "com.mysql.jdbc.Driver" );
             conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdb1" , "root" , "root" );
             
             //編寫sql語句,執行sql
             String sql = "delete from user where id=5" ;
             stat = conn.createStatement();
             stat.executeUpdate(sql);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if(stat!= null ) {
                 try {
                     stat. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 stat = null ;
             }
             
             if(conn!= null ) {
                 try {
                     conn. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 conn = null ;
             }
         }
     }
     
     //用jdbc實現修改操做
     //把id=5的, name =caocao, password =321
     public static void updateUser() {
         Connection conn = null ;
         Statement stat = null ;
         try {
             Class.forName( "com.mysql.jdbc.Driver" );
             conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdb1" , "root" , "root" );
             
             String sql = "update user set name='caocao',password='321' where id=5" ;
             
             stat = conn.createStatement();
             stat.executeUpdate(sql);
         } catch(Exception e) {
             e.printStackTrace();
         } finally {
             if(stat!= null ) {
                 try {
                     stat. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 stat = null ;
             }
             if(conn!= null ) {
                 try {
                     conn. close ();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
                 conn = null ;
             }
         }
     }
}


8. jdbc工具類的封裝

 

8.1 當在不少的類裏面有相同的代碼,能夠把相同的代碼提取到一個類裏面,在類裏面直接調用工具類裏面的方法實現

8.2 在jdbc實現crud操做的代碼裏面,首先獲得數據庫鏈接,和釋放資源的代碼是重複的,因此能夠進行封裝

8.3 能夠把數據庫的一些信息,寫到配置文件裏面,在工具類讀取配置文件獲得內容

通常使用properties格式文件做爲存儲數據庫信息的文件。

· properties文件示例:

drivername=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/testdb1

有兩種方式讀取配置文件:

(1)使用properties類:代碼示例:

 

?
1
2
3
4
5
6
7
8
9
10
//建立properties對象
Properties p = new Properties();
//文件的輸入流
InputStream in = new FileInputStream( "src/db.properties" );
//把文件的輸入流放到對象裏面
p. load ( in );
String drivername = p.getProperty( "drivername" );
String url = p.getProperty( "url" );
String username = p.getProperty( "username" );
String password = p.getProperty( "password" );

(2)使用ResourceBundle類

 

· 使用範圍:首先讀取的文件格式須要時properties,文件須要放到src目錄下

· 代碼示例:

 

?
1
2
3
4
String drivername = ResourceBundle.getBundle( "db" ).getString( "drivername" );
String url = ResourceBundle.getBundle( "db" ).getString( "url" );
String username = ResourceBundle.getBundle( "db" ).getString( "username" );
String password = ResourceBundle.getBundle( "db" ).getString( "password" );

 

8.4 綜上所述,將加載驅動,獲取鏈接,關閉資源的代碼封裝起來

· 代碼示例:

?
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
import java.sql. Connection ;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
 
public class JdbcUtils {
     
     public static String driver;
     public static String url;
     public static String name ;
     public static String pass;
     
     //讀取properties配置文件
     static {
         //ResouceBundle侷限性,須要文件的後綴是properties且放在src目錄下
         ResourceBundle rb = ResourceBundle.getBundle( "db" );
         driver = rb.getString( "driver" );
         url = rb.getString( "url" );
         name = rb.getString( "username" );
         pass = rb.getString( "password" );
     }
     
     //加載驅動,建立鏈接
     public static Connection getConnection() throws Exception {
         Class.forName( "com.mysql.jdbc.Driver" );
         Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/day05" , "root" , "root" );
         return conn;
     }
     
     //關閉資源
     public static void closeConnection( Connection conn, Statement stat, ResultSet rs) {
         if(rs!= null ) {
             try {
                 rs. close ();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
             rs= null ;
         }
         
         if(stat!= null ) {
             try {
                 stat. close ();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
             stat = null ;
         }
         
         if(conn!= null ) {
             try {
                 conn. close ();
             } catch (SQLException e) {
                 e.printStackTrace();
             }
             conn = null ;
         }
     }
}

 

9. sql的注入和防止

9.1 模擬登錄的效果

(1)登錄的實現步驟:

· 首先輸入用戶名和密碼

· 第二,拿到輸入的用戶名和密碼,到數據庫裏面進行查詢,若是用戶名和密碼都正確,才表示登錄成功

· 可是若是用戶名和密碼,有一個是錯誤的,表示登陸失敗

9.2 演示sql的注入

· 在登錄的時候,用戶名裏面輸入bbb,密碼裏面輸入111 or '1=1'。

這時在sql語句裏面會是這樣的:

select * from user where id='bbb' and password = '111' or '1=1';

這時會把用戶輸入的內容當作sql的查詢條件,二不是做爲整個用戶名或者密碼

9.3 防止sql的注入

(1)使用PreparedStatement預編譯對象防止sql注入

(2)建立PreparedStatement對象preparedStatement(String sql)

(3)PreparedStatement藉口的父接口:Statement
(4)什麼是預編譯?

參數在sql語句以後傳入,會輸入的項目做爲一整個參數,而不是字符串拼接的形式

(5)步驟:

· 第一步:加載驅動,建立數據庫鏈接

· 第二步,編寫sql

· 第三步,須要對sql進行預編譯

· 第四步,向sql裏面設置參數

· 第五步,執行sql

· 第六步,釋放資源

(6)代碼示例

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//使用工具類獲得數據庫的鏈接
conn = JdbcUtils.getConnection();
//編寫sql
String sql = "select * from user where username=? and password=?" ;
//對sql進行預編譯
psmt = conn.prepareStatement(sql);
//設置參數
psmt.setString(1, username);
psmt.setString(2, password );
//執行sql
rs = psmt.executeQuery();
if(rs. next ()) {
     System. out .println( "login success" );
} else {
     System. out .println( "fail" );
}

 

 

10. 完整代碼示例:

 

?
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
import java.sql. Connection ;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
import utils.JdbcUtils;
 
/*
建立的表:
create table user(
id int primary key auto_increment,
username varchar(40),
password varchar(40)
);
insert into user values(null,'zhaoyun','123');
insert into user values(null,'caocao','123');
insert into user values(null,'guanyu','123');
insert into user values(null,'zhangfei','123');
insert into user values(null,'liubei','123');
  */
public class Test {
 
     public static void main(String[] args) {
         selectUser(3);
//      addUser(0, "huangzhong" , "666" );//0能夠替代 null
//      updateUser(9, "sunquan" , "234" );
//      dropUser( "huangzhong" );
     }
     
     //預編譯的方式查詢數據
     //根據id的條件查詢
     public static void selectUser( int id) {
         Connection conn = null ;
         PreparedStatement pre = null ;
         ResultSet rs = null ;
         try {
             //獲取鏈接
             conn = JdbcUtils.getConnection();
             
             String sql = "select * from user where id=?" ;
             //預編譯sql語句
             pre = conn.prepareStatement(sql);
             pre.setInt(1, id);
             
             //執行sql語句
             rs = pre.executeQuery();
             while(rs. next ()) {
                 String username = rs.getString( "username" );
                 String password = rs.getString( "password" );
                 
                 System. out .println(id+ " :: " +username+ " :: " + password );
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             JdbcUtils.closeConnection(conn, pre, rs);
         }
     }
     
     //預編譯的方式添加
     //添加一個username=huangzhong, password =666的 user
     public static void addUser( int id,String username,String password ){
         Connection conn = null ;
         PreparedStatement pre = null ;
         try {
             //getConnection
             conn = JdbcUtils.getConnection();
             //sql
             String sql = "insert into user values(?,?,?)" ;
             //pre
             pre = conn.prepareStatement(sql);
             //setString
             pre.setInt(1, id);
             pre.setString(2, username);
             pre.setString(3, password );
             // execute
             int rows = pre.executeUpdate();
             if( rows >0) {
                 System. out .println( "sucess" );
             } else {
                 System. out .println( "fali" );
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             // close
             JdbcUtils.closeConnection(conn, pre, null );
         }
     }
     
     //use PreparedStatement
     // delete from user where username= "huangzhong"
     public static void dropUser(String username) {
         Connection conn = null ;
         PreparedStatement pre = null ;
         try {
             //getConnection
             conn = JdbcUtils.getConnection();
             //edit sql
             String sql = "delete from user where username=?" ;
             //PreparedStatement
             pre = conn.prepareStatement(sql);
             // set value
             pre.setString(1, username);
             // execute sql
             int rows = pre.executeUpdate();
             if( rows >0) {
                 System. out .println( "success" );
             } else {
                 System. out .println( "fail" );
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             // close Connection
             JdbcUtils.closeConnection(conn, pre, null );
         }
     }
     
     //使用預編譯的方式修改用戶
     //修改id=9的 user name =sunquan, password =234
     public static void updateUser( int id,String username,String password ) {
         Connection conn = null ;
         PreparedStatement pre = null ;
         try {
             //getConn
             conn = JdbcUtils.getConnection();
             //sql
             String sql = "update user set username=?,password=? where id=?" ;
             //preparedStatement
             pre = conn.prepareStatement(sql);
             //setString
             pre.setString(1, username);
             pre.setString(2, password );
             pre.setInt(3, id);
             // execute
             int rows = pre.executeUpdate();
             if( rows >0) {
                 System. out .println( "success" );
             } else {
                 System. out .println( "fail" );
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             // close
             JdbcUtils.closeConnection(conn, pre, null );
         }
     }
}
相關文章
相關標籤/搜索