我們首先看下BASEJDBC的寫法實例:
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 { // 表示你要操作的是哪種類型的數據庫 private final String DRIVER = "com.mysql.jdbc.Driver" ; // 表示你要連接的是哪一臺電腦的服務器端口號是多少數據庫的名字是什么 private final String URL = "jdbc:mysql://localhost:3306/zzy" ;//有時這里需要加上字符集 // 登錄數據庫的用戶名 private final String USERNMAE = "root" ; // 登錄數據庫的密碼 private final String PASSWORD = "root" ; /** * 注冊驅動 獲取連接 * * @return */ public Connection getConnection() { try { //Driver d=new Driver(); // 注冊驅動:反射(是一項很高深的技術) Class.forName(DRIVER); // 由連接大管家創建連接對象 return DriverManager.getConnection(URL, USERNMAE, PASSWORD); } catch (ClassNotFoundException e) { //e.printStackTrace("數據庫的驅動文件沒有找到"); } catch (SQLException e) { //數據庫的連接錯誤 e.printStackTrace(); } return null ; } /** * 關閉連接釋放資源 * @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 寫法代碼實例:
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; } /** * 查詢操作要改造的地方 第一:參數必須抽象 第二:返回類型必須抽象 * * @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( "數據庫連接失敗" ); } } catch (SQLException e) { e.printStackTrace(); } finally { super .closeAll(con, pt, rt); } return map; } /** * 將數據庫查詢到的數據進行封裝 封裝成實體類之后再返回給調用者 * * @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 { // 創建反射類的實例 t = c.newInstance(); // 反射出所有字段 Field[] field = c.getDeclaredFields(); for (Field f : field) { // 根據反射的字段名得到數據庫中的字段值 Object value = rt.getObject(f.getName()); f.setAccessible( true ); // 打開私有字段的操作權限 f.set(t, value); // 調用這個字段的公有的set方法封裝字段的值 } } catch (Exception e) { e.printStackTrace(); } return t; } /** * 綁定參數 * * @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(); } } /** * 修改操作 進行的事務的控制 所有命令要么同時提交成功 要么同時回滾 * * @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(); // 關閉連接對象的自動提交的功能 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( "修改失敗,數據回滾!" ); } index++; } } else { System.out.println( "數據庫連接失敗" ); } } catch (Exception e) { error++; e.printStackTrace(); } finally { if (error > 0 ) { try { // 將前面已經執行的命令回滾 con.rollback(); } catch (SQLException e) { e.printStackTrace(); } } else { try { // 全部提交 con.commit(); } catch (SQLException e) { e.printStackTrace(); } } super .closeAll(con, st, null ); } return row; } } |
總結
以上就是本文關于BaseJDBC和CRUDDAO的寫法實例代碼的全部內容,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/fvdfsdafdsafs/article/details/53420589