首先,我是Java新手。最佳實踐:在Java中使用數據庫
我想弄清楚什麼是使用數據庫從Java工作的好方法。我正在使用c3p0進行連接池。 Hibernate或其他ORM這次不是一個選項,我們現在決定堅持使用「純SQL」。
數據目前基本檢索是這樣的:
private int getUserID(int sessionID, String userIP) {
int result = 0;
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// Application.cpds is an instance of c3p0's ComboPooledDataSource
conn = Application.cpds.getConnection();
st = conn.prepareStatement("SELECT user_id, user_ip, is_timed_out FROM g_user.user_session WHERE id = ?");
st.setInt(1, sessionID);
rs = st.executeQuery();
if (rs.next()) {
if (!rs.getBoolean("is_timed_out") && userIP.equals(rs.getString("user_ip"))) {
result = rs.getInt("user_id");
}
}
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (st != null) {
try { st.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
return result;
}
代碼看起來這樣的基本操作很長。另一個問題是大多數代碼必須在許多地方重複(聲明Connection,PreparedStatement,ResultSet,關閉它們,捕獲異常)。雖然,這是我在大多數谷歌搜索示例中看到的。
在PHP中,我將創建一個包裝類,該類將接受2個參數(字符串)sqlQuery和(數組)參數的方法select(),並返回簡單的數據數組。包裝類也有一些更具體的方法,如:
- selectValue()單值(例如,
select count(*) from user
) - selectRow()爲單行(例如,
select name, surname from user where id = :user_id
) - selectColumn單柱(例如,
select distinct remote_address from user
)
這是類似於Java中實踐的東西嗎?或者有什麼更好/更方便嗎?或者我應該使用與上面getUserID()
示例中相同的樣式嗎?正如我所說,這次ORM不是一種選擇。
感謝提前:)
編輯:目前DBConnection
類被寫入。它從構造函數中的c3p0連接池獲取連接。它具有與DB工作的幾個公共方法:select()
表格數據,selectValue()
單值,selectRow()
和selectColumn()
單行或列,以及insert()
,update()
,delete()
和ddl()
。方法接受String query, Object[] params
參數,其中params
是可選的。 insert()
,update()
和delete()
返回Integer
這是PreparedStatement.executeUpdate()
的結果。 select
方法返回不同的結果:
ArrayCollection<HashMap<String, Object>> select()
Object selectValue()
HashMap<String, Object> selectRow()
ArrayCollection<Object> selectColumn()
最後一個問題是編譯器警告 - "warning: [unchecked] unchecked cast"
。這是因爲所有方法都會調用返回Object
的單個私有方法,並將其結果轉換爲提及的類型。由於我是Java新手,我也不確定是否爲選擇選擇了適當的類型。除此之外,一切似乎都按預期工作。
關於伐木 - 是的,我應該。還沒有任何時間去研究它,但我有我的待辦事項清單;) – binaryLV 2010-08-02 10:32:36
這是一個nobrainer,如果你只是抓住log4j。應該只花兩到三個小時來理解概念並將其整合:http://logging.apache.org/log4j/ – 2010-08-02 10:34:20
是的,我知道它不應該太困難,但它不在我的待辦事項列表。使用DB,Red5「共享對象」和流媒體的基礎知識具有更高的優先級。當學到這些東西的時候,我會看看日誌記錄。寫作應用程序將不會開始,直到那時(現在我只是寫一些測試代碼,看看事情是如何工作的),所以日誌可以稍後添加,沒有任何問題。 – binaryLV 2010-08-02 10:48:02