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

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

(0)

相关推荐

  • 详解Java的JDBC API中事务的提交和回滚

    如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关闭自动提交和管理自己的事务: 为了提高性能 为了保持业务流程的完整性 使用分布式事务 若要控制事务,以及何时更改应用到数据库.它把单个SQL语句或一组SQL语句作为一个逻辑单元,而且如果任何语句失败,整个事务失败. 若要启用,而不是JDBC驱动程序默认使用auto-commit模式手动事务支持,使用Connection对象的的setAutoComm

  • 基于Java回顾之JDBC的使用详解

    尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis,但JDBC是Java用来实现数据访问的基础,掌握它对于我们理解Java的数据操作流程很有帮助. JDBC的全称是Java Database Connectivity. JDBC对数据库进行操作的流程:•连接数据库•发送数据请求,即传统的CRUD指令•返回操作结果集JDBC中常用的对象包括:•ConnectionManager•Connection•Statement•CallableStat

  • java jdbc连接mysql数据库实现增删改查操作

    jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的时候才能更好的去理解这些成熟的框架是如何去实现增删改查

  • 在eclipse导入Java的jar包的方法JDBC(图文说明)

    在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties  2.左边选择java build path,右边选择libraries  3.选择add External jars  4.选择jar包的按照路径下的 确定后就行了. Java连接MySQL的最新驱动包下载地址 http://www.mysql.com/downloads/connector/j 有两种方法导入jar包

  • Java开发Oracle数据库连接JDBC Thin Driver 的三种方法

    Oracle的jdbc驱动三种主要分类: 1.JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC 驱动.因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配置. 2.JDBC Thin: thin是for thin client的意思,这种驱动一般用在运行在WEB浏览器中的JAVA程序.它不是

  • Java使用JDBC连接数据库的实现方法

    本文实例讲述了Java使用JDBC连接数据库的实现方法,是Java数据库程序设计里非常实用的重要技巧.分享给大家供大家参考.具体如下: JDBC(Java Data Base Connectivity)数据库连接,通常我们在编写web应用或java应用程序要连接数据库时就要使用JDBC.使用JDBC连接数据库一般步骤有: 1.加载驱动程序 Class.forName(driver); 2.创建连接对象 Connection con = DriverManager.getConnection(ur

  • java使用jdbc连接数据库工具类和jdbc连接mysql数据示例

    这个工具类使用简单,实例化直接调用就可以了,大家还可以方便的根据自己的需要在里面增加自己的功能 复制代码 代码如下: package com.lanp.ajax.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException; /** * 连接数据库的工具类,被定

  • Java加载JDBC驱动程序实例详解

    本文实例说明了Java加载JDBC驱动程序的方法,运行本文实例代码后,如果连接成功就会显示如下一条语句:sun.jdbc.odbc.JdbcOdbcDriver@6ec12,如果连接不成功,则显示加载数据库驱动程序出现异常. Java加载JDBC的实现方法: 通过调用Class.forName()方法可以显式地加载一个驱动程序.该方法的入口参数为要加载的驱动程序.例如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")语句加载了SUN 公司开发的

  • 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/tes

  • Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二 模式举例 1 模式分析 我们借用商场促销商品来说明这一模式. 2 策略模式静态类图 3 代码示例 3.1 创建策略接口一IStrategy package com.demo.strategy; /** * 策略接口 * * @author * */ public inter

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • Java之策略模式比较器案例讲解

    Comparable 比较器,内置定义的比较方法,实现比较 较简单 Comparator 策略模式,需要定义不同的策略和比较的对象,实现比较 较复杂 打个比方,狗有foot一种属性我们用Comparable比较器完成比较 猫有height和weight两种属性,我们用Comparator策略模式完成比较 一.Comparable --狗比较 缺点:自定义排序规则,规则定义好之后,再改起来就不方便,还需要重新开发Sort比较类 1.狗对象 package com.longze.guosh.stra

  • Java使用策略模式实现聚石塔接口调用的问题

    背景 有个业务需求对接淘宝开放平台.这里面涉及到了聚石塔,聚石塔是阿里系的一款产品,可以理解为一个服务器,淘宝开发平台一些较为敏感的数据,会要求发布进聚石塔.外部需要调用要通过走奇门网关.奇门中心也有详细描述. 研究了一下文档发现,需要写两套代码: 1.第一套适配聚石塔接口,发布在聚石塔内: 2.更新最新的SDK,放在第二套代码,通过SDK里面的奇门调用 写代码之前还需要在奇门中心配置好自定义api场景,并且规定好统一的入参以及响应  重点!!聚石塔内,一个appKey在一个场景内,只能授权配置

  • Java利用策略模式实现条件判断,告别if else

    目录 定义 使用场景 案例 需求 实现方案 方案分析 总结 定义 策略模式定义了一系列算法,并且将每个算法封装起来,使得他们可以相互替换,而且算法的变化不会影响使用算法的客户端. 使用场景 一个系统需要动态的在几种算法中选择一种,可以把每个算法封装到具体的策略类中 一个类中定义了多种行为,可以去代替条件转移语句,减少硬编码 系统中各个算法或者说函数是彼此独立的,而且要求对客户隐藏算法具体实现细节的时候 多个类只区别在表现行为的不同,可以使用策略模式,在运行时动态的选择要执行的行为 案例 需求 根

  • 一起来了解Java的策略模式

    目录 策略模式 1.什么是策略模式 2.策略模式的优缺点 3.策略模式的结构 4.代码实现 5.策略模式的应用场景 总结 策略模式 策略模式属于Java 23种设计模式中行为模式之一,那先看看什么是策略模式. 1.什么是策略模式 策略模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户.策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理. 其实我们在现实生活中常常

  • java设计模式--策略模式详解

    目录 策略模式 Demo 代码: 总结 策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户. 主要解决:在有多种算法相似的情况下,使用 if-else 所带来的复杂和难以维护. 如何解决:将这些算法封装成一个一个的类,任意地替换. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 使用场景: 如果在一个系统

  • java实现策略模式使用示例

    思路如下: 使用interface来定义一个接口,在该接口中定义save()方法:根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:在主方法中实现接口.代码如下: 复制代码 代码如下: public interface ImageSaver {    void save();//定义save()方法} public class GIFSaver implements ImageSave

  • Java利用策略模式优化过多if else代码

    前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //doshomething }else if(c){ //doshomething } else{ ////doshomething } 条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错. 比如这样: 摘自cim中的一个客户端命令的判断条件. 刚开始条件较少,也就没管那么多直接写的:

随机推荐