Java連接MySQL數據庫增刪改查通用方法


版權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java連接MySQL數據庫增刪改查通用方法

  運行環境:eclipse+MySQL

  以前我們Java連接MySQL數據庫都是一個數據庫寫一個類,類下面寫好多方法,要是多個數據庫,就要寫多個類多個方法,導致代碼編寫太過於繁瑣,所以為了改變這樣的繁瑣,我將連接數據庫的方法進行了一系列的封裝,使用戶傳入一個對象值Object就可以得到想要的。

  我在之前寫過一篇普通的Java連接MySQL數據庫,大家可以看看,以便對比參考之后就知道差距了  數據庫——MySQL——>Java篇

  接下來我給大家講講如何將這個不可復用,又多重復的連接代碼,封裝起來,非常好用

基本思想:

我們連接數據庫的時候,寫的方法都是要一個個類 的去寫,其中的方法不計其數,連接數據庫都是需要:

  1. Class.forName():加載驅動   ——》com.mysql.jdbc.Driver
  2. DriverManager.getConnection():驅動管理,連接到數據庫 三個屬性1.數據庫地址  2.數據庫用戶名   3.密碼
  3. createStatement():創建Statement對象
  4. 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);

這些東西需要自己多去思考總結,希望對大家有用,我就不多寫了,留給大家一點思考的空間,需要剩下的方法封裝可以留言告訴我

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM