Java連接MySQL資料庫增刪改查通用方法 運行環境:eclipse+MySQL 以前我們Java連接MySQL資料庫都是一個資料庫寫一個類,類下麵寫好多方法,要是多個資料庫,就要寫多個類多個方法,導致代碼編寫太過於繁瑣,所以為了改變這樣的繁瑣,我將連接資料庫的方法進行了一系列的封裝,使用戶傳入一 ...
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java連接MySQL資料庫增刪改查通用方法
運行環境:eclipse+MySQL
以前我們Java連接MySQL資料庫都是一個資料庫寫一個類,類下麵寫好多方法,要是多個資料庫,就要寫多個類多個方法,導致代碼編寫太過於繁瑣,所以為了改變這樣的繁瑣,我將連接資料庫的方法進行了一系列的封裝,使用戶傳入一個對象值Object就可以得到想要的。
我在之前寫過一篇普通的Java連接MySQL資料庫,大家可以看看,以便對比參考之後就知道差距了 資料庫——MySQL——>Java篇
接下來我給大家講講如何將這個不可復用,又多重覆的連接代碼,封裝起來,非常好用
基本思想:
我們連接資料庫的時候,寫的方法都是要一個個類 的去寫,其中的方法不計其數,連接資料庫都是需要:
- Class.forName():載入驅動 ——》com.mysql.jdbc.Driver
- DriverManager.getConnection():驅動管理,連接到資料庫 三個屬性1.資料庫地址 2.資料庫用戶名 3.密碼
- createStatement():創建Statement對象
- ResultSet:執行sql語句獲得結果集,再遍歷
那麼我們為了能通用,那麼其中的:資料庫名,sql語句,遍歷結果集要得到的結果,都是要根據不同資料庫根據傳入參數不同而變化的
首先每個項目開始前都要將資料庫實體化,每個表都是一個實體類,表名是類名,欄位為其屬性,再用set和get方法這些屬性
再根據反射機制,對象是我們表的實例化對象,根據我傳入方法的這個參數對象,獲取其中的方法,屬性,屬性值,類型等一系列的東西,來實現方法的封裝通用
代碼演示
先演示一個查詢:通過傳入這個表的實體類,通過一系列的放射機制,對比拼裝成一個查詢方法
public static List<Object> query(Class<?> obj) { Statement st=null; List<Object> list=new ArrayList<>(); //資料庫MySQL的地址 String DBURL="jdbc:mysql://localhost:3306/lms_leave?useUnicode=true&characterEncoding=utf-8"; String DBName="root"; //登入用戶名 String DBPwd="123456";//登入密碼 //載入驅動 try { Class.forName("com.mysql.jdbc.Driver"); //連接資料庫 Connection conn=DriverManager.getConnection(DBURL,DBName,DBPwd); //創建Statement對象 st=conn.createStatement(); ResultSet rs=st.executeQuery("select * from "+obj.getSimpleName()); //獲取傳入類中的方法 Method[] methods=obj.getMethods(); //設置一個方法的list集合,下麵將方法放入其中,以便調用 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]); } } //創建字元串string集合,獲取下麵的欄位名存入 List<String> fieldname=new ArrayList<>(); //獲取類中的屬性,其屬性對應資料庫中的欄位 Field[] f=obj.getDeclaredFields(); //迴圈將欄位中的名字首個變大寫 for (int i = 0; i < f.length; i++) { //獲取名字 String field=f[i].getName(); //變大小寫,存入fieldname集合 fieldname.add(upperCase(field)); } //獲取得到結果集(rs)的結構,比如欄位數、欄位名等。 ResultSetMetaData rsmd= rs.getMetaData(); //迴圈讀取結果集中的數據添加到list集合中 while (rs.next()) { //創建一個傳入類對象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去獲取資料庫中的欄位名,rs.getObject,再根據獲取的這個欄位名去得到這個欄位值 Object value=rs.getObject(rsmd.getColumnName(i+1)); //獲取這個欄位的類型,以便去儲存這個值的類型 Class<?> type=f[i].getType(); //是int類型的轉化 if (type==int.class) { value=new Integer(value.toString()); } //string類型的轉化 if (type==String.class) { value=value.toString(); } //m是user對象中的方法,設置其值 m.invoke(user, value); } } } //將的到的user對象實例添加到list集合中 list.add(user); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
還有一個方法就是將首字母變大寫的
public static String upperCase(String str) { //先將字元串轉換為字元數組 char[] ch = str.toCharArray(); //將數組的第一個元素 即字元串首字母,進行ASCII 碼前移,ASCII 中大寫字母從65開始,小寫字母從97開始,所以這裡減去32。 if (ch[0] >= 'a' && ch[0] <= 'z') { ch[0] = (char) (ch[0] - 32); } return new String(ch); }
大家可以參考這個方法完全可以改裝成剩餘的插入,修改,刪除
再給大家提示一下插入的方法封裝重要的一點是,獲取其中要插入的欄位,根據插入語句拼接成一個完整的sql語句就可以完成
//m.invoke(user);我的理解是運行user類下的方法m,得到返回值 Object object=m.invoke(user);
這些東西需要自己多去思考總結,希望對大家有用,我就不多寫了,留給大家一點思考的空間,需要剩下的方法封裝可以留言告訴我