運行環(huán)境:eclipse+MySQL
以前我們Java連接MySQL數(shù)據(jù)庫都是一個數(shù)據(jù)庫寫一個類,類下面寫好多方法,要是多個數(shù)據(jù)庫,就要寫多個類多個方法,導(dǎo)致代碼編寫太過于繁瑣,所以為了改變這樣的繁瑣,我將連接數(shù)據(jù)庫的方法進(jìn)行了一系列的封裝,使用戶傳入一個對象值Object就可以得到想要的。
我在之前寫過一篇普通的Java連接MySQL數(shù)據(jù)庫,大家可以看看,以便對比參考之后就知道差距了 數(shù)據(jù)庫——MySQL——>Java篇
接下來我給大家講講如何將這個不可復(fù)用,又多重復(fù)的連接代碼,封裝起來,非常好用
基本思想:
我們連接數(shù)據(jù)庫的時候,寫的方法都是要一個個類 的去寫,其中的方法不計其數(shù),連接數(shù)據(jù)庫都是需要:
Class.forName():加載驅(qū)動 ——》com.mysql.jdbc.Driver
DriverManager.getConnection():驅(qū)動管理,連接到數(shù)據(jù)庫 三個屬性1.數(shù)據(jù)庫地址 2.數(shù)據(jù)庫用戶名 3.密碼
createStatement():創(chuàng)建Statement對象
ResultSet:執(zhí)行sql語句獲得結(jié)果集,再遍歷
那么我們?yōu)榱四芡ㄓ茫敲雌渲械模簲?shù)據(jù)庫名,sql語句,遍歷結(jié)果集要得到的結(jié)果,都是要根據(jù)不同數(shù)據(jù)庫根據(jù)傳入?yún)?shù)不同而變化的
首先每個項目開始前都要將數(shù)據(jù)庫實體化,每個表都是一個實體類,表名是類名,字段為其屬性,再用set和get方法這些屬性
再根據(jù)反射機制,對象是我們表的實例化對象,根據(jù)我傳入方法的這個參數(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
|
public static List<Object> query(Class<?> obj) { Statement st= null ; List<Object> list= new ArrayList<>(); //數(shù)據(jù)庫MySQL的地址 String DBURL= "jdbc:mysql://localhost:3306/lms_leave?useUnicode=true&characterEncoding=utf-8" ; String DBName= "root" ; //登入用戶名 String DBPwd= "123456" ; //登入密碼 //加載驅(qū)動 try { Class.forName( "com.mysql.jdbc.Driver" ); //連接數(shù)據(jù)庫 Connection conn=DriverManager.getConnection(DBURL,DBName,DBPwd); //創(chuàng)建Statement對象 st=conn.createStatement(); ResultSet rs=st.executeQuery( "select * from " +obj.getSimpleName()); //獲取傳入類中的方法 Method[] methods=obj.getMethods(); //設(shè)置一個方法的list集合,下面將方法放入其中,以便調(diào)用 List<Method> list_m= new ArrayList<>(); //類中有許多方法,過濾一些方法,獲取自己想要的方法 for ( int i= 0 ;i<methods.length;i++){ //過濾方法 //判斷方法名字中是否有set這個提取 if (methods[i].getName().contains( "set" )) { //將方法添加到list中 list_m.add(methods[i]); } } //創(chuàng)建字符串string集合,獲取下面的字段名存入 List<String> fieldname= new ArrayList<>(); //獲取類中的屬性,其屬性對應(yīng)數(shù)據(jù)庫中的字段 Field[] f=obj.getDeclaredFields(); //循環(huán)將字段中的名字首個變大寫 for ( int i = 0 ; i < f.length; i++) { //獲取名字 String field=f[i].getName(); //變大小寫,存入fieldname集合 fieldname.add(upperCase(field)); } //獲取得到結(jié)果集(rs)的結(jié)構(gòu),比如字段數(shù)、字段名等。 ResultSetMetaData rsmd= rs.getMetaData(); //循環(huán)讀取結(jié)果集中的數(shù)據(jù)添加到list集合中 while (rs.next()) { //創(chuàng)建一個傳入類對象user Object user=obj.newInstance(); //遍歷方法的集合 for (Method m : list_m) { //遍歷字段的集合 for ( int i = 0 ; i < f.length; i++) { //方法和字段作比較,查看方法名中是否含有這個字段名,兩者匹配 if (m.getName().contains( "set" +fieldname.get(i))) { //匹配成功 ,則去得到rsmd去獲取數(shù)據(jù)庫中的字段名,rs.getObject,再根據(jù)獲取的這個字段名去得到這個字段值 Object value=rs.getObject(rsmd.getColumnName(i+ 1 )); //獲取這個字段的類型,以便去儲存這個值的類型 Class<?> type=f[i].getType(); //是int類型的轉(zhuǎn)化 if (type== int . class ) { value= new Integer(value.toString()); } //string類型的轉(zhuǎn)化 if (type==String. class ) { value=value.toString(); } //m是user對象中的方法,設(shè)置其值 m.invoke(user, value); } } } //將的到的user對象實例添加到list集合中 list.add(user); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } |
大家可以參考這個方法完全可以改裝成剩余的插入,修改,刪除
再給大家提示一下插入的方法封裝重要的一點是,獲取其中要插入的字段,根據(jù)插入語句拼接成一個完整的sql語句就可以完成
1
2
|
//m.invoke(user);我的理解是運行user類下的方法m,得到返回值 Object object=m.invoke(user); |
這些東西需要自己多去思考總結(jié),希望對大家有用,我就不多寫了,留給大家一點思考的空間,需要剩下的方法封裝可以留言告訴我
以上這篇Java連接MySQL數(shù)據(jù)庫增刪改查的通用方法(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。