使用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中的QueryRunner.query()和QueryRunner.update()