基於泛型反射的通用數據層封裝

原文鏈接

最近和一些學生在學習中討論起泛型反射技術,我們可以通過反射來封裝泛型集合,自己寫了一個例子

供大家參考。

數據庫表如下:

實體類就不說了:StudInfo.java

數據庫通用類DB.java

Code:
public class DB {   
    private Connection conn;   
    private PreparedStatement ps;   
    public DB(){   
        try {   
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");   
            conn = DriverManager.getConnection(   
                    "jdbc:sqlserver://127.0.0.1:1455;databaseName=studb",   
                    "sa", "");   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
    public ResultSet executeQuery(String sql,Object[] paras){   
        try {   
            ps = conn.prepareStatement(sql);   
            if (paras != null && paras.length > 0) {   
                for (int i = 0; i < paras.length; i++) {   
                    ps.setObject(i + 1, paras[i]);   
                }   
            }   
            return ps.executeQuery();   
        } catch (Exception e) {   
            e.printStackTrace();   
            closeObject(null);   
            return null;   
        }   
    }   
    public int executeNonQuery(String sql,Object[] paras){   
        try {   
            ps = conn.prepareStatement(sql);   
            if (paras != null && paras.length > 0) {   
                for (int i = 0; i < paras.length; i++) {   
                    ps.setObject(i + 1, paras[i]);   
                }   
            }   
            Boolean b = ps.execute();   
            if (b)   
                return 1;   
            return 0;   
        } catch (Exception e) {   
            e.printStackTrace();   
            closeObject(null);   
            return -1;   
        }   
    }   

    public void closeObject(ResultSet rs){   
        try {   
            if (rs != null)   
                rs.close();   
            if (ps != null)   
                ps.close();   
            if (conn != null)   
                conn.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}   

DAO基層封裝類BaseDAO.java

重頭戲在這裏,做成泛型類,

這裏只寫了一個將ResultSet轉成List的方法,其它方法可以自己進行擴充

Code:
public class BaseDAO<T> {   
    private Class voClass;   
    protected DB db;   
    public BaseDAO(){   
        voClass=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];   
        db=new DB();   
    }   
    //通用ResultSet轉泛型集合   
    public List<T> resultSetToList(ResultSet rs){   
        List<T> list=new ArrayList<T>();   
        try {   
            while (rs.next()) {   
                Object o = null;   
                try {   
                    o = voClass.newInstance();//創建實例   
                    for (Method m : voClass.getMethods()) { //遍歷所有方法   
                        String methodName = m.getName();   
                        if (methodName.startsWith("set")   
                                && !methodName.equals("setClass")) {   
                            //普通Set方法   
                            String fieldName = methodName.substring(3);//獲取字段名   
                            m.invoke(o, rs.getObject(fieldName));//獲取數據並通過反射賦值   
                        }   
                    }   
                } catch (Exception e) {   
                    e.printStackTrace();   
                }   
                list.add((T) o);   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
        return list;   
    }   
}  
StudDAO.java 學生DAO 繼承自BaseDAO

Code:
public class StudDAO extends BaseDAO<StudInfo> {   

    public List<StudInfo> findAllByWhere(String where,Object[] paras){   
        if(where==null||where.length()==0) where="1=1";   
        if(paras==null) paras=new Object[]{};   
        String sql="select * from stuinfo where "+where;   
        ResultSet rs=db.executeQuery(sql, paras);   
        List<StudInfo> list=resultSetToList(rs);   
        db.closeObject(rs);   
        return list;   
    }   

    public List<StudInfo> findAll(){   
        return findAllByWhere(null,null);   
    }   

    public StudInfo findStudByStudNo(String stuNo){   
        String where="stuNo=?";   
        Object[] paras=new Object[]{stuNo};   
        List<StudInfo> list=findAllByWhere(where, paras);   
        return list.size()==1?list.get(0):null;   
    }   
}   

findAllByWhere是通用的學生表查詢功能,調用了BaseDAO的封裝方法

別外寫了兩個方法來使用這個通用查詢

測試類MyTest.java

Code:
public class MyTest {   

    public static void main(String[] args) {           
        System.out.println("-----------findAll--------------------)");   
        findAll();   
        System.out.println("-----------findStud--------------------)");   
        findStud("s25301");   
    }   
    static void findAll(){   
        StudDAO dao=new StudDAO();   
        for(StudInfo s :dao.findAll()){   
            System.out.print(s.getStuNo());   
            System.out.print("/t"+s.getStuName());   
            System.out.print("/t"+s.getStuAge());   
            System.out.println("/t"+s.getStuAddress());   
        }   
    }   
    static void findStud(String stuno){   
        StudDAO dao=new StudDAO();   
        StudInfo s=dao.findStudByStudNo(stuno);   
        System.out.print(s.getStuNo());   
        System.out.print("/t"+s.getStuName());   
        System.out.print("/t"+s.getStuAge());   
        System.out.println("/t"+s.getStuAddress());   
    }   

}   

運行結果:

希望對大家有幫助。

我用的是MSSQL2008,驅動及項目下載:lijun7788.download.csdn.net/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章