基于泛型反射的通用数据层封装
来源:互联网 发布:周立功单片机发展有限公司怎么样 编辑:程序博客网 时间: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
- 基于泛型反射的通用数据层封装
- 基于泛型反射的通用数据层封装
- Java中基于HttpServlet的反射机制(封装从view层页面接收到的数据于实体对象中)
- 基于Spring4+Hibernate4的通用数据访问层+业务逻辑层(Dao层+Service层)设计与实现!
- 基于Spring4+Hibernate4的通用数据访问层(Dao层)设计与实现!
- 基于Spring4+Hibernate4的通用数据访问层(Dao层)设计与实现!
- 基于反射List转Map的一种通用泛型实现
- 基于iBatis的通用持久层对象
- 基于iBatis的通用持久层对象
- 基于spring jdbc的通用存取层
- 基于Mybatis的通用Service层实现
- 写了个基于sqlhelper和oracleHelper的通用数据访问层
- 基于表单数据的封装,泛型,反射以及使用BeanUtils进行处理
- 简写的通用数据层代码
- 简写的通用数据层代码
- DAO层数据操作的封装
- .net中的数据访问层的封装
- 基于tinyXml2库封装的解析xml的通用类
- 文章标题
- linux shell 编程(二)
- 1118 机器人走方格
- js总结
- FACH EFACH及其DRX
- 基于泛型反射的通用数据层封装
- Android开发60条技术经验总结
- iOS Core Graphics介绍
- HDU 4992 / BC 8D Primitive Roots
- LeafChart-实现自己的小型图表库(1)
- 语言编译的步骤及装入执行过程
- PAT-团体程序设计天梯赛-练习集- L3-010 是否完全二叉搜索树【三星级】
- leetcode224. Basic Calculator
- ros中使用rosbag记录数据及转换视频