封装JDBC,简单快捷的使用PreparedStatement对象

在使用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语句的时候太麻烦了,很容易出错,所以我油写了一个简单的“代码生成器”
给开发中减少了大量繁琐的工作,尽管比较简单,但确实很耗用。代码我将在下一篇文章中给出。
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DAO模式是一种设计模式,用于封装数据访问逻辑,使它与业务逻辑分离。在使用JDBC技术连接mysql数据库时,可以使用DAO模式来帮助我们封装数据访问逻辑,提高代码的可维护性和可扩展性。 以下是一个简单的示例,演示如何使用DAO模式封装使用JDBC技术连接mysql数据库: 1. 创建一个DAO接口,定义数据访问方法: ``` public interface UserDao { User getUserById(int userId) throws SQLException; void addUser(User user) throws SQLException; void updateUser(User user) throws SQLException; void deleteUser(int userId) throws SQLException; } ``` 2. 创建一个User类,用于表示数据库中的一条记录: ``` public class User { private int id; private String name; private int age; // getters and setters } ``` 3. 创建一个UserDaoImpl类,实现UserDao接口,并使用JDBC技术连接mysql数据库,完成数据访问操作: ``` public class UserDaoImpl implements UserDao { private Connection conn; public UserDaoImpl() throws SQLException { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); } public User getUserById(int userId) throws SQLException { String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, userId); ResultSet rs = stmt.executeQuery(); User user = null; if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); } rs.close(); stmt.close(); return user; } public void addUser(User user) throws SQLException { String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setInt(2, user.getAge()); stmt.executeUpdate(); stmt.close(); } public void updateUser(User user) throws SQLException { String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setInt(2, user.getAge()); stmt.setInt(3, user.getId()); stmt.executeUpdate(); stmt.close(); } public void deleteUser(int userId) throws SQLException { String sql = "DELETE FROM users WHERE id = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, userId); stmt.executeUpdate(); stmt.close(); } } ``` 4. 在应用程序中使用UserDaoImpl类,进行数据访问操作: ``` UserDao userDao = new UserDaoImpl(); // 添加一条记录 User user = new User(); user.setName("Tom"); user.setAge(18); userDao.addUser(user); // 更新一条记录 user = userDao.getUserById(1); user.setName("Jerry"); user.setAge(20); userDao.updateUser(user); // 删除一条记录 userDao.deleteUser(2); ``` 以上就是使用DAO模式封装使用JDBC技术连接mysql数据库简单示例。在实际应用中,可以根据需要进行更复杂的数据访问操作,并在DAO接口中定义相应的方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值