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

来源:互联网 发布:周立功单片机发展有限公司怎么样 编辑:程序博客网 时间:2024/05/04 02:55

原文链接

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

供大家参考。

数据库表如下:

实体类就不说了: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 继承自BaseDAOCode: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/

0 0