当前位置: 首页 > 编程笔记 >

java 使用策略模式操作JDBC数据库

靳金鹏
2023-03-14
本文向大家介绍java 使用策略模式操作JDBC数据库,包括了java 使用策略模式操作JDBC数据库的使用技巧和注意事项,需要的朋友参考一下

java 使用策略模式操作JDBC数据库

1:构造一个操作数据库的工具类,可以获得连接和释放连接

public class DBUtil { 
  private static Connection conn = null; 
  static { //静态初始块 
      try { 
        Class.forName("com.mysql.jdbc.Driver"); 
        conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "064319"); //初始化获取连接 
      } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } 
  } 
 
  /** 
   * 释放连接 
   * @param rs 
   * @param psmt 
   * @param conn 
   * @throws SQLException 
   */ 
  public static void closeAll(ResultSet rs, PreparedStatement psmt, Connection conn) throws SQLException { 
     
    if(rs != null) { 
      rs.close(); 
    }  
     
    if(psmt != null) { 
      psmt.close(); 
    } 
     
    if(conn != null) { 
      conn.close(); 
    } 
     
  } 
   
  /** 
   * 获取连接 
   * @return 
   */ 
  public static Connection getConnection() { 
    return conn; 
  } 
   
  /** 
   * 根据表的名字来获得表的列信息 
   * @param tableName 
   */ 
  public static void getTableColumnInfoByTableName(String tableName) { 
    Connection conn = getConnection(); 
    ResultSet rs = null; 
    PreparedStatement psmt = null; 
    String sql = "select * from " + tableName; 
    try { 
      psmt = conn.prepareStatement(sql); 
      rs = psmt.executeQuery(); 
       
      ResultSetMetaData resultSetMetaData = rs.getMetaData(); 
      for(int i = 1; i<= resultSetMetaData.getColumnCount(); i++) { 
        System.out.println(resultSetMetaData.getColumnName(i)); 
      } 
       
    } catch (SQLException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        closeAll(rs, psmt, conn); 
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
   
  /** 
   * 根据表的名字来获得表的信息 
   * @param tableName 
   */ 
  public static void getTableInfoByTableName(String tableName) { 
    Connection conn = getConnection(); 
    PreparedStatement psmt = null; 
    ResultSet rs = null; 
    String sql = "select * from " + tableName; 
    try { 
      psmt = conn.prepareStatement(sql); 
      rs = psmt.executeQuery(); 
       
      while(rs.next()) { 
        ResultSetMetaData resultSetMetaData = rs.getMetaData(); 
        for(int i = 1; i<= resultSetMetaData.getColumnCount(); i++) { 
          if(i < resultSetMetaData.getColumnCount()) { 
            System.out.print(rs.getObject(resultSetMetaData.getColumnName(i)) + ", "); 
          } else { 
            System.out.print(rs.getObject(resultSetMetaData.getColumnName(i))); 
          } 
        } 
        System.out.println(); 
      } 
     
    } catch (SQLException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        closeAll(rs, psmt, conn); 
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

2:构造一个操作数据库的BaseDao类

public class BaseDao { 
   
  /** 
   * 根据一些参数来保存相应的对象 
   * @param sql 要执行的sql语句 
   * @param params 为sql语句中相应的参数赋值 
   * @return 
   */ 
  protected boolean saveOrUpdate(String sql, Object[] params) { 
    Connection conn = null; 
    PreparedStatement psmt = null; 
    boolean flag = false; 
     
    conn = DBUtil.getConnection(); 
    if(conn != null) { 
      try { 
        psmt = conn.prepareStatement(sql); 
        for(int i = 1; i <= params.length; i++) { 
          psmt.setObject(i, params[i-1]); 
        } 
        if(psmt.executeUpdate() > 0) { 
          flag = true; 
        } 
         
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } finally { 
        try { 
          DBUtil.closeAll(null, psmt, conn); 
        } catch (SQLException e) { 
          e.printStackTrace(); 
        } 
      } 
    }  
    return flag; 
  } 
   
  /** 
   * 根据一定的参数获得某个具体的对象 
   * @param sql 要执行的sql语句 
   * @param params 为sql语句中相应的参数赋值 
   * @return 
   */ 
  public Object queryForObject(String sql, Object[] params, RowMapForObject rowMapForObject) { 
    Connection conn = null; 
    PreparedStatement psmt = null; 
     
    conn = DBUtil.getConnection(); 
    Object obj = null; 
    ResultSet rs = null; 
     
    if(conn != null) { 
      try { 
        psmt = conn.prepareStatement(sql); 
        if(params != null && params.length > 0) { 
          for(int i = 1; i <= params.length; i++) { 
             psmt.setObject(i, params[i - 1]); 
          } 
        } 
        rs = psmt.executeQuery(); 
        obj = rowMapForObject.rowMapForObject(rs); 
         
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } finally { 
        try { 
          DBUtil.closeAll(null, psmt, conn); 
        } catch (SQLException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
     
    return obj; 
  } 
 
   
  /** 
   * 根据相应的参数获得查询的结果集 
   * @param sql 
   * @param params 
   * @return 
   */ 
  public List queryForList(String sql, Object[] params, RowMapForList rowMapForList) { 
    Connection conn = null; 
    PreparedStatement psmt = null; 
     
    conn = DBUtil.getConnection(); 
    List list = null; 
    ResultSet rs = null; 
     
    if(conn != null) { 
      try { 
        psmt = conn.prepareStatement(sql); 
        if(params != null && params.length > 0) { 
          for(int i = 1; i <= params.length; i++) { 
             psmt.setObject(i, params[i - 1]); 
          } 
        } 
        rs = psmt.executeQuery(sql); 
        list = new ArrayList(); 
        list = rowMapForList.rowMapForList(rs); 
         
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } finally { 
        try { 
          DBUtil.closeAll(null, psmt, conn); 
        } catch (SQLException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
     
    return list; 
  } 
   
} 

3:新建一个StudentDao类,该类继承自BaseDao,实现对Student的管理

public class StudentDao extends BaseDao { 
 
  /** 
   * 保存一个Student的信息 
   */ 
  public boolean saveStudent(Student student) { 
    String sql = "insert into t_student(name, age) values(?, ?)"; 
    Object[] params = new Object[]{student.getName(), student.getAge()}; 
    return super.saveOrUpdate(sql, params); 
  } 
   
  /** 
   * 根据id获得一个Student的信息 
   * @param id 
   * @return 
   */ 
  public Student getStudentById(long id) { 
    String sql = "select * from t_student where id=?"; 
    Object[] params = new Object[]{id}; 
    return (Student)super.queryForObject(sql, params, new RowMapForObject() { 
       
      public Object rowMapForObject(ResultSet rs) { 
        Student student = null; 
         try { 
          if(rs != null && rs.next()) { 
             student = new Student(); 
             student.setAge(rs.getInt(Student.AGE)); 
             student.setId(rs.getLong(Student.ID)); 
             student.setName(rs.getString(Student.NAME)); 
           } 
        } catch (SQLException e) { 
          e.printStackTrace(); 
        } 
         return student; 
      } 
    }); 
  } 
 
  /** 
   * 获得所有Student的信息 
   * @return 
   */ 
  public List getStudentAll() { 
    String sql = "select * from t_student"; 
    List list = super.queryForList(sql, null, new RowMapForList() { 
 
      @Override 
      public List rowMapForList(ResultSet rs) { 
        List list = null; 
        try { 
          if(rs != null) { 
            list = new ArrayList(); 
            while(rs.next()) { 
              Student student = new Student(); 
              student.setId(rs.getLong("id")); 
              student.setAge(rs.getInt("age")); 
              student.setName(rs.getString("name")); 
              list.add(student); 
            } 
          } 
        } catch(SQLException e) { 
          e.printStackTrace(); 
        } 
        return list; 
      } 
    }); 
     
    return list; 
  }   
} 

如有疑问请留言或者到本站社区交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 主要内容:介绍,实现,Strategy.java,OperationAdd.java,OperationSubtract.java,OperationMultiply.java,Context.java,StrategyPatternDemo.java在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 contex

  • 策略模式 亦称: Strategy 意图 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 问题 一天, 你打算为游客们创建一款导游程序。 该程序的核心功能是提供美观的地图, 以帮助用户在任何城市中快速定位。 用户期待的程序新功能是自动路线规划: 他们希望输入地址后就能在地图上看到前往目的地的最快路线。 程序的首个版本只能规划公

  • 把不变的部分和变化的部分隔开是每个设计模式的主题。 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。 一、定义 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...

  • 问题 解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。 解决方案 在策略对象(Strategy objects)中封装你的算法。 例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。 基类 StringSorter = (algorithm) -> sort: (list) -> algorithm list 策略 bubbleSort = (list) -

  • 应用场景 一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费 用两个文本框来输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,一个重置按钮来重新开始。 double total = 0.0d; private void btn0k_Click(object sender, EventArgs e) { double

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...

  • 策略模式 策略模式就是用统一的方法接口分别对不同类型的数据进行访问。比如说,现在我们想用pc看一部电影,此时应该怎么做呢?看电影嘛,当然需要各种播放电影的方法。rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。可是事实上,我们完全可以不去管是什么文件格式。因为播放器对所有的操作进行了抽象,不同的文件会自动调用相应的访问方法。 typedef struct _MovieP