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");
其實寫法不止這一種,只是比較推薦這種。感興趣的可以看看官方的寫法:
-
獲取連接
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");
}
}
測試結果:
參考資料: