基于泛型反射的通用数据层封装

最近和一些学生在学习中讨论起泛型反射技术,我们可以通过反射来封装泛型集合,自己写了一个例子

供大家参考。

数据库表如下:

实体类就不说了:StudInfo.java

数据库通用类DB.java

Code:
  1. public class DB {   
  2.     private Connection conn;   
  3.     private PreparedStatement ps;   
  4.     public DB(){   
  5.         try {   
  6.             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");   
  7.             conn = DriverManager.getConnection(   
  8.                     "jdbc:sqlserver://127.0.0.1:1455;databaseName=studb",   
  9.                     "sa""");   
  10.         } catch (Exception e) {   
  11.             e.printStackTrace();   
  12.         }   
  13.     }   
  14.     public ResultSet executeQuery(String sql,Object[] paras){   
  15.         try {   
  16.             ps = conn.prepareStatement(sql);   
  17.             if (paras != null && paras.length > 0) {   
  18.                 for (int i = 0; i < paras.length; i++) {   
  19.                     ps.setObject(i + 1, paras[i]);   
  20.                 }   
  21.             }   
  22.             return ps.executeQuery();   
  23.         } catch (Exception e) {   
  24.             e.printStackTrace();   
  25.             closeObject(null);   
  26.             return null;   
  27.         }   
  28.     }   
  29.     public int executeNonQuery(String sql,Object[] paras){   
  30.         try {   
  31.             ps = conn.prepareStatement(sql);   
  32.             if (paras != null && paras.length > 0) {   
  33.                 for (int i = 0; i < paras.length; i++) {   
  34.                     ps.setObject(i + 1, paras[i]);   
  35.                 }   
  36.             }   
  37.             Boolean b = ps.execute();   
  38.             if (b)   
  39.                 return 1;   
  40.             return 0;   
  41.         } catch (Exception e) {   
  42.             e.printStackTrace();   
  43.             closeObject(null);   
  44.             return -1;   
  45.         }   
  46.     }   
  47.        
  48.     public void closeObject(ResultSet rs){   
  49.         try {   
  50.             if (rs != null)   
  51.                 rs.close();   
  52.             if (ps != null)   
  53.                 ps.close();   
  54.             if (conn != null)   
  55.                 conn.close();   
  56.         } catch (Exception e) {   
  57.             e.printStackTrace();   
  58.         }   
  59.     }   
  60. }   

DAO基层封装类BaseDAO.java

重头戏在这里,做成泛型类,

这里只写了一个将ResultSet转成List<T>的方法,其它方法可以自己进行扩充

Code:
  1. public class BaseDAO<T> {   
  2.     private Class voClass;   
  3.     protected DB db;   
  4.     public BaseDAO(){   
  5.         voClass=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];   
  6.         db=new DB();   
  7.     }   
  8.     //通用ResultSet转泛型集合   
  9.     public List<T> resultSetToList(ResultSet rs){   
  10.         List<T> list=new ArrayList<T>();   
  11.         try {   
  12.             while (rs.next()) {   
  13.                 Object o = null;   
  14.                 try {   
  15.                     o = voClass.newInstance();//创建实例   
  16.                     for (Method m : voClass.getMethods()) { //遍历所有方法   
  17.                         String methodName = m.getName();   
  18.                         if (methodName.startsWith("set")   
  19.                                 && !methodName.equals("setClass")) {   
  20.                             //普通Set方法   
  21.                             String fieldName = methodName.substring(3);//获取字段名   
  22.                             m.invoke(o, rs.getObject(fieldName));//获取数据并通过反射赋值   
  23.                         }   
  24.                     }   
  25.                 } catch (Exception e) {   
  26.                     e.printStackTrace();   
  27.                 }   
  28.                 list.add((T) o);   
  29.             }   
  30.         } catch (Exception e) {   
  31.             e.printStackTrace();   
  32.         }   
  33.         return list;   
  34.     }   
  35. }  

StudDAO.java 学生DAO 继承自BaseDAO

Code:
  1. public class StudDAO extends BaseDAO<StudInfo> {   
  2.   
  3.     public List<StudInfo> findAllByWhere(String where,Object[] paras){   
  4.         if(where==null||where.length()==0) where="1=1";   
  5.         if(paras==null) paras=new Object[]{};   
  6.         String sql="select * from stuinfo where "+where;   
  7.         ResultSet rs=db.executeQuery(sql, paras);   
  8.         List<StudInfo> list=resultSetToList(rs);   
  9.         db.closeObject(rs);   
  10.         return list;   
  11.     }   
  12.        
  13.     public List<StudInfo> findAll(){   
  14.         return findAllByWhere(null,null);   
  15.     }   
  16.        
  17.     public StudInfo findStudByStudNo(String stuNo){   
  18.         String where="stuNo=?";   
  19.         Object[] paras=new Object[]{stuNo};   
  20.         List<StudInfo> list=findAllByWhere(where, paras);   
  21.         return list.size()==1?list.get(0):null;   
  22.     }   
  23. }   

findAllByWhere是通用的学生表查询功能,调用了BaseDAO的封装方法

别外写了两个方法来使用这个通用查询

测试类MyTest.java

Code:
  1. public class MyTest {   
  2.        
  3.     public static void main(String[] args) {           
  4.         System.out.println("-----------findAll--------------------)");   
  5.         findAll();   
  6.         System.out.println("-----------findStud--------------------)");   
  7.         findStud("s25301");   
  8.     }   
  9.     static void findAll(){   
  10.         StudDAO dao=new StudDAO();   
  11.         for(StudInfo s :dao.findAll()){   
  12.             System.out.print(s.getStuNo());   
  13.             System.out.print("/t"+s.getStuName());   
  14.             System.out.print("/t"+s.getStuAge());   
  15.             System.out.println("/t"+s.getStuAddress());   
  16.         }   
  17.     }   
  18.     static void findStud(String stuno){   
  19.         StudDAO dao=new StudDAO();   
  20.         StudInfo s=dao.findStudByStudNo(stuno);   
  21.         System.out.print(s.getStuNo());   
  22.         System.out.print("/t"+s.getStuName());   
  23.         System.out.print("/t"+s.getStuAge());   
  24.         System.out.println("/t"+s.getStuAddress());   
  25.     }   
  26.   
  27. }   

运行结果:

希望对大家有帮助。

我用的是MSSQL2008,驱动及项目下载:lijun7788.download.csdn.net/

你可能感兴趣的:(基于泛型反射的通用数据层封装)