UML软件工程组织

封装JDBC,简单快捷的使用PreparedStatement对象 
作者:shaokun305
在使用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语句的时候太麻烦了,很容易出错,所以我油写了一个简单的“代码生成器”
给开发中减少了大量繁琐的工作,尽管比较简单,但确实很耗用。代码我将在下一篇文章中给出。
 

版权所有:UML软件工程组织