0.前言
1. 加载数据库驱动类
Java与不同数据库的交互依赖于特定的JDBC驱动。以Oracle数据库为例,您需要下载并配置ojdbc5.jar
文件。
步骤:
-
下载驱动:
-
通常,您可以在Oracle数据库的安装目录下找到
ojdbc5.jar
-
文件,路径可能类似于:
app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc5.jar
-
-
添加到项目:
-
将
ojdbc5.jar
复制到您的Java项目目录中。 -
在IDE中(如Eclipse或IntelliJ),右键点击项目,选择
Build Path -> Configure Build Path -> Libraries -> Add JARs
,然后选择刚才添加的jar包。
-
-
-
在代码中使用以下方式加载驱动:
加载驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
-
2. 创建SQL语句
在连接数据库之前,您需要准备要执行的SQL语句。根据需求,SQL语句可以是插入、更新、删除或查询。
示例:
// 插入一条记录
String insertSql = "INSERT INTO emp(empno, ename) VALUES (8888, 'aa')";
// 查询所有员工
String selectSql = "SELECT * FROM emp";
3. 创建数据库连接
使用DriverManager
类创建数据库连接。以下是连接Oracle数据库的示例代码:
示例代码:
// 数据库连接信息
String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; // 数据库URL
String userName = "SCOTT"; // 数据库用户名
String userPass = "tiger"; // 数据库密码
// 创建连接
Connection conn = DriverManager.getConnection(url, userName, userPass);
4. 执行SQL语句
连接成功后,可以使用Statement
、PreparedStatement
或CallableStatement
来执行SQL语句。
4.1 使用Statement
Statement
适用于简单的SQL语句,但不推荐用于用户输入的内容,以避免SQL注入。
示例:
// 创建Statement对象
Statement stmt = conn.createStatement();
// 执行插入操作
int result = stmt.executeUpdate(insertSql);
if (result > 0) {
System.out.println("插入成功");
}
// 执行查询操作
ResultSet rs = stmt.executeQuery(selectSql);
while (rs.next()) {
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
Date hireDate = rs.getDate("hiredate");
System.out.println("员工姓名: " + name + ", 薪水: " + salary + ", 入职日期: " + hireDate);
}
4.2 使用PreparedStatement
PreparedStatement
可以防止SQL注入,并且在执行多次相同SQL时性能更好。
示例:
// 创建PreparedStatement对象
String preparedSql = "INSERT INTO emp(empno, ename) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(preparedSql);
// 设置参数
pstmt.setInt(1, 8888);
pstmt.setString(2, "aa");
int insertResult = pstmt.executeUpdate();
if (insertResult > 0) {
System.out.println("插入成功");
}
// 查询示例
String querySql = "SELECT * FROM emp WHERE ename LIKE ?";
pstmt = conn.prepareStatement(querySql);
pstmt.setString(1, "%aa%");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String name = rs.getString("ename");
System.out.println("查询结果: " + name);
}
5. 处理返回结果
在执行查询后,您将获得一个ResultSet
对象。通过ResultSet
,可以遍历查询结果。
示例:
while (rs.next()) {
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
Date hireDate = rs.getDate("hiredate");
System.out.println("员工姓名: " + name + ", 薪水: " + salary + ", 入职日期: " + hireDate);
}
6. 释放资源
在完成数据库操作后,务必释放资源,以避免内存泄漏。
示例:
// 释放ResultSet、Statement和Connection
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
注意事项
SQL注入
使用Statement
时,拼接SQL语句可能导致SQL注入问题。例如:
String e_name = "C OR '1'='1"; // 潜在的SQL注入
String sql = "SELECT * FROM EMP WHERE ENAME LIKE '%" + e_name + "%'";
为了避免此类问题,建议使用PreparedStatement
,它会自动处理参数,防止SQL注入。
事务管理
在进行多表操作时,建议使用事务管理,以确保数据一致性。
示例:
try {
conn.setAutoCommit(false); // 关闭自动提交
// 执行多个SQL操作
pstmt.executeUpdate(insertSql);
pstmt.executeUpdate(anotherSql); // 另一个SQL操作
conn.commit(); // 手动提交
} catch (SQLException e) {
conn.rollback(); // 发生异常时回滚
e.printStackTrace();
} finally {
// 释放资源
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
整体代码示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OracleDatabaseExample {
public static void main(String[] args) {
// 数据库连接信息
String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; // 数据库URL
String userName = "SCOTT"; // 数据库用户名
String userPass = "tiger"; // 数据库密码
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 加载Oracle JDBC驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 创建数据库连接
conn = DriverManager.getConnection(url, userName, userPass);
System.out.println("数据库连接成功");
// 插入一条记录
String insertSql = "INSERT INTO emp(empno, ename) VALUES (?, ?)";
pstmt = conn.prepareStatement(insertSql);
pstmt.setInt(1, 8888); // 设置员工编号
pstmt.setString(2, "aa"); // 设置员工姓名
int insertResult = pstmt.executeUpdate();
if (insertResult > 0) {
System.out.println("插入成功");
}
// 查询所有员工
String selectSql = "SELECT * FROM emp";
pstmt = conn.prepareStatement(selectSql);
rs = pstmt.executeQuery(); // 执行查询
// 处理结果集
while (rs.next()) {
String name = rs.getString("ename");
double salary = rs.getDouble("sal");
java.sql.Date hireDate = rs.getDate("hiredate");
System.out.println("员工姓名: " + name + ", 薪水: " + salary + ", 入职日期: " + hireDate);
}
} catch (ClassNotFoundException e) {
System.err.println("数据库驱动加载失败: " + e.getMessage());
} catch (SQLException e) {
System.err.println("数据库操作失败: " + e.getMessage());
} finally {
// 释放资源
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
System.out.println("资源已释放");
} catch (SQLException e) {
System.err.println("释放资源失败: " + e.getMessage());
}
}
}
}
© 版权声明
- 本博客所拥有的文章除特别声明外,均默认采用 CC BY 4.0 许可协议。
- 文章部分内容可能来源于公共网络,如有侵权,请联系博主在核实后进行修改或删除。
THE END
暂无评论内容