最近和一些学生在学习中讨论起泛型反射技术,我们可以通过反射来封装泛型集合,自己写了一个例子
供大家参考。
数据库表如下:
实体类就不说了:StudInfo.java
数据库通用类DB.java
- 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<T>的方法,其它方法可以自己进行扩充
- 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
- 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
- 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/