天天看點

資訊系統開發實踐-任務釋出系統(TaskMS)(五)

作者:lgx0537

JavaBeans的設計和實作

(一)DataConvert類是一個工具類,實作string,date,int三種資料類型的互相轉換,為後續的程式設計提供便利。詳情如下:

package hrims.util;//打包的相對位址

import java.util.*;//引用系統類

import java.text.*;//引用系統類

import java.io.*;

//以上内容後續每個類都會有,相同的内容均不再重複介紹!

public class DataConvert {

public DataConvert(){}

// 此方法實作了将目前日期(格式:yyyy-MM-dd)轉換為String類型

public static String getStringDate()

{

java.util.Date currentTime = new java.util.Date();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

String dateString = formatter.format(currentTime);

return dateString;

}

/*說明:

Java.sql.Date和Java.util.Date的差別:

Java.sql.Date是Java.util.Date的子類

Java.util.Date:可以包含年月日時分秒

Java.sql.Date:隻能有年月日*/

//此方法實作了将String類型轉換為資料庫Date類型

public static java.sql.Date StrTosqlDate(String strDate)

{

if(strDate==null || strDate=="")

strDate = "1980-01-01";

return java.sql.Date.valueOf(strDate.substring(0, 10));

}

//此方法實作了将資料庫Date類型轉換為String類型

public static String sqlDateToStr(java.sql.Date dateDate)

{

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

String dateString = formatter.format(dateDate);

return dateString;

}

//此方法實作了将String類型轉換為int類型

public static int StrToInt(String str)

{

if(str==null || str == "")

return 0;

return Integer.parseInt(str);

}

//此方法實作了将int類型轉換為String類型

public static String IntToStr(int i)

{

return String.valueOf(i);

}

//此方法實作了将空字元串指派特定值

public static String ViewStr(String str)

{

if (str.equals(""))

return "空";

else

return str;

}

}

(二)DBConnect和DBConnectionManager類,用于實作資料庫連接配接。詳情如下:

package hrims.database;

import java.io.*;

import java.sql.*;

import java.util.*;

import java.util.Date;

public class DBConnectionManager {

static private DBConnectionManager instance; // 唯一執行個體

static private int clients;

private Vector drivers = new Vector();

private Hashtable pools = new Hashtable();

/**

* 将文本資訊在背景列印出來

*/

private void log(String msg) {

System.out.println(new Date() + ": " + msg);

}

/*

* 傳回唯一執行個體.如果是第一次調用此方法,則建立執行個體

*

* @return DBConnectionManager 唯一執行個體

*/

static synchronized public DBConnectionManager getInstance() {

if (instance == null) {

instance = new DBConnectionManager();

}

clients++;

return instance;

}

/**

* 建構函數私有以防止其它對象建立本類執行個體

*/

private DBConnectionManager() {

init();

}

/**

* 将連接配接對象傳回給由名字指定的連接配接池

*

* @param name

* 在屬性檔案中定義的連接配接池名字

* @param con

* 連接配接對象

*/

public void freeConnection(String name, Connection con) {

DBConnectionPool pool = (DBConnectionPool) pools.get(name);

if (pool != null) {

pool.freeConnection(con);

}

}

/**

* 獲得一個可用的(空閑的)連接配接.如果沒有可用連接配接,且已有連接配接數小于最大連接配接數 限制,則建立并傳回新連接配接

*

* @param name

* 在屬性檔案中定義的連接配接池名字

* @return Connection 可用連接配接或null

*/

public Connection getConnection(String name) {

DBConnectionPool pool = (DBConnectionPool) pools.get(name);

if (pool != null) {

return pool.getConnection();

}

return null;

}

/**

* 獲得一個可用連接配接.若沒有可用連接配接,且已有連接配接數小于最大連接配接數限制, 則建立并傳回新連接配接.否則,在指定的時間内等待其它線程釋放連接配接.

*

* @param name

* 連接配接池名字

* @param time

* 以毫秒計的等待時間

* @return Connection 可用連接配接或null

*/

public Connection getConnection(String name, long time) {

DBConnectionPool pool = (DBConnectionPool) pools.get(name);

if (pool != null) {

return pool.getConnection(time);

}

return null;

}

/**

* 關閉所有連接配接,撤銷驅動程式的注冊

*/

public synchronized void release() {

// 等待直到最後一個客戶程式調用

if (--clients != 0) {

return;

}

Enumeration allPools = pools.elements();

while (allPools.hasMoreElements()) {

DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();

pool.release();

}

Enumeration allDrivers = drivers.elements();

while (allDrivers.hasMoreElements()) {

Driver driver = (Driver) allDrivers.nextElement();

try {

DriverManager.deregisterDriver(driver);

log("撤銷JDBC驅動程式 " + driver.getClass().getName() + "的注冊");

} catch (SQLException e) {

log("無法撤銷下列JDBC驅動程式的注冊: " + driver.getClass().getName());

}

}

}

/**

* 根據指定屬性建立連接配接池執行個體.

*

* @param props

* 連接配接池屬性

*/

private void createPools(Properties props) {

Enumeration propNames = props.propertyNames();

while (propNames.hasMoreElements()) {

String name = (String) propNames.nextElement();

if (name.endsWith(".url"))

{

String poolName = "sqlserver";

String url = props.getProperty(poolName + ".url");

if (url == null)

{

log("沒有為連接配接池" + poolName + "指定URL");

continue;

}

String user = props.getProperty(poolName + ".user");

String password = props.getProperty(poolName + ".password");

String maxconn = props.getProperty(poolName + ".maxconn", "0");

int max;

try {

max = Integer.valueOf(maxconn).intValue();

} catch (NumberFormatException e) {

log("錯誤的最大連接配接數限制: " + maxconn + " .連接配接池: " + poolName);

max = 0;

}

DBConnectionPool pool = new DBConnectionPool(poolName, url,

user, password, max);

pools.put(poolName, pool);

log("成功建立連接配接池" + poolName);

}

}

}

/**

* 讀取屬性完成初始化

*/

private void init() {

InputStream is = getClass().getResourceAsStream("/hrims.txt");

Properties dbProps = new Properties();

try {

dbProps.load(is);

} catch (Exception e) {

log("不能讀取屬性檔案.請確定db.properties在CLASSPATH指定的路徑中");

return;

}

loadDrivers(dbProps);

createPools(dbProps);

}

/**

* 裝載和注冊所有JDBC驅動程式

*

* @param props

* 屬性

*/

private void loadDrivers(Properties props) {

String driverClasses = props.getProperty("driver");

StringTokenizer st = new StringTokenizer(driverClasses);

while (st.hasMoreElements()) {

String driverClassName = st.nextToken().trim();

try {

Driver driver = (Driver) Class.forName(driverClassName)

.newInstance();

DriverManager.registerDriver(driver);

drivers.addElement(driver);

log("成功注冊JDBC驅動程式" + driverClassName);

} catch (Exception e) {

log("無法注冊JDBC驅動程式: " + driverClassName + ", 錯誤: " + e);

}}}

/**

* 此内部類定義了一個連接配接池.它能夠根據要求建立新連接配接,直到預定的最大連接配接數為止.在傳回連接配接給客戶程式之前,它能夠驗證連接配接的有效性.

*/

class DBConnectionPool {

private int userCount;

private Vector freeConnections = new Vector();

private int maxConn;

private String name;

private String password;

private String URL;

private String user;

/**

* 建立新的連接配接池

*

* @param name

* 連接配接池名字

* @param URL

* 資料庫的JDBC URL

* @param user

* 資料庫帳号,或 null

* @param password

* 密碼,或 null

* @param maxConn

* 此連接配接池允許建立的最大連接配接數

*/

public DBConnectionPool(String name, String URL, String user,

String password, int maxConn) {

this.name = name;

this.URL = URL;

this.user = user;

this.password = password;

this.maxConn = maxConn;

}

/**

* 将不再使用的連接配接傳回給連接配接池

*

* @param con

* 客戶程式釋放的連接配接

*/

public synchronized void freeConnection(Connection con) {

// 将指定連接配接加入到向量末尾

freeConnections.addElement(con);

userCount--;

notifyAll();

}

/**

* 從連接配接池獲得一個可用連接配接.如沒有空閑的連接配接且目前連接配接數小于最大連接配接 數限制,則建立新連接配接.如原來登記為可用的連接配接不再有效,則從向量删除之,

* 然後遞歸調用自己以嘗試新的可用連接配接.

*/

public synchronized Connection getConnection() {

Connection con = null;

if (freeConnections.size() > 0) {

// 擷取向量中第一個可用連接配接

con = (Connection) freeConnections.firstElement();

freeConnections.removeElementAt(0);

try {

if (con.isClosed()) {

log("從連接配接池" + name + "删除一個無效連接配接");

// 遞歸調用自己,嘗試再次擷取可用連接配接

con = getConnection();

}

} catch (SQLException e) {

log("從連接配接池" + name + "删除一個無效連接配接");

// 遞歸調用自己,嘗試再次擷取可用連接配接

con = getConnection();

}

} else if (maxConn == 0 || userCount < maxConn) {

con = newConnection();

}

if (con != null) {

userCount++;

}

return con;

}

/**

* 從連接配接池擷取可用連接配接.可以指定客戶程式能夠等待的最長時間 參見前一個getConnection()方法.

*

* @param timeout

* 以毫秒計的等待時間限制

*/

public synchronized Connection getConnection(long timeout) {

long startTime = new Date().getTime();

Connection con;

while ((con = getConnection()) == null) {

try {

wait(timeout);

} catch (InterruptedException e) {

}

if ((new Date().getTime() - startTime) >= timeout) {

// wait()傳回的原因是逾時

return null;

}}

return con;

}

/**

* 關閉所有連接配接

*/

public synchronized void release() {

Enumeration allConnections = freeConnections.elements();

while (allConnections.hasMoreElements()) {

Connection con = (Connection) allConnections.nextElement();

try {

con.close();

log("關閉連接配接池" + name + "中的一個連接配接");

} catch (SQLException e) {

log("無法關閉連接配接池" + name + "中的連接配接");

}}

freeConnections.removeAllElements();

}

/**

* 建立新的連接配接

*/

private Connection newConnection() {

Connection con = null;

try {

if (user == null) {

con = DriverManager.getConnection(URL);

} else {

con = DriverManager.getConnection(URL, user, password);

}

log("連接配接池" + name + "建立一個新的連接配接");

} catch (SQLException e) {

log("無法建立下列URL的連接配接: " + URL);

return null;

}

return con;

}}}

package hrims.database;

import java.sql.*;

import hrims.database.DBConnectionManager;

public class DBConnect {

private Connection conn = null;

private Statement stmt = null;

private PreparedStatement prepstmt = null;

private DBConnectionManager dcm = null;

void init() {

dcm = DBConnectionManager.getInstance();

conn = dcm.getConnection("sqlserver");

}

/**

* 構造資料庫的連接配接和通路類

*/

public DBConnect() throws Exception {

init();

stmt = conn.createStatement();

}

public DBConnect(int resultSetType, int resultSetConcurrency)

throws Exception {

init();

stmt = conn.createStatement(resultSetType, resultSetConcurrency);

}

/**

* 構造資料庫的連接配接和通路類 預編譯SQL語句

*

* @param sql

* SQL語句

*/

public DBConnect(String sql) throws Exception {

init();

this.prepareStatement(sql);

}

public DBConnect(String sql, int resultSetType, int resultSetConcurrency)

throws Exception {

init();

this.prepareStatement(sql, resultSetType, resultSetConcurrency);

}

/**

* 傳回連接配接

*

* @return Connection 連接配接

*/

public Connection getConnection() {

return conn;

}

/**

* PreparedStatement

*

* @param sql 預設SQL語句

*/

public void prepareStatement(String sql) throws SQLException {

prepstmt = conn.prepareStatement(sql);

}

public void prepareStatement(String sql, int resultSetType,

int resultSetConcurrency) throws SQLException {

prepstmt = conn.prepareStatement(sql, resultSetType,

resultSetConcurrency);

}

/**

* 設定對應值

*

* @param index

* 參數索引

* @param value

* 對應值

*/

public void setString(int index, String value) throws SQLException {

prepstmt.setString(index, value);

}

public void setInt(int index, int value) throws SQLException {

prepstmt.setInt(index, value);

}

public void setBoolean(int index, boolean value) throws SQLException {

prepstmt.setBoolean(index, value);

}

public void setDate(int index, Date value) throws SQLException {

prepstmt.setDate(index, value);

}

public void setTimestamp(int index, Timestamp value) throws SQLException {

prepstmt.setTimestamp(index, value);

}

public void setLong(int index, long value) throws SQLException {

prepstmt.setLong(index, value);

}

public void setFloat(int index, float value) throws SQLException {

prepstmt.setFloat(index, value);

}

public void setBytes(int index, byte[] value) throws SQLException {

prepstmt.setBytes(index, value);

}

public void clearParameters() throws SQLException {

prepstmt.clearParameters();

prepstmt = null;

}

/**

* 傳回預設狀态

*/

public PreparedStatement getPreparedStatement() {

return prepstmt;

}

/**

* 傳回狀态

*

* @return Statement 狀态

*/

public Statement getStatement() {

return stmt;

}

/**

* 執行SQL語句傳回字段集

*

* @param sql

* SQL語句

* @return ResultSet 字段集

*/

public ResultSet executeQuery(String sql) throws SQLException {

if (stmt != null) {

return stmt.executeQuery(sql);

} else

return null;

}

public ResultSet executeQuery() throws SQLException {

if (prepstmt != null) {

return prepstmt.executeQuery();

} else

return null;

}

/**

* 執行SQL語句

*

* @param sql

* SQL語句

*/

public void executeUpdate(String sql) throws SQLException {

if (stmt != null)

stmt.executeUpdate(sql);

}

public void executeUpdate() throws SQLException {

if (prepstmt != null)

prepstmt.executeUpdate();

}

/**

* 關閉連接配接

*/

public void close() throws Exception {

if (stmt != null) {

stmt.close();

stmt = null;

}

if (prepstmt != null) {

prepstmt.close();

prepstmt = null;

}

if (conn != null) {dcm.freeConnection("sqlserver", conn);

}}}

繼續閱讀