最近和一些學生在學習中討論起泛型反射技術,我們可以通過反射來封裝泛型集合,自己寫了一個例子
供大家參考。
數據庫表如下:
實體類就不說了: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/