Jdbc編程

使用JDBC鏈接Oracle

實現思路:java

使用一個名爲oracle.properties的文件,裏面寫有Oracle的URL,User,Password和driver類,經過ClassLoader的輸入流,輸入流中有輸入進程序的Oracle鏈接初始化參數,輸入流在Properties中load中獲得加載。經過getProperty(String key)獲得文件信息。mysql

JdbcUtils.javasql

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類型

解決這個問題的思路以下:apache

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類型oracle

Date值的格式爲NLS_DATE_FORMAT,其具體格式以下:工具

DD-MON-RR

在這裏咱們使用java.sql.Date和java.time.LocalDate,源碼部分以下url

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。code

常見問題 - 使用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()
相關文章
相關標籤/搜索