最近和一些学生在学习中讨论起泛型反射技术,我们可以通过反射来封装泛型集合,自己写了一个例子
供大家参考。
数据库表如下:
实体类就不说了: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 继承自BaseDAO
Code:
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/