实现思路:
使用一个名为oracle.properties的文件,里面写有Oracle的URL,User,Password和driver类,通过ClassLoader的输入流,输入流中有输入进程序的Oracle连接初始化参数,输入流在Properties中load中得到加载。通过getProperty(String key)得到文件信息。
JdbcUtils.java
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
解决这个问题的思路如下:
Oracle Date是不同于Java String类型的。Java想要写入一个Oracle Date数据,需要把字符串转为java.sql.Date。字符串转换为java.sql.Date需要经过以下几步:
Oracle Date类型
Date值的格式为 NLS_DATE_FORMAT
,其具体格式如下:
DD-MON-RR
在这里我们使用java.sql.Date和java.time.LocalDate,源码部分如下
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。
由于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 。