JDBC簡介:
JDBC(Java DataBase Connectivity)是一種用于執行SQL語句的Java API,可以為多種關系資料庫提供統一的通路,它由一組用Java語言編寫的類和接口組成。使用JDBC通路資料庫的基本步驟如下:
- 加載JDBC驅動程式
- 建立資料庫連接配接
- 建立操作資料庫SQL的對象
- 執行語句并分析執行結果
- 關閉連接配接
操作執行個體:
一、操作mysql資料庫
MySQL安裝方法
二、下載下傳驅動
要在程式中連接配接mysql資料庫對其進行操作,我們還需要下載下傳驅動Mysql-Connector/J,這是mysql為java的資料庫連接配接開發的庫,同時官網上也有類似為其他語言的庫,比如Connectors/.Net , Connectors/php , Connectors/C++,下載下傳驅動之後将驅動導入項目檔案。
點選下載下傳驅動
三、連接配接MySQL資料庫
- 定義連接配接資料庫的三個常量:URL、USERNAME、PASSWORD
- 定義資料庫的連接配接對象
- 資料庫連接配接(1、加載驅動 2、驅動管理得到資料庫的連接配接并傳回一個資料庫對象)
- 關閉資料庫連接配接
- main函數進行測試
代碼如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DB_Helper {
public static final String URL = "jdbc:mysql://localhost:3306/company?characterEncoding=utf8&useSSL=false&serverTimezone=UTC";
public static final String USERNAME = "root";
public static final String PASSWORD = "123456";
// 定義資料庫的連接配接對象
public static Connection conn;
// 資料庫連接配接對象
public static Connection getConn(){
try {
// 加載驅動
Class.forName("com.mysql.cj.jdbc.Driver");
try {
// 驅動管理得到資料庫的連接配接并傳回一個資料庫對象
conn= DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
// 關閉資料庫連接配接
public static void closeConn(Connection conn){
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println(DB_Helper.getConn());
}
}
結果如下:

JDBC架構:
JDBC API支援用于資料庫通路的兩層和三層處理模型,但通常,JDBC體系結構由兩層組成:
- JDBC API:提供應用程式到JDBC管理器連接配接。
- JDBC驅動程式API:支援JDBC管理器到驅動程式連接配接。
以下是架構圖,它顯示了驅動程式管理器相對于JDBC驅動程式和Java應用程式的位置:
JDBC操作資料庫執行個體:
一、在MySQL資料庫中建構一個表
二、編寫程式
- 建立mysql_conn,存放DB_Helper類,用來連接配接資料庫
- 建立entity包,存放Emp類,作為使用者的實體類
- 建立dao包,存放Emp_dao接口,用來定義方法
- 建立dao_impl包,存放接口的實作類Emp_impl
- 創test包,存放Test測試類
一、DB_Helper類
詳細見上方mysql資料庫
二、Emp類
// 使用者的實體類
public class Emp {
private int empno;
private String ename;
private String job;
private String mgr;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getMgr() {
return mgr;
}
public void setMgr(String mgr) {
this.mgr = mgr;
}
// 定義有參的構造方法
public Emp(int empno, String ename, String job, String mgr) {
super();
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
}
// 有參的構造方法(empon是自增,不用進行指派)
public Emp(String ename, String job, String mgr) {
super();
this.ename = ename;
this.job = job;
this.mgr = mgr;
}
// 定義無參的構造方法
public Emp() {
super();
}
}
三、Emp_dao 接口
public interface Emp_dao {
// 查詢所有的使用者資訊,并傳回
public List<Emp> findAllUser();
// 查詢某個使用者的資訊并傳回
public Emp findUserById(int id);
}
四、Emp_impl實作類
import dao.Emp_dao;
import entity.Emp;
import mysql_conn.DB_Helper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Emp_impl implements Emp_dao {
// 定義查詢所有使用者資訊的實作類
@Override
public List<Emp> findAllUser() {
List<Emp> lists = new ArrayList<Emp>();
// 1、獲得資料庫的連接配接對象
Connection conn = DB_Helper.getConn();
// 2、書寫SQL語句操作資料表
String sql = "select * from emp";
// 3、預編譯SQL語句
try {
PreparedStatement pps = conn.prepareStatement(sql);
// 4、執行查詢指令
ResultSet resultSet = pps.executeQuery();
// 5、循環讀取結果集中的資料
while (resultSet.next()){ // 如果結果集中有資料傳回true
// 6、 把結果集中的資料讀取出來指派給使用者的屬性
Emp emp = new Emp();
emp.setEmpno(resultSet.getInt(1));
emp.setEname(resultSet.getString(2));
emp.setJob(resultSet.getString(3));
emp.setMgr(resultSet.getString(4));
lists.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
}
return lists;
}
// 定義查詢某個使用者資訊的實作類
@Override
public Emp findUserById(int id) {
Emp emp = null;
// 1、獲得資料庫的連接配接對象
Connection conn = DB_Helper.getConn();
// 2、書寫SQL語句操作資料表
String sql = "select * from emp WHERE empno=?";
// 3、預編譯SQL語句
try {
PreparedStatement pps = conn.prepareStatement(sql);
// 4、給SQL語句占位符指派
pps.setInt(1,id);
// 5、執行查詢指令
ResultSet resultSet = pps.executeQuery();
// 6、循環讀取結果集中的資料
while (resultSet.next()){ // 如果結果集中有資料傳回true
// 7、 把結果集中的資料讀取出來指派給使用者的屬性
emp = new Emp();
emp.setEmpno(resultSet.getInt(1));
emp.setEname(resultSet.getString(2));
emp.setJob(resultSet.getString(3));
emp.setMgr(resultSet.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
}
return emp;
}
}
五、Test測試類
public class Test {
public static void main(String[] args) {
// 查詢到所有的使用者
Emp_impl eil = new Emp_impl();
List<Emp> lists = eil.findAllUser();
for (Emp emp : lists) {
System.out.println(emp.getEmpno()+"\t"+emp.getEname()+"\t"+emp.getJob()+"\t"+emp.getMgr());
}
// 查詢到單個使用者
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入想要查詢的編号:");
int number = scanner.nextInt();
Emp user = eil.findUserById(number);
if (user!=null){
System.out.println(user.getEmpno() + "\t" + user.getEname() + "\t" + user.getJob() + "\t" + user.getMgr());
}
}
}
結果如下: