場景:最近做一個java web項目,使用jdbc連接Oracle數據庫,遇到了兩個問題。
問題1:jdbc連接不上Ubuntu Oracle服務器?
后來發現這個問題的原因是由於連接字符串寫錯了,修正以后如下所示:
public static Connection getConn() {
Connection conn = null;
try {
// oracle
// 1.加載驅動
Class.forName("oracle.jdbc.driver.OracleDriver"); // 需要下載oracle
// JDBC的驅動包
// 2.得到鏈接
String url = "jdbc:oracle:thin:user@//IP/orcl"; // user是用戶名,IP是服務器地址,orcl是數據庫的名稱
String user = "ji"; // 你ORACLE數據中一個用戶名稱
String password = "ji"; // 對應上面用戶名稱的密碼
conn = DriverManager.getConnection(url, user, password); // 連接
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
問題2:服務器連接成功后,從服務器上取不出數據?
剛接觸Oracle數據庫的應用,小白一枚,若是大師,請忽略。
(1)操作自信
先描述一下本人的做法:
服務器數據庫為空,本地用oracle sql developer連接,連接后創建了一張表TABLE_USER,接着用INSERT語句添加了一條測試數據,為了測試插入數據是否成功,又用SELECT語句查詢了一番,如下圖所示:
初始時,數據表為空:
插入一條數據:INSERT INTO TABLE_USER(ID,USERNAME,PWD,STORE_ID) VALUES(1,'a','a',100)
再次查看數據表:(可以看到數據已經插入到數據表)
為了保險起見,再用SELECT語句驗證一番:SELECT * FROM TABLE_USER 如下圖所示:
經過上述步驟,確信數據已經准備好,可以進行Java代碼讀數據測試了。
(2)代碼自信
java代碼讀取測試表數據,代碼如下:
public static ResultSet getRs(Connection con, String sql, Object[] param) {
Connection conn = con;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]);
}
}
rs = pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public static List<Account> findAccount(String sql, Object[] param) {
Connection con = BaseDao.getConn();
ResultSet rs;
rs = BaseDao.getRss(con, sql, param);
List<Account> list = new ArrayList<Account>();
try {
while (rs.next()) {
Account ac = new Account();
String accountEmail = rs.getString("USERNAME");
ac.setAccountEmail(accountEmail);
list.add(ac);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
}
代碼執行時,在rs.next()處一直出錯,原因是rs中沒有數據。
於是乎不停的檢查代碼是否出錯,一路調試,改變代碼寫法,重新在sql developer上再插入數據……無數次的修改,無濟於事!!!
(3)揮淚如雨
搜索引擎搜了一遍又一遍,帖子看了一篇又一篇,方法試了一個又一個,卻依然沒有解決這個問題……
折騰了兩天,暫時放棄了……
(4)柳暗花明
偶然一次服務器關機了,然后重啟了,我再次去SELECT數據時,突然發現我的數據表是空的,瞬間明白了,什么叫COMMIT。
我竟不知道sql developer插入數據是在本地,若不提交服務器上是沒有的。
下面就看一下這個千呼萬喚始出來COMMIT:
just insert
insert & commit
就是這個commit按鈕才能將數據提交到服務器。
(5)重要的事情說三遍
insert、update、delete語句一定要commit
insert、update、delete語句一定要commit
insert、update、delete語句一定要commit