實現思路:java
使用一個名爲oracle.properties的文件,裏面寫有Oracle的URL,User,Password和driver類,經過ClassLoader的輸入流,輸入流中有輸入進程序的Oracle鏈接初始化參數,輸入流在Properties中load中獲得加載。經過getProperty(String key)獲得文件信息。mysql
JdbcUtils.javasql
package exer.jdbcutils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * @author mmengyiyu * @date 2019/11/15 16:47 */ public class JdbcUtils { private static String url; private static String user; private static String pwd; private static String driverClass; // 加載mysql.properties資源 static { InputStream resource = JdbcUtils.class.getClassLoader().getResourceAsStream("exer\jdbcutils\oracle.properties"); Properties prop = new Properties(); try { prop.load(resource); url = prop.getProperty("jdbc.url"); user = prop.getProperty("jdbc.user"); pwd = prop.getProperty("jdbc.pwd"); driverClass = prop.getProperty("jdbc.driverClass"); Class.forName(driverClass); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } /** * 釋放數據庫鏈接和其JDBC資源 * @author mmengyiyu * @date 2019-11-15 19:27 * @param conn 要釋放的資源引用 */ public static void release(Connection conn) { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 釋放預編譯語句和其JDBC資源 * @author mmengyiyu * @date 2019-11-15 19:27 * @param ps 要釋放的SQL語句 */ public static void release(PreparedStatement ps) { if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 釋放語句和其JDBC資源 * @author mmengyiyu * @date 2019-11-15 19:27 * @param st 要釋放的SQL語句 */ public static void release(Statement st) { if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 釋放結果集和其JDBC資源 * @author mmengyiyu * @date 2019-11-15 19:27 * @param rs 要釋放的SQL結果集 */ public static void release(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 返回MySQL數據庫鏈接 * @author mmengyiyu * @date 2019-11-15 19:28 * @return 數據庫鏈接 */ public static Connection getConnection() { Connection conn = null; try { conn = DriverManager.getConnection(url,user,pwd); } catch (Exception e) { e.printStackTrace(); } return conn; } }
oracle.properties數據庫
# oracle 11 jdbc.url = jdbc:oracle:thin:@//127.0.0.1:1521/orcl jdbc.user = scott jdbc.pwd = 123456 jdbc.driverClass = oracle.jdbc.driver.OracleDriver
解決這個問題的思路以下:apache
Oracle Date是不一樣於Java String類型的。Java想要寫入一個Oracle Date數據,須要把字符串轉爲java.sql.Date。字符串轉換爲java.sql.Date須要通過如下幾步:編程
Oracle Date類型oracle
Date值的格式爲NLS_DATE_FORMAT
,其具體格式以下:工具
DD-MON-RR
在這裏咱們使用java.sql.Date和java.time.LocalDate,源碼部分以下url
import java.sql.Date; import java.time.LocalDate; ... System.out.println("生日(格式要求:\"yyyy-MM-dd\"):"); String birthday = sc.next(); String[] split = birthday.split("-"); Date date = Date.valueOf(LocalDate.of(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2])));
這樣就能把從屏幕上輸入的字符串轉換爲java.sql.Date。code
因爲Oracle數據庫事務默認不自動提交。那麼一旦編程中涉及增刪改數據庫(DML),必定要conn.commit(),否則的話,數據庫結果沒法持久化!
最直觀的感覺就是:明明個人insert/update/delete了表中的記錄,爲何使用數據庫軟件查詢表時表中沒任何變化呢。
固然,若是一次事務中DML操做失敗了,那麼進入catch塊就須要回滾事務了。
部分源碼以下:
Connection conn = null; try { ... conn = JdbcUtils.getConnection(); ...(使用鏈接進行數據庫操做) ... // 若是數據庫操做涉及DML操做,必定要提交事務,由於Oracle默認不自動提交事務。 conn.commit(); conn.close(); } catch (SQLException e) { // 能走到這步,是由於try塊中出錯了,根據事務ACID,回滾來結束事務。 try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { JdbcUtils.release(conn); }
學會使用DBUtils。