zoukankan      html  css  js  c++  java
  • java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类

    这里首先必须注意的是:类的类名、字段必须与数据库中的表名和字段名保持一致,否则无法通过反射机制作出通用层

    /**
     * 学生信息类,数据库中的StuInfo表
     * */
    public class StuInfo {

    private int StuId;
     private String StuName;
     public StuInfo() {
     }
     public StuInfo(int stuId, String stuName) {
      StuId = stuId;
      StuName = stuName;
     }
     public StuInfo(String stuName) {
      StuName = stuName;
     }
     public int getStuId() {
      return StuId;
     }
     public void setStuId(int stuId) {
      StuId = stuId;
     }
     public String getStuName() {
      return StuName;
     }
     public void setStuName(String stuName) {
      StuName = stuName;
     }
     

    /**
     * 成绩类,数据库中的StuScoreInfo表
     * */
    public class StuScoreInfo {

    private int StuScoreId;
     private int StuId;
     private int StuScore;
     public StuScoreInfo(int stuId, int stuScore) {
      StuId = stuId;
      StuScore = stuScore;
     }
     public StuScoreInfo(int stuScoreId, int stuId, int stuScore) {
      StuScoreId = stuScoreId;
      StuId = stuId;
      StuScore = stuScore;
     }
     public StuScoreInfo() {
     }
     public int getStuScoreId() {
      return StuScoreId;
     }
     public void setStuScoreId(int stuScoreId) {
      StuScoreId = stuScoreId;
     }
     public int getStuId() {
      return StuId;
     }
     public void setStuId(int stuId) {
      StuId = stuId;
     }
     public int getStuScore() {
      return StuScore;
     }
     public void setStuScore(int stuScore) {
      StuScore = stuScore;
     }
    }

    //dao层的通用类,适用于没有属性类的类,对于增删改的重构

    public class CurrencyDao {

     /**

      * 添加语句,适用于没有属性类的任何类  

    * */

     public  int Insert(Object o) {

    int judge = -1;  

     // 反射出私有字段  

     Field[] f = o.getClass().getDeclaredFields();   

    // 组装数组库语句   

    String sql = "insert into " + o.getClass().getSimpleName();// o.getClass().getSimpleName()获取的是没有包名的   

    sql += "(";  

     for (int i = 1; i < f.length; i++) {  

      // 连接字段名  

      sql += f[i].getName() + ",";   

    }   

    // 因为最后会多出‘,’,所以通过substring截取掉   

    sql = sql.substring(0, sql.lastIndexOf(','));   

    sql += ") values (";  

     for (int i = 1; i < f.length; i++) {    

    sql += "?,";   

    }  

     sql = sql.substring(0, sql.lastIndexOf(',')) + ")";  

     PreparedStatement pstm = null;   

    Connection conn = ConnDB.getConn();  

     try {    

    pstm = conn.prepareStatement(sql);    

    Object object = pstm;   

     // 获取到prepareStatement类    

    Class<? extends Object> claPstm = object.getClass();    

    // 获取prepareStatement中的公有方法    

    Method[] methods = claPstm.getMethods();    

    // 为sql中的?赋值    

    for (int i = 1; i < f.length; i++) {    

     // 暴力反射    

     f[i].setAccessible(true);     

    for (Method method : methods) {     

     // 获取方法名      

    String name = method.getName();     

     // 截取,目的是为了跟字段的类型做比较      

    int index = name.indexOf("t") + 1;      

    // 如果方法名没有出现t字符,则返回的索引值为-1,这样通过截取会报错      

    if (index < 0) {      

     continue;      

    }      

    // 截取方法的类型的名称,比如setInt则截取剩下int跟要添加的类的字段的类型名进行比较      

    if (name.substring(index).equalsIgnoreCase( f[i].getType().getSimpleName())) {      

     // 拿到prepareStatement中对应的方法,run       

    method.invoke(object, i, f[i].get(o));       

    break;      

    }     

    }    

       judge = pstm.executeUpdate();   

    } catch (Exception e) {    

    e.printStackTrace();   

    } finally {    

    ConnDB.close(pstm, null, null, conn);   

    }   

    return judge;  

    }

    /**
      * 修改,适用于没有属性类的类进行数据库修改
      * @param o 类
      * @return 受影响行数
      */
     public  int update(Object o) {
      int judge = -1;
      // 反射出私有字段
      Field[] f = o.getClass().getDeclaredFields();
      // 组装数组库语句
      String sql = "update " + o.getClass().getSimpleName();// o.getClass().getSimpleName()获取的是没有包名的
      sql += " set ";

    for (int i = 1; i < f.length; i++) {
       // 连接字段名
       sql += f[i].getName() + "=?,";
      }
      // 因为最后会多出‘,’,所以通过substring截取掉
      sql = sql.substring(0, sql.lastIndexOf(','));
      sql+=" where "+f[0].getName()+"=?";
      PreparedStatement pstm = null;
      Connection conn = ConnDB.getConn();

    try {
       pstm = conn.prepareStatement(sql);
       Object object = pstm;
       // 获取到prepareStatement类
       Class<? extends Object> claPstm = object.getClass();
       // 获取prepareStatement中的公有方法
       Method[] methods = claPstm.getMethods();
       int index=0;
       // 为sql中的?赋值
       for (; index < f.length; index++) {
        // 暴力反射
        f[index].setAccessible(true);
        for (Method method : methods) {
         // 获取方法名
         String name = method.getName();
         // 截取,目的是为了跟字段的类型做比较
         int index1 = name.indexOf("t") + 1;
         // 如果方法名没有出现t字符,则返回的索引值为-1,这样通过截取会报错
         if (index1 < 0) {
          continue;
         }
         // 截取方法的类型的名称,比如setInt则截取剩下int跟要添加的类的字段的类型名进行比较
         if (name.substring(index1).equalsIgnoreCase(
           f[index].getType().getSimpleName())) {
          if(index>0){
           // 拿到prepareStatement中对应的方法,run
           method.invoke(object, index, f[index].get(o));
          }else {
           // 拿到prepareStatement中对应的方法,run
           method.invoke(object, f.length, f[index].get(o));
          }
         }
        }
       }
       judge = pstm.executeUpdate();
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       ConnDB.close(pstm, null, null, conn);
      }
      return judge;

    }

    /**
      * 删除
      * @param o 类
      * @return 受影响行数
      */
     public  int delete(Object o) {

    int judge = -1;
      // 反射出私有字段
      Field[] f = o.getClass().getDeclaredFields();
      // 组装数组库语句
      String sql = "delete from  " + o.getClass().getSimpleName();// o.getClass().getSimpleName()获取的是没有包名的
      sql += " where  ";
      // 连接字段名
      sql += f[0].getName() + "=?";
      PreparedStatement pstm = null;
      Connection conn = ConnDB.getConn();
      try {
       pstm = conn.prepareStatement(sql);
       Object object = pstm;
       // 获取到prepareStatement类
       Class<? extends Object> claPstm = object.getClass();
       // 获取prepareStatement中的公有方法
       Method[] methods = claPstm.getMethods();
       int index=0;
       // 为sql中的?赋值
       // 暴力反射
       f[index].setAccessible(true);
       for (Method method : methods) {
        // 获取方法名
        String name = method.getName();
        // 截取,目的是为了跟字段的类型做比较
        int index1 = name.indexOf("t") + 1;
        // 如果方法名没有出现t字符,则返回的索引值为-1,这样通过截取会报错
        if (index1 < 0) {
         continue;
        }
        // 截取方法的类型的名称,比如setInt则截取剩下int跟要添加的类的字段的类型名进行比较
        if (name.substring(index1).equalsIgnoreCase(
          f[index].getType().getSimpleName())) {
          // 拿到prepareStatement中对应的方法,run
          method.invoke(object, index+1, f[index].get(o));
        }
       }
       judge = pstm.executeUpdate();
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       ConnDB.close(pstm, null, null, conn);
      }
      return judge;

    }

    }

  • 相关阅读:
    四则运算的改进
    小学四则运算
    基于控制台的小学四则运算
    软件工程实践项目课程的自我目标
    课程总结
    个人作业 软件案例分析
    第一次技术博客
    结对第二次作业
    软工2
    软件工程第一次作业
  • 原文地址:https://www.cnblogs.com/danmao/p/3826982.html
Copyright © 2011-2022 走看看