java减少数据访问层代码—反射2—数据访问层Wrapper—获取数据及分页

来源:互联网 发布:网络大学考试平台 编辑:程序博客网 时间:2024/05/21 14:00

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

 

——————————————源码——————————————————

————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; }   }


 

原创粉丝点击