JDBC编程 - 获取Connection及常见问题

更新于 2019-11-15  约 11 分钟

使用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需要经过以下几步:

  1. 将字符串转化为JDK1.8提供的java.time.LocalDate,或java.time.LocalTime或java.time.LocalDateTime类型。
  2. 使用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()
阅读 154更新于 2019-11-15

推荐阅读
目录