创建通用数据库访问包装类

package skydev.modules.data;

import java.sql.*;

/**
 * 使用ODBC的方法:<br>
 * "sun.jdbc.odbc.JdbcOdbcDriver"<br>
 * "jdbc:odbc:" + odbcName<br>
 *
 * "oracle.thin.Driver"<br>
 * "qwe.sql.qweMySqlDriver"<br>
 * "symantec.dbanywhere.Driver"<br>
 *
 * 访问MS SQLServer的方法<br>
 * driveName="com.microsoft.jdbc.sqlserver.SQLServerDriver";<br>
 * url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo";<br>
 * 访问MySQL的方法:<br>
 * DBDriver=com.mysql.jdbc.Driver<br>
 * URL=jdbc:mysql://localhost/demo<br>
 */

public abstract class AbstractConnectionFactory {

  private String userName;
  private String password;
  private String driverName;
  private String url;
  private java.sql.Connection connection;
  /**
   * 工厂方法,返回实际创建的连接对象
   * @return
   */

  /**
   * 根据设置的连接参数创建一个新的连接实例
   * @return
   */
  private Connection getNewConnection() {
    try {
      this.connection.close(); //试图关闭连接
    }
    finally {
      this.connection = null; //释放连接
      try {
        Class.forName(this.driverName); //加载驱动程序
        try {
          this.connection = DriverManager.getConnection(this.url, this.userName,
              this.password);
        }
        catch (SQLException e) {
          throw e;
        }
      }
      finally {
        return this.connection; //返回新建立的连接
      }
    }
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public String getDriverName() {
    return driverName;
  }

  public void setDriverName(String driverName) {
    this.driverName = driverName;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public java.sql.Connection getConnection() {
    if (connection != null) {
      try {
        if (connection.isClosed()) {
          connection = null;
          getNewConnection();
        }
      }
      catch (SQLException ex) {
      }
    }
    if (connection == null) { //没有设置连接则创建一个连接
      getNewConnection();
    }

    return connection;

  }

}
package skydev.modules.data;

public class ConnectionFactory
    extends AbstractConnectionFactory {

  public ConnectionFactory() {
  }

 

}
package skydev.modules.data;

import java.sql.*;
import java.sql.PreparedStatement;

public abstract class DatabaseObject {

  protected Connection connection = null;
  protected ResultSet resultSet = null;
  protected ResultSetMetaData resultSetMetaData = null;
  private ConnectionFactory connectionFactory = null;
  private java.sql.Statement statement=null;//=new Statement();

  public DatabaseObject() {
  }

  public DatabaseObject(ConnectionFactory connectionFactory) {
    this.setConnectionFactory(connectionFactory);
  }

  /**
   * 执行查询
   * @param sql 要执行的Sql语句
   * @return 返回查询的结果集 ,查询失败返回null
   */
  public ResultSet getResultSet(String sql) {
    // Statement stmt = null;
    try {
      //  stmt = connection.createStatement();
      this.resultSet = statement.executeQuery(sql); //保留内部指针
    }
    catch (SQLException e) {
      e.printStackTrace();
      this.resultSet = null;
    }
    finally {
      return this.resultSet;
    }
  }

  /**
   * 获取外部指定ResltSet的ResultSetMetaData数据
   * @param resultSet 要获取的ResultSet
   * @return 失败返回null
   */
  public ResultSetMetaData getResultSetMetaData(ResultSet resultSet) {
    ResultSetMetaData resultSetMetaData = null;
    try {
      resultSetMetaData = resultSet.getMetaData();
    }
    catch (SQLException e) {
      e.printStackTrace();
      resultSetMetaData = null;
    }
    finally {
      return resultSetMetaData;
    }
  }

  /**
   * 获取最近一次设置或者返回的ResultSet的ResultMetaData数据,
   * 比方说调用了:getResultSet(sql)方法,然后调用getResultSetMetaData方法
   * 可以获得相应的ResultSetMetaData数据。
   * @return
   */
  public ResultSetMetaData getResultSetMetaData() {
    return this.getResultSetMetaData(this.resultSet);
  }

  /**
   * 执行存储过程
   * @param spName 存储过程名称
   * @return
   */
  public ResultSet Execute(String spName) {
    //对此数据库执行一个 SQL 查询
    ResultSet resultSet = null;
    try {
      // PreparedStatement stmt = (PreparedStatement) connection.createStatement();
      resultSet = statement.executeQuery(spName);
    }
    catch (Exception e) {
      System.out.println("execute error" +
                         e.getMessage());
    }
    return resultSet;
  }

  /**
   * 设置数据库连接工厂,对此类的所有操作之前,必须调用该方法,
   * 设置数据库连接工厂。
   * @param connectionFactory 数据库连接工厂ConnectionFactory 类对象以及
   * 派生类对象。
   */
  public void setConnectionFactory(ConnectionFactory connectionFactory) {
    this.connectionFactory = connectionFactory;
    connection = connectionFactory.getConnection();
    try {
      statement = connection.createStatement();
    }
    catch (SQLException ex) {
      System.err.println(ex);
    }

  }

  public Connection getConnection() {
    return connection;
  }

  public java.sql.Statement getStatement() {
    return statement;
  }

}
package skydev.modules.data;


public class DbObject
    extends DatabaseObject {
 // private final static String driveName = "sun.jdbc.obdc.JdbcOdbcDriver";

  public DbObject() {
    super(new SqlServerConnectionFactory("localhost", 1433, "TheSchool", "sa",
                                         ""));
  }

  public DbObject(ConnectionFactory connectionFactory) {
    super(connectionFactory);
  }
}
package skydev.modules.data;

public final class SqlServerConnectionFactory
    extends ConnectionFactory {
  private final String dbDriver =
      "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  private String host;
  private int port;
  private String databaseName;

  public SqlServerConnectionFactory() {
    super.setDriverName(dbDriver);
  }

  /**
   *
   * @param host 数据库所在的主机名:如"localhost"
   * @param port SQL服务器运行的端口号,如果使用缺省值 1433,传入一个负数即可
   * @param databaseName 数据库名称
   * @param userName 用户名
   * @param password 口令
   */
  public SqlServerConnectionFactory(String host,
                                    int port,
                                    String databaseName,
                                    String userName,
                                    String password) {
    this.setHost(host);
    this.setPort(port);
    this.setDatabaseName(databaseName);
    this.setUserName(userName);
    this.setPassword(password);

    init();
  }

  private void init() {
    super.setDriverName(dbDriver);
    super.setUrl("jdbc:microsoft:sqlserver://" + host.trim() + ":" +
                 new Integer(port).toString() + ";DatabaseName=" +
                 databaseName.trim());
    //super.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo");
  }

  public void setHost(String host) {
    //处理主机名称
    if ( (host == null) || (host.equals("")) || (host.equals(".")) ||
        (host.equals("local"))) {
      host = "localhost";
    }

    int index = host.indexOf("//", 0);
    if (index == 0) {
      host = host.substring(2); //去掉前面的"//"
    }

    index = host.indexOf("//", 0);
    if (index >= 0) {
      try {
        throw new Exception("SQL Server主机名参数错误!");
      }
      catch (Exception ex) {
      }
    }

    this.host = host;
  }

  public void setPort(int port) {
    /**
     * 缺省端口1433
     */
    if (port < 0) {
      port = 1433;
    }

    this.port = port;
  }

  public void setDatabaseName(String databaseName) {
    this.databaseName = databaseName;
  }

}

 

package skydev.modules.data;

import junit.framework.*;
import java.sql.*;

public class TestSqlServerConnectionFactory
    extends TestCase {
  private SqlServerConnectionFactory sqlServerConnectionFactory = null;

  protected void setUp() throws Exception {
    super.setUp();
    /**@todo verify the constructors*/
    sqlServerConnectionFactory = new SqlServerConnectionFactory();
  }

  protected void tearDown() throws Exception {
    sqlServerConnectionFactory = null;
    super.tearDown();
  }

  public void testEmpty() {
    //   assertTrue(objCon.connectDatabase());
    assertEquals(sqlServerConnectionFactory.getDriverName(),
                 "com.microsoft.jdbc.sqlserver.SQLServerDriver");
  }

  public void testDB1() {

    DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",
        1433, "demo", "sa", ""));
    Connection con = DbO.getConnection();
    CallableStatement pstmt = null;
    System.out.println("TestDB1()............");
    /* try {
       pstmt = con.prepareCall("{call sp_getStudentById(?)}");
       pstmt.setInt(1, 1);
     }*/
    try {
      pstmt = con.prepareCall("{call sp_getStudentByName(?)}");
      pstmt.setString(1, "Tom");
    }

    catch (SQLException ex1) {
      System.out.println(ex1);
    }
    catch (Exception ex) {
      System.out.println(ex);
    }

    ResultSet results = null;
    ResultSetMetaData resultMetaData = null;
    try {
      // results = DbO.getResultSet("sp_getStudentByName");
      results = pstmt.executeQuery();
      resultMetaData = DbO.getResultSetMetaData(results);
      int cols = resultMetaData.getColumnCount();
      String resultRow = "/n字段/n";
      for (int i = 1; i <= cols; i++) {
        resultRow += resultMetaData.getColumnName(i) + ";";
      }
      System.out.println(resultRow);
      while (results.next()) {
        resultRow = "/n内容/n";
        for (int i = 1; i <= cols; i++) {
          try {
            resultRow += results.getString(i) + ";";
          }
          catch (NullPointerException e) {
            System.out.println(e.getMessage());
          }
        }
        System.out.println(resultRow);
      }
    }
    catch (SQLException ex) {
    }
  }

  public void testDB2() {
    DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",
        1433, "demo", "sa", ""));
    //DbO.setConnectionFactory(new SqlServerConnectionFactory());
    // Connection con = DbO.getConnection();
    System.out.println("TestDB2().........");
    ResultSet results = null;
    ResultSetMetaData resultMetaData = null;
    try {
      results = DbO.getResultSet("select * from  Persons;");
      resultMetaData = DbO.getResultSetMetaData();
      int cols = resultMetaData.getColumnCount();
      String resultRow = "/n字段/n";
      for (int i = 1; i <= cols; i++) {
        resultRow += resultMetaData.getColumnName(i) + ";";
      }
      System.out.println(resultRow);
      while (results.next()) {
        resultRow = "/n内容/n";
        for (int i = 1; i <= cols; i++) {
          try {
            resultRow += results.getString(i) + ";";
          }
          catch (NullPointerException e) {
            System.out.println(e.getMessage());
          }
        }
        System.out.println(resultRow);
      }
    }
    catch (SQLException ex) {
    }
  }

  public void testDB3() {

    DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",
        1433, "demo", "sa", ""));
    Connection con = DbO.getConnection();
    CallableStatement pstmt = null;
    System.out.println("TestDB3()............");
    try {
      pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}");
      pstmt.setString(2, "zengqingsong");
      pstmt.setInt(3, 22);

      pstmt.registerOutParameter(4, Types.INTEGER);
      pstmt.registerOutParameter(1, Types.INTEGER);
      int ret = pstmt.executeUpdate(); //执行影响的行数

      int ret2 = pstmt.getInt(1); //返回参数(输出参数)
      int id = pstmt.getInt(4); //输出参数
      System.out.println(ret);
      System.out.println(ret2);
      System.out.println(id);
    }

    catch (SQLException ex1) {
      System.out.println(ex1);
    }
    catch (Exception ex) {
      System.out.println(ex);
    }

  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值