java減少代碼書寫——數據訪問層Wrapper—獲取數據及分頁—反射2 – JAVA編程語言程序開發技術文章

—————————————使用效果——————————————————

 

 

——————————————源碼——————————————————

————DButil類,這個類我封裝的不好,主要看open(),close(),getResultList(String classpath,String sql,Object… src)這幾個方法,主要代碼我標紅

package com.fendou.DBUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.fendou.myfactory.Myfactory;
import com.fendou.vo.Orders;
import com.fendou.wrapper.IWrapper;
import com.fendou.wrapper.WrapperBatcher;

/**
 * DButil類2012-9-13
 * @author 牟雲飛
 *
 */
public class DButil<T> {

 private String driver=Myfactory.driver;
 private String url=Myfactory.url;
 private String user=Myfactory.user;
 private String pwd=Myfactory.pwd;
 private Connection con =null;
 private Statement stat = null ;
 private ResultSet rs = null;
 private PreparedStatement ps =null;
 
 public DButil(){
 
 }
 
 /**
  * 打開數據連接,如果關閉成功,返回true,否則false
  * @return boolean
  */
 public boolean open(){
  boolean flag = false;
  try {
   Class.forName(driver);
   con = DriverManager.getConnection(url,user,pwd);
   flag=true;
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return flag;
 }
 
 /**
  * 關閉連接,成功true,失敗false
  * @return boolean
  */
 public boolean close(){
  boolean flag = false;
  try {
   if(rs!=null){
    if(rs.isClosed()==false){
    rs.close();}
   }
   if(stat!=null){
    if(stat.isClosed()==false){
    stat.close();
    }
   }
   if(ps!=null){
    if(ps.isClosed()==false){
    ps.close();
    }
   }
   if(con!=null){
    if(con.isClosed()==false){
    con.close();
    }
   }
   flag = true;
  
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
  return flag;
 }
 
 /**
  * 執行sql語句獲得list
  * 通過iwrapper封裝直接得到list
  * @param wrapper繼承IWrapper<T>
  * @param sql語句
  * @param src
  * @return
  */
 public List<T> getResultList(String classpath,String sql,Object… src){
  List<T> list = new ArrayList<T>();
  //打開連接
  open();
   try {
   ps =con.prepareStatement(sql);
   for (int i = 0; i < src.length; i++) {
    ps.setObject(i+1,src[i] );
   }
   //執行,獲得result
   rs = ps.executeQuery();
   //將resultset轉換成list
   while(rs.next()){
    WrapperBatcher<T> w = new WrapperBatcher<T>();
    T t = w.setT(classpath, rs);
    list.add(t);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  //關閉連接
  close();
  //獲得結果
  return list;
 }
 
 /**
  * 執行sql語句返回受影響行數
  *增加、刪除、修改
  * @param sql語句
  * @param 參數
  * @return 手影響行數
  */

 public int update(String sql,Object… src){
  int count=0;
  //打開連接
  open();
   try {
   ps =con.prepareStatement(sql);
   for (int i = 0; i < src.length; i++) {
    ps.setObject(i+1,src[i] );
    }
   //執行,獲得受影響行數
   count = ps.executeUpdate();
  
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  //關閉連接
  close();
  //獲得結果
  return count;
 }
 
 
 /**
  * 執行sql語句返回受影響行數
  *增加、刪除、修改
  * @param sql語句
  * @return 手影響行數
  */
 public int update(String sql){
  int count=0;
  //打開連接
  open();
   try {
   ps =con.prepareStatement(sql);
   //執行,獲得受影響行數
   count = ps.executeUpdate();
  
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  //關閉連接
  close();
  //獲得結果
  return count;
 }
 
 
 
 /**
  * 得到連接
  * @return Connection
  */
 public  Connection getConnection() {
 
  return con;
 }
 
 
 /**
  * 獲取PreparedStatement
  * @param sql語句
  * @return PreparedStatement
  */
 public PreparedStatement getPreparedStatement(String sql){
   try {
   ps = con.prepareStatement(sql);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return ps;
 
 }
 
 /**
  * 執行PreparedStatement,獲得結果集
  * @param PreparedStatement
  * @return ResultSet
  */
 public ResultSet executePreparedStatement(PreparedStatement pre){
  try {
   rs = pre.executeQuery();
 
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return rs;
 }

 
 
 /**
  * 執行PreparedStatement,獲得受影響的行數
  * @param PreparedStatement
  * @return int
  */
 public int executePSUpdate(PreparedStatement pre){
  int i = 0;
  try {
   i = pre.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return i;
 }
 
 /**
  * 開始新的事務
  */
 public void openTran(){
  if(con!=null){
   try {
    con.commit();
    con.setAutoCommit(false);
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 /**
  * 提交事務
  */
 public void commit()
 {
  if(con!=null){
   try {
    con.commit();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 
 }
 
 /**
  * 事務回滾
  */
 public void rollback(){
  try {
   con.rollback();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 /**
  * 設置斷點
  * @param 斷點名
  * @return
  */
 public Savepoint setPoint(String name){
  Savepoint s = null;
  try {
   s = con.setSavepoint(name);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return s;
 
 }
 
 /**
  * 斷點回滾
  */
 public boolean rollbackByPoint(Savepoint savepoint){
  boolean flag = false;
  try {
   con.rollback(savepoint);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return flag;
 }
 
 
 
 /**
  * 關閉事務
  */
 public void closeTran(){
  if(con!=null){
   try {
    con.setAutoCommit(false);
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 //獲取statment
 public Statement getStatement(){
  if(con!=null){
   try {
    stat = con.createStatement();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  
  }
  return stat ;
 }
 //statement執行
 public int executeStatmentUpdate(String sql){
   int i = 0;
  try {
   i = stat.executeUpdate(sql);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return i ;
 }
 
 //用statment返回結果集
 public ResultSet executeStatmentQuery(String sql){
   try {
   rs = stat.executeQuery(sql);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return rs;
 }
 
}
 

————WrapperBatcher<T>類,這個在DButil類中的getResultLis()方法t中使用

package com.fendou.wrapper;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
 * 2012-9-18
 * @author 牟雲飛
 *
 */
public class WrapperBatcher<T> {
 
 /**
  * 方法一:將resultSet自動變成對應的類
  * 方法二優秀,方法一再某些條件下是錯誤的,例如:get、set一旦調用順序變動
  * 都是set
  * @param 類的完整路徑
  * @param resultSet結果集
  * @return 對應的類
  */
 public T setWrapper(String classPath,ResultSet rs){
  T t = null;
  try {
   Class cl = Class.forName(classPath);
   //得到這個類的所有成員
   Field[] name = cl.getDeclaredFields();
   //得到這個類中所有的方法
   Method[] method = cl.getDeclaredMethods();
   //實例化
   t = (T) cl.newInstance();
   //調用set設置值
   for(int i =0;i<method.length;i++){
    if(method[i].getName().startsWith("set")){
     int h =0;
     if(((i/2)-1)<=0){
      h=0;
     }else{
      h=i/2-1;
     }
     String type=name[h].getType().getName();
              type = type.substring(type.lastIndexOf(".")+1,type.length());
              System.out.println(type+"   "+method[i].getName());
     if(type.toString().equals("int")){
      if(rs.getInt(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=0){
       method[i].invoke(t,rs.getInt(method[i].getName().toLowerCase().substring(3,method[i].getName().length())));
      }else{
       method[i].invoke(t,0);
      }
     }else if(type.toString().toLowerCase().equals("string")){
      if(rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=null){
       method[i].invoke(t,rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length())));
      }
     }else if(type.toString().toLowerCase().equals("date")){
      if(rs.getString(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=null){
       method[i].invoke(t,rs.getDate(method[i].getName().toLowerCase().substring(3,method[i].getName().length())));
      }
     }else if(type.toString().toLowerCase().equals("double")){
      if(rs.getDouble(method[i].getName().toLowerCase().substring(3,method[i].getName().length()))!=0){
       method[i].invoke(t,rs.getDouble(method[i].getName().toLowerCase().substring(3,method[i].getName().length())));
      }else
      {
       method[i].invoke(t,0.0);
      }
     }
    }
   }
  
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return t;
 }
 
 /**
  * 方法二:將resultSet自動變成對應的類
  * 都是set
  * @param 類的完整路徑
  * @param resultSet結果集
  * @return 對應的類
  */
 public T setT(String classpath,ResultSet rs){
  T t = null;
  try {
  Class classType = Class.forName(classpath);
   //得到這個類的所有成員
  Field[] name = classType.getDeclaredFields();
   //得到這個類中所有的方法
  Method[] method = classType.getDeclaredMethods();
   //實例化
  t = (T) classType.newInstance();
  // 獲得對象的所有屬性
        Field fields[] = classType.getDeclaredFields();

        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];

            String fieldName = field.getName();
            String firstLetter = fieldName.substring(0, 1).toUpperCase();

//            // 獲得和屬性對應的getXXX()方法的名字
//            String getMethodName = "get" + firstLetter + fieldName.substring(1);
            // 獲得和屬性對應的setXXX()方法的名字
            String setMethodName = "set" + firstLetter + fieldName.substring(1);

//            // 獲得和屬性對應的getXXX()方法
//            Method getMethod = classType.getMethod(getMethodName,new Class[] {});
  
            // 獲得和屬性對應的setXXX()方法,使用filed對象的類型
            Method setMethod = classType.getMethod(setMethodName,new Class[] { field.getType() });

//            // 調用原對象的getXXX()方法:指定調用的對象和方法的參數值列表
//            Object value = getMethod.invoke(t, new Object[] {});
//            System.out.println(fieldName + ":" + value);
            // 調用拷貝對象的setXXX()方法:指定調用的對象和參數值列表(註意必須是Object類型)
            String type=field.getType().getName();
            type = type.substring(type.lastIndexOf(".")+1,type.length());
            if(type.toString().equals("int")){
             if(rs.getInt(field.getName())!=0){
               setMethod.invoke(t,rs.getInt(field.getName()));
             }
   }
            if(type.toString().equals("String")){
             if(rs.getString(field.getName())!=null){
              setMethod.invoke(t,rs.getString(field.getName()));
             }
   }
            if(type.toString().equals("Date")){
             if(rs.getDate(field.getName())!=null){
              setMethod.invoke(t,rs.getTimestamp(field.getName()));
             }
      }
            if(type.toString().equals("Double")){
             if(rs.getDouble(field.getName())!=0){
              setMethod.invoke(t,rs.getDouble(field.getName()));
       }
      }
        }
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
        return t;
 }
 
 

發佈留言