Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » 技术文章库  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 用一个JavaBean封装JDBC操作
heisedebaise



发贴: 0
积分: 0
于 2004-05-14 19:39 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
关于数据库在项目开发中的重要性,我想不用我在此多费唇舌;因此关于对数据库操作的重要性我想更不需要我在此大声疾呼!然而你是否思考过这样的几个问题:在你的每一个项目中共有多少子项目需要对数据库进行操作?你为此设计的操作数据库的JavaBean是否能满足不同子项目的要求?当用户要求采用其他数据库系统时你是否需要对已经编译好的Class文件重新编译?
如果你是一位很勤奋的程序员,你可能会说:“无所谓,只要修改一下连接方式然后再编译一下就OK了!”然而你是否曾经想过,如果我们可以花一点时间把这个JavaBean完善一下,我们甚至连这种“修改”都可以省去?
笔者并不是一个勤奋的程序员,因此希望通过一个JavaBean来完成对数据库的大部分操作,同时希望该JavaBean能够满足对目前大部分主流数据库的操作。在此基础上写了一个JavaBean,目前暂时命名为LPWDatabaseOperation。以下为该JavaBean的相关信息:
一、支持对Oracle、Sybase、MySQL、SQLServer、DB2、PostgreSQL、Jdbc-Odbc-Bridge等数据库的DriverManager格式的操作;
二、提供了以Tomcate服务器为平台的数据源的操作(其他诸如WebLogic、WebSphere等大型服务器通常通过实体Bean来访问数据库,因此本程序没有提供对这两种服务器数据源的访问,但保留了相应位置,有兴趣的读者可以自己进行补充。);
三、使用了唯一的一个方法executeSQL对数据的增加、删除、修改和查询等操作进行统一处理,省去了记忆多个方法的麻烦;
四、提供了对分页显示的简单支持。
本文提供了该JavaBean的完整源代码,同时源代码中有详细的文档注释,有兴趣的读者可以将其编译成开发文档,以供随时参考。源代码如下:
package lpw.beans;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright Coffee 2004</p>
* <p>Company: 吕培文</p>
* @author not attributable
* @version 1.0
*/
public class LPWDatabaseOperation
{
  /**
   * 使用Oracle格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useOracleDriverManager = 0;
  /**
   * 使用Sybase格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useSybaseDriverManager = 1;
  /**
   * 使用MySQL格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useMysqlDriverManager = 2;
  /**
   * 使用SQLServer格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useSqlserverDriverManager = 3;
  /**
   * 使用DB2格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useDb2DriverManager = 4;
  /**
   * 使用Informix格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useInformixDriverManager = 5;
  /**
   * 使用PostgreSQL格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int usePostgresqlDriverManager = 6;
  /**
   * 使用Jdbc-Odbc-Bridge格式的DriverManager
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useJdbcOdbcBridge = 7;
  /**
   * 使用Tomcate格式的DataSource
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useTomcateDataSource = 8;
  /**
   * 使用WebLogic格式的DataSource
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useWeblogicDataSource = 9;
  /**
   * 使用WebSphere格式的DataSource
   * @see LPWDatabaseOperation#getUseContextType
   */
  public final int useWebsphereDataSource = 10;
  ////////////////////////////////////////////////////////////////////////////
  private String[] driverManagerType;
  private int useContextType;
  private int pageSize,pageCount,absolutePage,recordCount;
  ////////////////////////////////////////////////////////////////////////////
  private Connection connection;
  private PreparedStatement preparedStatement;
  private ResultSet resultSet;

  /**
   * 构造LPWDatabaseOperation。
   * 在构造时需选择所使用的环境类型,
   * LPWDatabaseOperation支持多种主流的DriverManager驱动及DataSource环境,
   * 并定义了一些常用DriverManager和DataSource的标准格式,
   * 其中包括Oracle、Sybase、MySQL、SQLServer等主流数据库的DriverManager格式,
   * 以及Jdbc-Odbc-Bridge的标准格式,
   * 同时还提供了Tomcate、WebLogic和WebSphere下DataSource的标准格式,
   * 程序员在使用时只需要选择相应的常量即可。
   * @param useContextType int<br>使用的环境类型
   * @see LPWDatabaseOperation#getUseContextType
   */
  public LPWDatabaseOperation(int useContextType)
  {
    if(useContextType<0) useContextType = 0;
    if(useContextType>7) useContextType = 7;
    this.useContextType = useContextType;
    ////////////////////////////////////////////////////////////////////////
    this.driverManagerType[this.useOracleDriverManager] = new String("oracle.jdbc.driver.OracleDriver");
    this.driverManagerType[this.useSybaseDriverManager] = new String("com.sybase.jdbc.SybDriver");
    this.driverManagerType[this.useMysqlDriverManager] = new String("com.mysql.jdbc.Driver");
    this.driverManagerType[this.useSqlserverDriverManager] = new String("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    this.driverManagerType[this.useDb2DriverManager] = new String("com.ibm.db2.jdbc.app.DB2Driver");
    this.driverManagerType[this.useInformixDriverManager] = new String("com.informix.jdbc.IfxDriver");
    this.driverManagerType[this.usePostgresqlDriverManager] = new String("org.postgresql.Driver");
    this.driverManagerType[this.useJdbcOdbcBridge] = new String("sun.jdbc.odbc.JdbcOdbcDrive");
    ////////////////////////////////////////////////////////////////////////
    this.pageSize = 20;
    this.pageCount = 0;
    this.absolutePage = 0;
    this.recordCount = 0;
    ////////////////////////////////////////////////////////////////////////
    this.connection = null;
    this.preparedStatement = null;
    this.resultSet = null;
  }

  /**
   * 打开数据库,需要给该方法提供数据库的URL地址、用户名称及用户密码。
   * 成功打开数据库后便可通过executeSQL方法对数据库进行操作。
   * @param databaseURL String<br>数据库的URL地址,如果使用DataSource则为数据库的JNDI-Name
   * @param userName String<br>用户名称
   * @param password String<br>用户密码
   * @throws java.sql.SQLException
   * @throws java.lang.ClassNotFoundException
   * @throws javax.naming.NamingException
   */
  public void openDatabase(String databaseURL,String userName,String password)
    throws java.sql.SQLException,java.lang.ClassNotFoundException,javax.naming.NamingException
  {
    if(this.useContextType>=0 && this.useContextType<=this.useJdbcOdbcBridge)
    {
      Class.forName(this.driverManagerType[this.useContextType]);
      this.connection = DriverManager.getConnection(databaseURL,userName,password);
    }
    else if(this.useContextType==this.useTomcateDataSource)
    {
      Context context = new InitialContext();
      DataSource dataSource = (DataSource)context.lookup(databaseURL);
      this.connection = dataSource.getConnection(userName,password);
    }
    else if(this.useContextType==this.useWeblogicDataSource)
    {
    }
    else if(this.useContextType==this.useWebsphereDataSource)
    {
    }
  }

  /**
   * 执行SQL语句,可以是Select、Insert、Delete、Update中的任何一个。
   * @param sql String<br>欲被执行的SQL语句
   * @return ResultSet<br>如果执行查询操作,则返回该查询操作的ResultSet;如果执行的是其它操作,则返回null。
   * @throws java.sql.SQLException
   */
  public ResultSet executeSQL(String sql) throws java.sql.SQLException
  {
    sql = sql.trim();
    this.preparedStatement = this.connection.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    if(sql.substring(0,1).equalsIgnoreCase("s"))
    {
      this.resultSet = this.preparedStatement.executeQuery(sql);
      return this.resultSet;
    }
    else
    {
      this.preparedStatement.executeUpdate(sql);
      return null;
    }
  }

  /**
   * 关闭数据库
   * @throws java.sql.SQLException
   */
  public void closeDatabase() throws java.sql.SQLException
  {
    if(this.resultSet!=null)
    {
      this.resultSet.close();
    }
    if(this.preparedStatement!=null)
    {
      this.preparedStatement.close();
    }
    if(this.connection!=null)
    {
      this.connection.close();
    }
  }

  /**
   * 获得当前使用的环境类型。
   * 这些值由LPWDatabaseOperation定义:<br>
   * useOracleDriverManager - 使用Oracle格式的DriverManager<br>
   * useSybaseDriverManager - 使用Sybase格式的DriverManager<br>
   * useMysqlDriverManager - 使用MySQL格式的DriverManager<br>
   * useSqlserverDriverManager - 使用SQLServer格式的DriverManager<br>
   * useDb2DriverManager - 使用DB2格式的DriverManager<br>
   * useInformixDriverManager - 使用Informix格式的DriverManager<br>
   * usePostgresqlDriverManager - 使用PostgreSQL格式的DriverManager<br>
   * useJdbcOdbcBridge - 使用Jdbc-Odbc-Bridge格式的DriverManager<br>
   * useTomcateDataSource - 使用Tomcate格式的DataSource<br>
   * useWeblogicDataSource - 使用WebLogic格式的DataSource<br>
   * useWebsphereDataSource - 使用WebSphere格式的DataSource
   * @see LPWDatabaseOperation#useOracleDriverManager
   * @see LPWDatabaseOperation#useSybaseDriverManager
   * @see LPWDatabaseOperation#useMysqlDriverManager
   * @see LPWDatabaseOperation#useSqlserverDriverManager
   * @see LPWDatabaseOperation#useDb2DriverManager
   * @see LPWDatabaseOperation#useInformixDriverManager
   * @see LPWDatabaseOperation#usePostgresqlDriverManager
   * @see LPWDatabaseOperation#useJdbcOdbcBridge
   * @see LPWDatabaseOperation#useTomcateDataSource
   * @see LPWDatabaseOperation#useWeblogicDataSource
   * @see LPWDatabaseOperation#useWebsphereDataSource
   * @return int<br>当前使用的环境类型
   */
public int getUseContextType()
{
    return useContextType;
  }

  /**
   * 设置当前将要显示的页码,每页显示的数据行数由setPageSize方法的参数值决定,
   * 当输入的页码值小于1时,将显示第一页数据;
   * 当输入的页码值大于最后一页的页码值时,将显示最后一页。
   * 需要注意的是,通过setAbsolutePage来对结果集进行定位,不会使查询结果集发生改变,
   * 而只是对结果集中的指针(cursor)进行了定位。
   * 因此如果程序员想得到真正的分页效果,应参照如下程序实现相应的功能:<br>
   * LPWDatabaseOperation database;<br>
   * ···<br>
   * ResultSet resultSet = database.executeSQL("Select * From Table");<br>
   * ···<br>
   * database.setPageSize(20);<br>
   * database.setAbsolutePage(2);<br>
   * for(int i=1;i<=database.getPageSize();i++)<br>
   * {<br>
   *     ···<br>
   *     if(resultSet.isLast())<br>
   *     {<br>
   *         break;<br>
   *     }<br>
   *     resultSet.next();<br>
   * }
   * @see LPWDatabaseOperation#setPageSize
   * @param absolutePage int<br>欲显示的页码值
   */
public void setAbsolutePage(int absolutePage)
{
    this.getPageCount();
    if(absolutePage<1) absolutePage = 1;
    if(absolutePage>this.pageCount) absolutePage = this.pageCount;
    this.absolutePage = absolutePage;
  }
  /**
   * 获得当前显示的页码值
   * @return int<br>当前显示的页码值
   */
public int getAbsolutePage()
{
    return absolutePage;
  }

  /**
   * 设置每页显示记录的条数。
   * 当输入的参数值小于1时,每页显示一条记录;
   * 当输入的参数值大于记录总数时,将显示所有数据;
   * 默认情况下每页将显示20条记录。
   * 程序员可通过setAbsolutePage方法改变当前显示的页码。
   * @see LPWDatabaseOperation#setAbsolutePage
   * @param pageSize int<br>每页显示数据的行数
   */
public void setPageSize(int pageSize)
{
    if(pageSize<1) pageSize = 1;
    this.pageSize = pageSize;
  }
  /**
   * 获得每页显示记录的条数
   * @return int<br>每页显示记录的条数
   */
public int getPageSize()
{
    return pageSize;
  }

  /**
   * 获得记录结果集显示的总的页数,其值为:总的记录数/每页显示的记录数[+1]。
   * @return int<br>记录结果集显示的总的页数
   */
public int getPageCount()
{
    this.getRecordCout();
    this.pageCount = this.recordCount/this.pageSize;
    if((this.recordCount%this.pageSize!=0)) this.pageCount++;
    return pageCount;
  }

  /**
   * 获得记录结果集总的记录数
   * @return int<br>记录结果集总的记录数
   */
  public int getRecordCout()
  {
    try
    {
      if(this.resultSet.last())
      {
        this.recordCount = this.resultSet.getRow();
      }
      else
      {
        this.recordCount = 0;
      }
    }
    catch(java.sql.SQLException e)
    {
    }
    finally
    {
      return this.recordCount;
    }
  }
}




话题树型展开
人气 标题 作者 字数 发贴时间
8745 用一个JavaBean封装JDBC操作 heisedebaise 11002 2004-05-14 19:39

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923