Java連接Oracle數據庫(詳細!快速上手)

Java連接Oracle數據庫及封裝JDBC

如果你點開看到了這篇文章,說明你已經或多或少地通過學校學習亦或是自學瞭解了 oracle 數據庫的基本用法。但是實際在開發程序的時候,我們是不可能手動地去操作sql語句的,而是由程序去調用。這個時候,就需要使用上編程語言了。本文主要介紹的是Java連接數據庫的技術 —— JDBC。

一、JDBC???

JDBC的全稱是Java Data Base Connectivity, Java與各大數據庫相連接都是使用這門技術。各種數據庫的API各不相同,Java是如何實現統一的呢?這是因爲sun公司制定了一套標準,各大數據庫廠商依據這個標準開發出數據庫驅動程序。我們只需要使用這些驅動即可操作數據庫。

在oracle安裝目錄之下可以找到這些驅動程序
在這裏插入圖片描述
那麼多個驅動程序,該選擇哪個?

Oracle版本 jdk版本 推薦jar包 備註
Oracle 8i JDK 1.1.x classes111.zip
Oracle 8i JDK 1.1.x classes12.zip
Oracle 9i JDK 1.1.x classes111.jar或者 classes111.zip
Oracle 9i JDK 1.2 and JDK 1.3 classes12.jar 或者 classes12.zip
Oracle 9i JDK 1.4 ojdbc14.jar
Oracle 9i JDK 1.5 ojdbc5.jar
Oracle 9i JDK 1.6 ojdbc6.jar
Oracle 10g JDK 1.2 and JDK 1.3. classes12.jar
Oracle 10g JDK 1.4 and 5.0 ojdbc14.jar
Oracle 11g jdk5 ojdbc5.jar
Oracle 11g jdk6 ojdbc6.jar

按照oracle版本和jdk版本選擇,這裏的表格僅作參考。

二、連接!!!

說的太多也沒用,直接上一段程序體驗一下。只需要準備一個IDE(eclipse、IDEA等)和上面所說的驅動程序即可。

創建項目

首先,創建一個普通的Java項目,引入jar包。(我這裏是放在了jbdc_oracle目錄下)最後把鼠標移到ojdbc.jar,右鍵,bulild path,add to build path

在這裏插入圖片描述

IDEA創建的項目同理(Add to libary),會使用Maven的也可以創建Maven項目,在pom文件引入依賴即可。

編寫代碼

import java.sql.*;

public class Main {

    public static void main(String[] args) {
        try {
            // 1.加載驅動
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 2.獲取連接
            Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
            System.out.println(connection.getMetaData());
            // 3.創建Statement對象(可以執行sql的對象)
            PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
            // 4.獲取結果集
            ResultSet resultSet = preparedStatement.executeQuery();
            // 5.對數據進行處理
            while(resultSet.next()) {
                Integer id = resultSet.getInt("DEPTNO");
                String dname = resultSet.getString("DNAME");
                String location = resultSet.getString("LOC");
                System.out.println(id+" "+dname+" "+location);
            }
            // 6.關閉連接 先調用的最後關閉 關閉前判斷是否存在
           if(resultSet != null) {
                resultSet.close();
            }
            if(preparedStatement != null) {
                preparedStatement.close();
            }
            if(connection != null) {
                connection.close();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

接下來對以上代碼進行一一說明

  • 加載驅動,這裏是固定寫法,包名不要寫錯

     Class.forName("oracle.jdbc.driver.OracleDriver");
    

    其實寫法不止這一種,只是比較推薦這種。感興趣的可以看看官方的寫法:

    官方JDBC的連接

  • 獲取連接

     Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
    

    getConnection()裏面的三個參數分別是url地址,用戶名和密碼

    jdbc:oracle:thin:固定寫法,其中thin表示連接數據庫的一種方式,想進一步瞭解的話,文末有參考地址

    127.0.0.1:ip地址,這裏表示本機

    1521:oracle的端口地址,一般安裝後默認爲1521

    orcl:數據庫的實例名稱,一般安裝後默認有一個orcl

在這裏插入圖片描述

JDBC常見的對象

注:以下方法都省略了函數的參數

Connection

意如其名,就是表示數據庫和Java之間的一個連接,所有的數據庫操作都與其密切相關。

prepareStatement();//PreparedStatement對象
createStatement();//Statement對象
commit();        //提交
rollback();      //回滾
prepareCall();   //存儲過程

Statement

executeQuery(); //查詢,返回ResultSet
executeUpdate(); //增加、刪除、更新,返回受影響的行數
();//增刪改查都可以進行,不建議使用。運行結果爲ResultSet則返回true,否則返回false

PreparedStatement

PreparedStatement是Statement的子類,PreparedStatement對象可以對sql語句進行預編譯,並且可以通過佔位符的方式方便我們進行參數的拼接:

PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int對應deptno的類型,1代表第1個問號,

ResultSet

查詢後獲得的結果集

getXXX(數據庫的列名/第幾列)  //其中XXX可以是Int,Array,Boolean等
 /*
 第幾列對應的是sql中的第幾列,
 如select deptno,loc,dname from dept;
 寫法:getInt(1) / getInt("deptno")
 select loc,dname,deptno from dept;
 寫法:getInt(3) / getInt("deptno");

這幾個對象多調用幾次就知道如何使用了,總的使用流程是

連接數據庫(獲取Connection對象) -> 創建Statement對象(Statement/PreparedStatement) -> 用Statement對象執行語句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影響行數,executeQuery返回ResultSet)判斷執行的結果 -> 關閉對象

多多使用就對了!

三、增刪改查示例

示例的項目結構做出來是這樣的:utils包裏的DBUtil用於獲取數據庫連接,pojo包裏的Student用於封裝數據,dao包裏的StudentDao封裝了學生的增刪改查的方法,最終在Main裏面完成測試。
在這裏插入圖片描述
示例使用到的表:

CREATE TABLE "STUDENT" 
 (	"SNO" VARCHAR2(17 BYTE), 
	"SNAME" VARCHAR2(10 BYTE), 
	"SAGE" NUMBER(*,0), 
	"SSEX" CHAR(2 BYTE), 
	"SDEPT" VARCHAR2(20 BYTE), 
	"SENROLLMENT" DATE
 ) SEGMENT CREATION IMMEDIATE 
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100001','李四',20,'男',null,null);
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100002','王五',21,'男',null,null);
Insert into STUDENT (SNO,SNAME,SAGE,SSEX,SDEPT,SENROLLMENT) values ('1806100003','趙柳兒',21,'女',null,null);

針對學生表寫學生類:

public class Student {

    private String id;

    private String name;

    private Integer age;

    private String sex;

    public Student(){}

    public Student(String id, String name, Integer age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}


對Connection類的獲取作了簡單的封裝:

public class DBUtil {

    private static final String URL  ="jdbc:oracle:thin:@127.0.0.1:1521:orcl" ;
    private static final String USERNAME  ="cc" ;
    private static final String PASSWORD  ="ccpassword" ;

    /**
     * 關閉連接
     * @param rs
     * @param stmt
     * @param connection
     */
    public static void closeAll(ResultSet rs,Statement stmt,Connection connection) {
        try {
            if(rs!=null) {
                rs.close();
            }
            if(stmt!=null) {
                stmt.close();
            }
            if(connection!=null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取連接
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("oracle.jdbc.OracleDriver") ;
        return  DriverManager.getConnection( URL,USERNAME,PASSWORD ) ;
    }

}

增刪改查的示例:

public class StudentDao {

    /**
     * 插入學生
     * @param student
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public Integer insert(Student student) throws SQLException, ClassNotFoundException {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("insert into student(sno,sname,sage,ssex) values(?,?,?,?)");
        preparedStatement.setString(1,student.getId());
        preparedStatement.setString(2,student.getName());
        preparedStatement.setInt(3,student.getAge());
        preparedStatement.setString(4,student.getSex());
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("插入成功!");
        } else {
            System.out.println("插入失敗");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 根據id刪除
     * @param id
     * @return
     * @throws Exception
     */
    public Integer delete(String id) throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("delete from student where sno = ?");
        preparedStatement.setString(1,id);
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("刪除成功!");
        } else {
            System.out.println("刪除失敗");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 根據id更新名字
     * @param name
     * @param id
     * @return
     * @throws Exception
     */
    public Integer updateName(String name,String id) throws Exception {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("update student set sname = ? where sno = ?");
        preparedStatement.setString(1,name);
        preparedStatement.setString(2,id);
        Integer count = preparedStatement.executeUpdate();
        if(count == 1) {
            System.out.println("更新成功!");
        } else {
            System.out.println("更新失敗");
        }
        DBUtil.closeAll(null,preparedStatement,connection);
        return count;
    }

    /**
     * 查詢所有數據
     * @return
     * @throws Exception
     */
    public List<Student> selectAll() throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select sno,sname,sage,ssex from student");
        ResultSet rs = preparedStatement.executeQuery();
        List<Student> list = new ArrayList<>();
        while (rs.next()) {
            // 封裝成對象,放入數組中
            String sno = rs.getString("sno");
            String sname = rs.getString(2);
            Integer sage = rs.getInt(3);
            String ssex = rs.getString("ssex");
            Student student = new Student(sno,sname,sage,ssex);
            list.add(student);
        }
        DBUtil.closeAll(rs,preparedStatement,connection);
        return list;
    }

    /**
     * 根據id查詢
     * @param id
     * @return
     * @throws Exception
     */
    public Student select(String id) throws Exception{
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = connection.prepareStatement("select sno,sname,sage,ssex from student where sno = ?");
        preparedStatement.setString(1,id);
        ResultSet rs = preparedStatement.executeQuery();
        if (rs.next()) {
            // 封裝成對象
            String sno = rs.getString("sno");
            String sname = rs.getString(2);
            Integer sage = rs.getInt(3);
            String ssex = rs.getString("ssex");
            DBUtil.closeAll(rs,preparedStatement,connection);
            Student student = new Student(sno,sname,sage,ssex);
            return student;
        }
        DBUtil.closeAll(rs,preparedStatement,connection);
        return null;
    }

}

測試:

public class Main {

    public static void main(String[] args) throws Exception {
        StudentDao studentDao = new StudentDao();

        Student student = new Student();
        student.setId("188888888");
        student.setName("TestInsert");
        student.setAge(20);
        student.setSex("男");

        // 測試插入數據
        studentDao.insert(student);

        // 測試更新數據
        studentDao.updateName("testInsert","188888888");

        // 測試查詢數據
        System.out.println(studentDao.select("188888888"));
        System.out.println(studentDao.selectAll());

        // 測試刪除數據
        studentDao.delete("188888888");

    }
}


測試結果:

參考資料:

oracle jdbc選擇

JDBC連接數據庫三種url方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章