• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • 封装JDBC,简单快捷的使用PreparedStatement对象

    日期:2003-03-27  地址:  作者:

    在使用jdbc操作数据库中,最常用的操作便是对数据库实现增,删,改,查四种基本的操作,在一般的java操作模式下,常用的是使用一个数据对象(就是和数据库中表列对应的数据结构,只用set和get方法),但是,在写的过程中,使用PreparedStatement时,就会出现,对象的参数之间的对应耦合太强还要写太多的set参数方法,很繁琐。,所以我就为此写了一个封装类,其实很简单,就是使用一个对象数组保存不确定的?参数。具体的看代码:

     

    /** *
     /** * 
    Title: 
     * 
    Description:对数据库实际操作的封装类 
     * 
    Copyright: Copyright (c) 2004
     * 
    Company: 
     * @author 陈少坤 qq:29189725 
    * @version 1.0 DBOperator */ 
    import java.sql.*;
    public class DBOperator {  private DBConnectionManager db = null;  private java.sql.PreparedStatement ps = null;  private java.sql.ResultSet rs=null;  private Connection con = null;
      public DBOperator() {    initialize();  }
      private void initialize() {    db = DBConnectionManager.getInstance();    con = db.getConnection("idb");  }
      /**   *所有对数据库操作中需要返回RestsultSet的字符串 for example select   * @param sql sql字符串   * @param params   * @return   */  public ResultSet select(String sql, Object[] params) {    rs = null;    try {      ps = con.prepareStatement(sql);      int index = 1;      if (params != null) {        int n = params.length;        if (n < 2 || n % 2 != 0 || (n/2)!=this.getStrNum(sql,"?")) {          throw new IllegalArgumentException(              "参数为奇数或者是小于2,或者是参数的个数不一致");        }        for (int i = 0; i < params.length; i += 2) {          params[i+1]=this.pareObjToStr(params[i+1]);//把第二个参数对象转换为字符串类型          if ( ( (String) params[i]).toLowerCase().equals("string")) {            ps.setString(index++, (String) params[i + 1]);          }          if ( ( (String) params[i]).toLowerCase().equals("long")) {            ps.setLong(index++, Long.parseLong( (String) params[i + 1]));          }          if ( ( (String) params[i]).toLowerCase().equals("int")) {            ps.setInt(index++, Integer.parseInt( (String) params[i + 1]));          }          if ( ( (String) params[i]).toLowerCase().equals("date")) {            ps.setString(index++, (String) params[i + 1]);          }          if ( ( (String) params[i]).toLowerCase().equals("float")) {           ps.setFloat(index++, Float.parseFloat((String) params[i + 1]));         }         if ( ( (String) params[i]).toLowerCase().equals("double")) {           ps.setDouble(index++, Double.parseDouble((String) params[i + 1]));         }
              if ( ( (String) params[i]).toLowerCase().equals("image")) {            ps.setBytes(index++, (byte[]) params[i + 1]);
              }        }      }      rs = ps.executeQuery();    }    catch (NumberFormatException ex) {      ex.printStackTrace();    }    catch (SQLException ex) {      ex.printStackTrace();    }    return rs;  }  /**   *所有对数据库的更新操作 contains(insert update delete)   * @param sql 带参数的sql语句   * @param params 参数数组   * @return   */  public int update(String sql, Object[] params)  {    int num = 0;    try {      ps = con.prepareStatement(sql);      int index = 1;      if (params != null) {        int n=params.length;        if (n < 2 || n % 2 != 0 || (n/2)!=this.getStrNum(sql,"?")) {          throw new IllegalArgumentException(              "参数为奇数或者是小于2,或者是参数的个数不一致");        }        for (int i = 0; i < params.length; i += 2) {
              params[i+1]=this.pareObjToStr(params[i+1]);//吧第二个参数对象转换为字符串类型
              if ( ( (String) params[i]).toLowerCase().equals("string")) {            ps.setString(index++, (String) params[i + 1]);          }          if ( ( (String) params[i]).toLowerCase().equals("long")) {            ps.setLong(index++, Long.parseLong( (String) params[i + 1]));          }          if ( ( (String) params[i]).toLowerCase().equals("int")) {            ps.setInt(index++, Integer.parseInt( (String) params[i + 1]));          }          if ( ( (String) params[i]).toLowerCase().equals("date")) {           ps.setString(index++, (String) params[i + 1]);          }          if ( ( (String) params[i]).toLowerCase().equals("float")) {            ps.setFloat(index++, Float.parseFloat((String) params[i + 1]));          }          if ( ( (String) params[i]).toLowerCase().equals("double")) {            ps.setDouble(index++, Double.parseDouble((String) params[i + 1]));          }
              if ( ( (String) params[i]).toLowerCase().equals("image")) {            ps.setBytes(index++, (byte[]) params[i + 1]);
              }        }      }      num = ps.executeUpdate();    }    catch (NumberFormatException ex) {      ex.printStackTrace();    }    catch (SQLException ex) {      ex.printStackTrace();    }
        return num;
      }
      /**   * 把Object类型对象按照相应的类型进行转换,返回String类型   * @param obj   * @return 返回String类型   */  private String pareObjToStr(Object obj){    if(obj==null)      return null;    if(obj instanceof String)      return obj.toString();    if(obj instanceof Integer)      return ((Integer)obj).toString();    if(obj instanceof Long)      return ((Long)obj).toString();    if(obj instanceof Float)      return ((Float)obj).toString();    if(obj instanceof Double)      return ((Double)obj).toString();    if(obj instanceof java.util.Date)      return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((java.util.Date)obj);
        return obj.toString();  }
      /**   *统计原来的字符串中包含的实际字符串的个数   * @param sql 原来的字符串   * @param str 其中包含的字符串   * @return 原字符从串中包含的字符串的个数   */  private int getStrNum(String sql,String str) {    int num = 0;    int index = sql.indexOf(str);    while (index != -1) {      num++;      index=sql.indexOf(str,index+str.length());    }    return num;  }
      /**   * 释放数据库连接资源   */  public void freeCon(){
        try {      if (rs != null) {        rs.close();      }      if (ps != null) {        ps.close();      }      if (con != null) {        db.freeConnection("idb", con);      }    }    catch (SQLException ex) {      ex.printStackTrace();    }  }
     
    public static void main(String args[]){    DBOperator dbe=new DBOperator();
        String sql="select *from year_sub_com where id=4";    dbe.select(sql,null);    dbe.freeCon();  }}
    使用很简单:所有的查询可以使用select方法,其他的增,删,改,可以使用update方法。其中的两个参数,
    一个是带着?的sql语句,另一个是对应?的对象数组,数组的个数是?的2倍,应为它有类型和值。例如1:
     String sql="delete from year_performance_basic_target  where id=?";    DBOperator dbo=new DBOperator();    Object[] para={"long",""+id};    dbo.update(sql,para);
    例如2:
    String sql="select *from year_stat_person where com_code=? and sum_year=?";    DBOperator dbo=new DBOperator();    Object[] para={"string",com_code,"int",""+year};    ResultSet rs=dbo.select(sql,para);
    在后来的开发中,我发现如果要对多个表都要实现增,删,改,操作,并且表的字段很多的话比如近百个字段,
    那么在写插入sql语句和update sql语句的时候太麻烦了,很容易出错,所以我油写了一个简单的“代码生成器”
    给开发中减少了大量繁琐的工作,尽管比较简单,但确实很耗用。代码我将在下一篇文章中给出。
     

    对 封装JDBC,简单快捷的使用PreparedStatement对象 文章的评论    [查看网友评论]

    验证码:
    匿名发表: