jdbc的定義
jdbc(java data base connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行sql語句的java api,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用java語言編寫的類和接口組成。jdbc提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
jdbc的基本連接
簡單的說就是加載驅(qū)動,建立連接,然后進(jìn)行查詢和刪除等語句的操作,在java中提供了java.sql的jar包,不過我現(xiàn)在用的是mysql的連接和實(shí)例,在這里基本在本地的服務(wù)器都是用到下面這個語句。
1
2
3
4
5
|
class .forname( "com.mysql.jdbc.driver" ); string url= "jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8" ; string user= "root" ; string password= "root" ; |
加載和建立連接,這就是基本的一個語法結(jié)構(gòu),在連接數(shù)據(jù)庫當(dāng)然還有其他的屬性可以設(shè)置,比如說最大的連接數(shù)了,和如何建立連接池,都可以在配置中用到,這里我就簡單的介紹如何連接,后面跟的是這個連接的字符集,防止出現(xiàn)亂碼。
簡單的增刪改查
簡單的增刪改查是每個開發(fā)者都會遇到的,畢竟我們整個系統(tǒng)真正的業(yè)務(wù)所在也是這幾個簡單的邏輯,但是在關(guān)系的連接和耦合性下就會變成復(fù)雜百倍的系統(tǒng),所以要懂得基本的就可以窺見更大系統(tǒng)的構(gòu)建了,所以我現(xiàn)在要分析的只是基本的功能實(shí)現(xiàn)。
首先連接好數(shù)據(jù)庫之后,那就是創(chuàng)建查詢語句,這里用到的是statment這個關(guān)鍵詞,下面是代碼的基本實(shí)現(xiàn)。
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
|
package dbtest; import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list; public class dbtest { public static void main(string[] args) { employee employee1 = new employee(); employee1.setempno( 555 ); employee1.setename( "hakly" ); employee1.setsal( 5400 ); employee1.sethiredate( new date()); addemployee(employee1); list<employee>employees=getemployees(); for (employee employee:employees){ system.out.println(employee); } employee employee = new employee(); employee.setempno( 999 ); employee.setename( "jack" ); employee.setsal( 5000 ); employee.sethiredate( new date()); addemployee(employee); } public static list<employee> getemployees() { resultset rs= null ; connection conn= null ; statement stat= null ; list<employee> employees= new arraylist<employee>(); try { class .forname( "com.mysql.jdbc.driver" ); string url= "jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8" ; string user= "root" ; string password= "root" ; conn= drivermanager.getconnection(url,user,password); stat=conn.createstatement(); string sql= "select * from emp" ; rs=stat.executequery(sql); employee employee= null ; while (rs.next()){ employee= new employee(); employee.setempno(rs.getint( "empno" )); employee.setename(rs.getstring( "ename" )); employee.setsal(rs.getdouble( "sal" )); employee.sethiredate(rs.getdate( "hiredate" )); employees.add(employee); } } catch (exception e ){ e.printstacktrace(); } finally { try { if (conn!= null ){ conn.close(); } } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } return employees; } public static void addemployee(employee employee) { connection conn = null ; statement stat = null ; // 1.注冊驅(qū)動程序 try { class .forname( "com.mysql.jdbc.driver" ); // 2.建立連接 string url = "jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8" ; string user = "root" ; string password = "root" ; conn = drivermanager.getconnection(url, user, password); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd" ); string sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getempno() + ",'" + employee.getename() + "'," + employee.getsal() + ",'" + sdf.format(employee.gethiredate()) + "')" ; // 4.處理執(zhí)行結(jié)果 int i = stat.executeupdate(sql); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 try { if (conn != null ) { conn.close(); } } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } public static void updateemployee(employee employee) { connection conn = null ; statement stat = null ; // 1.注冊驅(qū)動程序 try { class .forname( "com.mysql.jdbc.driver" ); // 2.建立連接 string url = "jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8" ; string user = "root" ; string password = "root" ; conn = drivermanager.getconnection(url, user, password); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd" ); string sql = "update emp set ename='" +employee.getename()+ "empno" +employee.getempno()+ "sal" +employee.getsal(); // 4.處理執(zhí)行結(jié)果 int i = stat.executeupdate(sql); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 try { if (conn != null ) { conn.close(); } } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } } |
這里的代碼很繁瑣,但是沒辦法,為了更清新一點(diǎn)的去了解,這個過程是必須的,然后接下來就是進(jìn)行簡單的優(yōu)化,雖然代碼還是差不多,但是感覺上會更加簡潔了 ,這里就要建立一個工具類了代碼如下
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
|
package dbtest; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception; public class jdbcutil { static string url = "jdbc:mysql://localhost:3306/xxx?useunicode=true&characterencoding=utf-8" ; static string user = "root" ; static string password = "root" ; static { try { class .forname( "com.mysql.jdbc.driver" ); } catch (classnotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } } public static connection getconnection() throws sqlexception{ string url = "jdbc:mysql://localhost:3306/test2?useunicode=true&characterencoding=utf-8" ; string user = "root" ; string password = "root" ; return drivermanager.getconnection(url, user, password); } public static void free(connection conn){ try { if (conn != null ) { conn.close(); } } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); } } } |
在這里,把數(shù)據(jù)庫連接和異常處理,等工作都及合成一個工具類,然后再主函數(shù)調(diào)用就可以了,這就是面向?qū)ο蟮囊粋€體現(xiàn),當(dāng)然還是會分析下關(guān)于主類的代碼,要不然就太過于空洞了,下面要分析的主類代碼如下
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
|
package com.niit.jdbc; import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.text.parseexception; import java.text.simpledateformat; import java.util.arraylist; import java.util.date; import java.util.list; public class employeedao1 { public static void main(string[] args) throws parseexception { list<employee> employees=getemployees(); for (employee employee:employees){ system.out.println(employee); } /*employee employee = new employee(); employee.setempno(9999); employee.setename("tom"); employee.setsal(6000); simpledateformat sdf=new simpledateformat("yyyy-mm-dd"); employee.sethiredate(sdf.parse("2015-07-23")); //addemployee(employee); //updateemployee(employee); deleteemployee(9999);*/ } public static list<employee> getemployees() { connection conn = null ; statement stat = null ; resultset rs = null ; list<employee> employees = new arraylist<employee>(); // 1.注冊驅(qū)動程序 try { //2.獲取連接 conn=jdbcutil.getconnection(); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); string sql = "select * from emp" ; // 4.處理執(zhí)行結(jié)果 rs = stat.executequery(sql); employee employee = null ; while (rs.next()) { employee = new employee(); employee.setempno(rs.getint( "empno" )); employee.setename(rs.getstring( "ename" )); employee.setsal(rs.getdouble( "sal" )); employee.sethiredate(rs.getdate( "hiredate" )); employees.add(employee); } } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 jdbcutil.free(conn); } return employees; } public static void addemployee(employee employee) { connection conn = null ; statement stat = null ; // 1.注冊驅(qū)動程序 try { //2.獲取連接 conn=jdbcutil.getconnection(); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd" ); string sql = "insert into emp(empno,ename,sal,hiredate) values(" + employee.getempno() + ",'" + employee.getename() + "'," + employee.getsal() + ",'" + sdf.format(employee.gethiredate()) + "')" ; // 4.處理執(zhí)行結(jié)果 int i = stat.executeupdate(sql); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 jdbcutil.free(conn); } } public static void updateemployee(employee employee) { connection conn = null ; statement stat = null ; // 1.注冊驅(qū)動程序 try { //2.獲取連接 conn=jdbcutil.getconnection(); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd" ); string sql = "update emp set ename='" + employee.getename() + "',sal=" + employee.getsal() + ",hiredate='" + sdf.format(employee.gethiredate()) + "' where empno=" + employee.getempno(); // 4.處理執(zhí)行結(jié)果 int i = stat.executeupdate(sql); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 jdbcutil.free(conn); } } public static void deleteemployee( int empno) { connection conn = null ; statement stat = null ; // 1.注冊驅(qū)動程序 try { //2.獲取連接 conn=jdbcutil.getconnection(); // 3.創(chuàng)建執(zhí)行語句,發(fā)送sql命令 stat = conn.createstatement(); simpledateformat sdf = new simpledateformat( "yyyy-mm-dd" ); string sql = "delete from emp where empno=" +empno; // 4.處理執(zhí)行結(jié)果 int i = stat.executeupdate(sql); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } finally { // 5.關(guān)閉資源 jdbcutil.free(conn); } } } |
這樣看上去就比較清晰和明了,不用分割開來去看代碼,只要調(diào)用到那個累才去照這個類的方法,這樣就能夠更加有利于檢查和排錯,維護(hù)的間接性的一個軟件的奮斗的目標(biāo),雖然只是簡單的優(yōu)化,卻能夠減輕了我們寫代碼和維護(hù)的成本。
總結(jié)
通過本次編碼,對面向?qū)ο蟮木幊痰拈_發(fā)有更加清晰的了解,當(dāng)然對重構(gòu)和優(yōu)化的重要性有更深的了解,在這個軟件里我學(xué)會的不僅是代碼的書寫,還學(xué)會了代碼的重構(gòu)不僅需要不斷的提煉,還需要對代碼的細(xì)微的觀察。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/lxh5431/article/details/52443417