JDBC API 允許用戶訪問任何形式的表格數(shù)據(jù),尤其是存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。
執(zhí)行流程:
•連接數(shù)據(jù)源,如:數(shù)據(jù)庫。
•為數(shù)據(jù)庫傳遞查詢和更新指令。
•處理數(shù)據(jù)庫響應(yīng)并返回的結(jié)果。
JDBC 架構(gòu)
分為雙層架構(gòu)和三層架構(gòu)。
雙層
作用:此架構(gòu)中,Java Applet 或應(yīng)用直接訪問數(shù)據(jù)源。
條件:要求 Driver 能與訪問的數(shù)據(jù)庫交互。
機制:用戶命令傳給數(shù)據(jù)庫或其他數(shù)據(jù)源,隨之結(jié)果被返回。
部署:數(shù)據(jù)源可以在另一臺機器上,用戶通過網(wǎng)絡(luò)連接,稱為 C/S配置(可以是內(nèi)聯(lián)網(wǎng)或互聯(lián)網(wǎng))。
三層
側(cè)架構(gòu)特殊之處在于,引入中間層服務(wù)。
流程:命令和結(jié)構(gòu)都會經(jīng)過該層。
吸引:可以增加企業(yè)數(shù)據(jù)的訪問控制,以及多種類型的更新;另外,也可簡化應(yīng)用的部署,并在多數(shù)情況下有性能優(yōu)勢。
歷史趨勢: 以往,因性能問題,中間層都用 C 或 C++ 編寫,隨著優(yōu)化編譯器(將 Java 字節(jié)碼 轉(zhuǎn)為 高效的 特定機器碼)和技術(shù)的發(fā)展,如EJB,Java 開始用于中間層的開發(fā)這也讓 Java 的優(yōu)勢突顯出現(xiàn)出來,使用 Java 作為服務(wù)器代碼語言,JDBC隨之被重視。
JDBC 編程步驟
加載驅(qū)動程序:
1
2
3
4
5
|
Class.forName(driverClass) //加載MySql驅(qū)動 Class.forName( "com.mysql.jdbc.Driver" ) //加載Oracle驅(qū)動 Class.forName( "oracle.jdbc.driver.OracleDriver" ) |
獲得數(shù)據(jù)庫連接:
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc", "root", "root");
創(chuàng)建Statement\PreparedStatement對象:
conn.createStatement();
conn.prepareStatement(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
|
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DbUtil { public static final String URL = "jdbc:mysql://localhost:3306/imooc" ; public static final String USER = "liulx" ; public static final String PASSWORD = "123456" ; public static void main(String[] args) throws Exception { //1.加載驅(qū)動程序 Class.forName( "com.mysql.jdbc.Driver" ); //2. 獲得數(shù)據(jù)庫連接 Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); //3.操作數(shù)據(jù)庫,實現(xiàn)增刪改查 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT user_name, age FROM imooc_goddess" ); //如果有數(shù)據(jù),rs.next()返回true while (rs.next()){ System.out.println(rs.getString( "user_name" )+ " 年齡:" +rs.getInt( "age" )); } } } |
增刪改查
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
|
public class DbUtil { public static final String URL = "jdbc:mysql://localhost:3306/imooc" ; public static final String USER = "liulx" ; public static final String PASSWORD = "123456" ; private static Connection conn = null ; static { try { //1.加載驅(qū)動程序 Class.forName( "com.mysql.jdbc.Driver" ); //2. 獲得數(shù)據(jù)庫連接 conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static Connection getConnection(){ return conn; } } //模型 package liulx.model; import java.util.Date; public class Goddess { private Integer id; private String user_name; private Integer sex; private Integer age; private Date birthday; //注意用的是java.util.Date private String email; private String mobile; private String create_user; private String update_user; private Date create_date; private Date update_date; private Integer isDel; //getter setter方法。。。 } //---------dao層-------------- package liulx.dao; import liulx.db.DbUtil; import liulx.model.Goddess; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class GoddessDao { //增加 public void addGoddess(Goddess g) throws SQLException { //獲取連接 Connection conn = DbUtil.getConnection(); //sql String sql = "INSERT INTO imooc_goddess(user_name, sex, age, birthday, email, mobile," + "create_user, create_date, update_user, update_date, isdel)" + "values(" + "?,?,?,?,?,?,?,CURRENT_DATE(),?,CURRENT_DATE(),?)" ; //預(yù)編譯 PreparedStatement ptmt = conn.prepareStatement(sql); //預(yù)編譯SQL,減少sql執(zhí)行 //傳參 ptmt.setString( 1 , g.getUser_name()); ptmt.setInt( 2 , g.getSex()); ptmt.setInt( 3 , g.getAge()); ptmt.setDate( 4 , new Date(g.getBirthday().getTime())); ptmt.setString( 5 , g.getEmail()); ptmt.setString( 6 , g.getMobile()); ptmt.setString( 7 , g.getCreate_user()); ptmt.setString( 8 , g.getUpdate_user()); ptmt.setInt( 9 , g.getIsDel()); //執(zhí)行 ptmt.execute(); } public void updateGoddess(){ //獲取連接 Connection conn = DbUtil.getConnection(); //sql, 每行加空格 String sql = "UPDATE imooc_goddess" + " set user_name=?, sex=?, age=?, birthday=?, email=?, mobile=?," + " update_user=?, update_date=CURRENT_DATE(), isdel=? " + " where id=?" ; //預(yù)編譯 PreparedStatement ptmt = conn.prepareStatement(sql); //預(yù)編譯SQL,減少sql執(zhí)行 //傳參 ptmt.setString( 1 , g.getUser_name()); ptmt.setInt( 2 , g.getSex()); ptmt.setInt( 3 , g.getAge()); ptmt.setDate( 4 , new Date(g.getBirthday().getTime())); ptmt.setString( 5 , g.getEmail()); ptmt.setString( 6 , g.getMobile()); ptmt.setString( 7 , g.getUpdate_user()); ptmt.setInt( 8 , g.getIsDel()); ptmt.setInt( 9 , g.getId()); //執(zhí)行 ptmt.execute(); } public void delGoddess(){ //獲取連接 Connection conn = DbUtil.getConnection(); //sql, 每行加空格 String sql = "delete from imooc_goddess where id=?" ; //預(yù)編譯SQL,減少sql執(zhí)行 PreparedStatement ptmt = conn.prepareStatement(sql); //傳參 ptmt.setInt( 1 , id); //執(zhí)行 ptmt.execute(); } public List<Goddess> query() throws SQLException { Connection conn = DbUtil.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT user_name, age FROM imooc_goddess" ); List<Goddess> gs = new ArrayList<Goddess>(); Goddess g = null ; while (rs.next()){ g = new Goddess(); g.setUser_name(rs.getString( "user_name" )); g.setAge(rs.getInt( "age" )); gs.add(g); } return gs; } public Goddess get(){ Goddess g = null ; //獲取連接 Connection conn = DbUtil.getConnection(); //sql, 每行加空格 String sql = "select * from imooc_goddess where id=?" ; //預(yù)編譯SQL,減少sql執(zhí)行 PreparedStatement ptmt = conn.prepareStatement(sql); //傳參 ptmt.setInt( 1 , id); //執(zhí)行 ResultSet rs = ptmt.executeQuery(); while (rs.next()){ g = new Goddess(); g.setId(rs.getInt( "id" )); g.setUser_name(rs.getString( "user_name" )); g.setAge(rs.getInt( "age" )); g.setSex(rs.getInt( "sex" )); g.setBirthday(rs.getDate( "birthday" )); g.setEmail(rs.getString( "email" )); g.setMobile(rs.getString( "mobile" )); g.setCreate_date(rs.getDate( "create_date" )); g.setCreate_user(rs.getString( "create_user" )); g.setUpdate_date(rs.getDate( "update_date" )); g.setUpdate_user(rs.getString( "update_user" )); g.setIsDel(rs.getInt( "isdel" )); } return g; } } |