共计 3670 个字符,预计需要花费 10 分钟才能阅读完成。
使用 JDBC 连接 Oracle
实现思路:
使用一个名为 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
常见问题 – Java 字符串如何转换成 Oracle Date 类型
解决这个问题的思路如下:
Oracle Date 是不同于 Java String 类型的。Java 想要写入一个 Oracle Date 数据,需要把字符串转为 java.sql.Date。字符串转换为 java.sql.Date 需要经过以下几步:
- 将字符串转化为 JDK1.8 提供的 java.time.LocalDate, 或 java.time.LocalTime 或 java.time.LocalDateTime 类型。
- 使用 java.sql.Date.valueOf() 将 java.time.LocalDate, 或 java.time.LocalTime 或 java.time.LocalDateTime 类型转为 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。
常见问题 – 使用 JDBC 对 Oracle DML 操作后一定要调用事务提交方法
由于 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);
}
在 Jdbc 哪些编程内容需要掌握
- 写一个 Jdbc 工具类,里面涉及数据库连接的加载和与 Jdbc 资源相关的释放操作。
- 怎么对表进行 CRUD
- 对表添加一个标记(用于标记是否删除,0 – 已删除, 1 – 正常使用,暂且命名为 status),删除表的操作转化为 UPDATE 表中的 status 标记,而不是使用 DELETE
- 如何根据主键所在字段的多个字段值删除多个记录。
-
学会使用 DBUtils。
- 比如,使用 DBUtils 中的 QueryRunner.query() 和 QueryRunner.update()
正文完