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

原文链接

https://blog.csdn.net/xiaojian90/article/details/51931068

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

供大家参考。

数据库表如下:

实体类就不说了: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();   
        }   
    }   
}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

DAO基层封装类BaseDAO.java

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

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

Code:
public class BaseDAO {   
    private Class voClass;   
    protected DB db;   
    public BaseDAO(){   
        voClass=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];   
        db=new DB();   
    }   
    //通用ResultSet转泛型集合   
    public List resultSetToList(ResultSet rs){   
        List list=new ArrayList();   
        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 {   

    public List 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 list=resultSetToList(rs);   
        db.closeObject(rs);   
        return list;   
    }   

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

    public StudInfo findStudByStudNo(String stuNo){   
        String where="stuNo=?";   
        Object[] paras=new Object[]{stuNo};   
        List list=findAllByWhere(where, paras);   
        return list.size()==1?list.get(0):null;   
    }   
}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

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());   
    }   

}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果:

希望对大家有帮助。

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

你可能感兴趣的:(JDBC)