我們首先看下BASEJDBC的寫法實(shí)例:
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
|
package com.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mysql.jdbc.Driver; public class BaseJDBC { // 表示你要操作的是哪種類型的數(shù)據(jù)庫 private final String DRIVER = "com.mysql.jdbc.Driver" ; // 表示你要連接的是哪一臺(tái)電腦的服務(wù)器端口號(hào)是多少數(shù)據(jù)庫的名字是什么 private final String URL = "jdbc:mysql://localhost:3306/zzy" ;//有時(shí)這里需要加上字符集 // 登錄數(shù)據(jù)庫的用戶名 private final String USERNMAE = "root" ; // 登錄數(shù)據(jù)庫的密碼 private final String PASSWORD = "root" ; /** * 注冊(cè)驅(qū)動(dòng) 獲取連接 * * @return */ public Connection getConnection() { try { //Driver d=new Driver(); // 注冊(cè)驅(qū)動(dòng):反射(是一項(xiàng)很高深的技術(shù)) Class.forName(DRIVER); // 由連接大管家創(chuàng)建連接對(duì)象 return DriverManager.getConnection(URL, USERNMAE, PASSWORD); } catch (ClassNotFoundException e) { //e.printStackTrace("數(shù)據(jù)庫的驅(qū)動(dòng)文件沒有找到"); } catch (SQLException e) { //數(shù)據(jù)庫的連接錯(cuò)誤 e.printStackTrace(); } return null ; } /** * 關(guān)閉連接釋放資源 * @param con * @param st * @param rt */ public void closeAll(Connection con, Statement st, ResultSet rt) { try { if (rt != null ) { rt.close(); rt = null ; } } catch (SQLException e) { e.printStackTrace(); } try { if (st != null ) { st.close(); st = null ; } } catch (SQLException e) { e.printStackTrace(); } try { if (con != null ) { con.close(); con = null ; } } catch (SQLException e) { e.printStackTrace(); } } } |
CRUDDAO 寫法代碼實(shí)例:
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
|
package com.dao; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.*; import java.util.*; import java.util.Map.Entry; /** * * @author zzy * * 2016年12月1日下午1:49:49 */ public class CRUDDAO<T> extends BaseJDBC { private Connection con = null ; private PreparedStatement pt = null ; private Statement st = null ; private ResultSet rt = null ; private Class<T> c; public CRUDDAO() { } public CRUDDAO(Class<T> c) { this .c = c; } /** * 查詢操作要改造的地方 第一:參數(shù)必須抽象 第二:返回類型必須抽象 * * @param <T> * @param <T> * * @return Map<Integer, List<T>> */ public Map<Integer, List<T>> selectAll(Map<String, Object[]> m) { int index = 0 ; Map<Integer, List<T>> map = new LinkedHashMap<Integer, List<T>>(); List<T> list = null ; try { con = super .getConnection(); if (con != null ) { Set<Entry<String, Object[]>> set = m.entrySet(); for (Entry<String, Object[]> entry : set) { list = new ArrayList<T>(); pt = con.prepareStatement(entry.getKey()); this .bind(entry.getValue()); rt = pt.executeQuery(); while (rt.next()) { list.add( this .toBean2()); } map.put(++index, list); } } else { System.out.println( "數(shù)據(jù)庫連接失敗" ); } } catch (SQLException e) { e.printStackTrace(); } finally { super .closeAll(con, pt, rt); } return map; } /** * 將數(shù)據(jù)庫查詢到的數(shù)據(jù)進(jìn)行封裝 封裝成實(shí)體類之后再返回給調(diào)用者 * * @return */ private T toBean() { T t = null ; try { t = c.newInstance(); Method[] m = c.getMethods(); ResultSetMetaData rmt = rt.getMetaData(); for ( int i = 1 , count = rmt.getColumnCount(); i <= count; i++) { String columName = rmt.getColumnName(i); columName = "set" + columName.substring( 0 , 1 ).toUpperCase() + columName.substring( 1 ); for ( int j = 0 ; j < m.length; j++) { if (columName.equals(m[j].getName())) { m[j].invoke(t, rt.getObject(i)); break ; } } } } catch (Exception e) { e.printStackTrace(); } return t; } private T toBean2() { T t = null ; try { // 創(chuàng)建反射類的實(shí)例 t = c.newInstance(); // 反射出所有字段 Field[] field = c.getDeclaredFields(); for (Field f : field) { // 根據(jù)反射的字段名得到數(shù)據(jù)庫中的字段值 Object value = rt.getObject(f.getName()); f.setAccessible( true ); // 打開私有字段的操作權(quán)限 f.set(t, value); // 調(diào)用這個(gè)字段的公有的set方法封裝字段的值 } } catch (Exception e) { e.printStackTrace(); } return t; } /** * 綁定參數(shù) * * @param obj */ private void bind(Object[] obj) { try { if (obj != null ) { for ( int i = 0 , k = obj.length; i < k; i++) { pt.setObject(i + 1 , obj[i]); } } } catch (SQLException e) { e.printStackTrace(); } } /** * 修改操作 進(jìn)行的事務(wù)的控制 所有命令要么同時(shí)提交成功 要么同時(shí)回滾 * * @param name * @param id * @return */ public int [] updateAll(Map<String, Object[]> map) { int [] row = new int [map.size()]; int index = 0 ; int error = 0 ; try { con = super .getConnection(); if (con != null ) { Set<Entry<String, Object[]>> set = map.entrySet(); // 關(guān)閉連接對(duì)象的自動(dòng)提交的功能 con.setAutoCommit( false ); for (Entry<String, Object[]> entry : set) { pt = con.prepareStatement(entry.getKey()); this .bind(entry.getValue()); row[index] = pt.executeUpdate(); if (row[index] == 0 ) { throw new Exception( "修改失敗,數(shù)據(jù)回滾!" ); } index++; } } else { System.out.println( "數(shù)據(jù)庫連接失敗" ); } } catch (Exception e) { error++; e.printStackTrace(); } finally { if (error > 0 ) { try { // 將前面已經(jīng)執(zhí)行的命令回滾 con.rollback(); } catch (SQLException e) { e.printStackTrace(); } } else { try { // 全部提交 con.commit(); } catch (SQLException e) { e.printStackTrace(); } } super .closeAll(con, st, null ); } return row; } } |
總結(jié)
以上就是本文關(guān)于BaseJDBC和CRUDDAO的寫法實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:http://blog.csdn.net/fvdfsdafdsafs/article/details/53420589