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

37次阅读

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

  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()

正文完
 0