資料庫開發(九 JDBC篇一)JDBC六大步(操作流程)
準備工作(使用自制的EasyBuy.sql指令碼進行練習):
--建立使用者
create user easybuy identified by easybuy;
--授權
grant connect, resource to easybuy;
--連線
conn easybuy/easybuy
--匯入指令碼
start C:\Users\zygycp\OneDrive\Documents\oracle\EasyBuy.sql
JDBC六大步,statement
JDBC:Java Database Connectivity :Java版本的ODBC(1960年SUN公司提出)
ODBC:(Open Database Connectivity)(一個以C語言為基礎去訪問SQL為基礎資料庫引擎的介面,它提供了一致的介面用於和資料庫溝通以及訪問資料)
Java | |||
Oracle | MySQL | SQL Server | ... |
可以利用JDBC技術,通用的寫法,與不同的資料庫進行互動
JDBC提供兩部分API:
- 一部分針對資料庫廠商提供的,每個資料庫廠商針對介面提供實現類
- 一部分針對應用程式開發人員的
利用JDBC,可以與資料庫建立連線,傳送SQL語句,得到結果集並處理
java.sql
Driver:驅動介面
驅動方式:四種
- jdbc=>odbc=>DB
- jdbc=>客戶端RDBMS=>DB
- jdbc=>中間伺服器=>DB 基於網路的Java協議
- jdbc=>DB 基於Java的本地協議
常用API:
- 包:Java.sql
Driver:資料庫驅動介面
DriverManager:驅動管理類
Connection:連線介面,代表與資料庫的一個連線
Statement:用於執行SQL語句
- PreparedStatement:Statement的子介面
- CallableStatement:Statement的子介面
ResultSet:結果集,查詢會返回一個結果集,等待處理
六大步
- 準備工作:專案中匯入ojdbc6.jar,拷貝到專案中,右擊:build path->add to build path(架包可在該出找到:Y:\OracleXE\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar)
1. 註冊資料庫驅動
- oracle.jdbc.driver.OracleDriver(該類在架包中)
- 建立一個驅動物件,並註冊(可以利用Driver driver = new OracleDriver();DriverManager.register(driver))
Class:是一個類,每個類載入到記憶體時,都有一個對應的Class型別的物件
//載入這個全類名到對應的類到記憶體,會執行對應的static{},靜態程式碼塊,裡面包含了建立驅動物件並註冊
//Class.forName("全類名");
Class.forName("oracle.jdbc.driver.OracleDriver");
2. 與資料庫建立連線
- DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","easybuy","easybuy") ==> 返回一個連線物件,Connection實現類物件
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","easybuy","easybuy");
- URL: jdbc:oracle:thin:@host:埠號:SID localhost:本地 1521:oracle資料庫的埠號 XE:XE版本資料庫自動建立的例項
- 資料庫連線的使用者名稱:
- 資料庫連線的口令:
3.建立可以執行SQL語句的Statement
- 利用連線物件
- conn.createStatement();
Statement stmt = conn.createStatement();
- =>返回一個Statement實現類物件
4.執行SQL語句
- 對於增刪改:stmt.executeUpdate("sql語句");
- 返回int型別的值,影響的行數
- 對於查詢:stmt.executeQuery("sql語句");
- 返回一個ResultSet,結果集
- 注:這裡SQL語句不能寫分號,否則報錯
5. 處理結果集,對於查詢才有
- 結果集中有一個遊標:可以指向結果集中的行
- 預設不指向任何一行
- rs.next():讓遊標指向下一行,如果有下一行,返回true
- 如果沒有下一行,返回false
- rs.getXXX(列在結果集中的下標或者列名)
rs.getLong(1) 或 rs.getLong(id)
- eg
-
//結果集中有多行,可以利用迴圈 while(rs.next()){ //行的處理 }
6. 資源釋放
- ResultSet,Statement,Connection
- 按照後開啟的先關閉順序
例項如下:
定義JDBCDemo和User兩個類進行演示
package com.zhang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class JDBCDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
JDBCDemo demo = new JDBCDemo();
try {
//方法呼叫
List<User> list = demo.queryUser();
//遍歷集合
for (User user:list) {
System.out.println(user);
}
/*int rows = demo.updatePasswordById(1, "aaa");
System.out.println(rows);*/
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封裝一個方法,完成六大步的操作
public List<User> queryUser() throws ClassNotFoundException, SQLException {
List<User> list = new ArrayList<>();
//SELECT id,username,...FROM t_user
//1.註冊資料庫驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.與資料庫建立連線
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
//3.建立可以執行SQL語句的Statement
Statement stmt = conn.createStatement();
//4.執行SQL語句
/*
* id NUMBER(11),
username VARCHAR2(25),
password VARCHAR2(25),
sex NUMBER(1) DEFAULT 0,
id_number VARCHAR2(18),
tel VARCHAR2(11),
addr VARCHAR2(100),
*/
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user";
ResultSet rs = stmt.executeQuery(sql);
//5.處理結果集
while(rs.next()) {
//讀一行,放到一個新建的物件中
User user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
list.add(user);
}
//6.釋放資源
if(rs!=null) {
rs.close();
}
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return list;
}
public int updatePasswordById(long id,String password) throws ClassNotFoundException, SQLException {
//1.註冊資料庫驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.與資料庫建立連線
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
//3.建立可以執行SQL語句的Statement
Statement stmt = conn.createStatement();
//4.執行SQL語句
//單引號保證password的前後都有單引號
String sql = "UPDATE t_user SET password='" +
password + "' WHERE id="+id;
System.out.println(sql);
int rows = stmt.executeUpdate(sql);
//6.釋放資源
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
}
package com.zhang.jdbc;
public class User {
/*
* id NUMBER(11),
username VARCHAR2(25),
password VARCHAR2(25),
sex NUMBER(1) DEFAULT 0,
id_number VARCHAR2(18),
tel VARCHAR2(11),
addr VARCHAR2(100),
*/
private long id;
private String username;
private String password;
private int sex;
private String idNumber;
private String tel;
private String addr;
public User() {}
public User(long id, String username, String password, int sex, String idNumber, String tel, String addr) {
super();
this.id = id;
this.username = username;
this.password = password;
this.sex = sex;
this.idNumber = idNumber;
this.tel = tel;
this.addr = addr;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", sex=" + sex + ", idNumber="
+ idNumber + ", tel=" + tel + ", addr=" + addr + "]";
}
}
要求:
- 修改這個方法,返回一個結果
- 資料庫到Java的對映關係
- 資料庫 --> Java
- 表 類
- 列(欄位) 類的屬性
- 行 類的例項
練習2:定義一個方法,通過id修改對應使用者的密碼(形參:id,password)
JDBC需求:
- 查詢,
- 一行:比如通過id查詢一個使用者,返回值User或者List
- 處理結果集時,if也可以
- 多行:返回List
- 處理結果集時,while(迴圈)
- 一行:比如通過id查詢一個使用者,返回值User或者List
- 增刪改:
- 返回影響的行數,沒有結果集的處理
- 注:目前需要引數,以形參輸入,注意拼接,很容易出錯,尤其文字型,需要單引號
================
練習:
1.通過性別查詢全部使用者,並按照使用者名稱升序排序
2.通過使用者名稱查詢對應的使用者
3.通過id刪除一個使用者
4.新增一個使用者到使用者表,id可以使用序列t_user_id_seq
使用上面的User類,UserJDBC類如下,
package com.zhang.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class UserJDBC {
public static void main(String[] args) {
// TODO Auto-generated method stub
UserJDBC jdbc = new UserJDBC();
try {
//通過性別查詢全部使用者,並按照使用者名稱升序排序
/*List<User> list = jdbc.queryUsers(0);
for(User user:list) {
System.out.println(user);
}*/
//查詢
/*User user = jdbc.queryUser("xiaoming");
System.out.println(user);*/
//新增使用者
/*User user = new User(0,"lisi","123",0,"123123123123123123","111","111");
int rows = jdbc.addUser(user);
System.out.println(rows);
System.out.println(jdbc.queryUser("lisi"));*/
//刪除使用者
int rows = jdbc.deleteUserById(10);
System.out.println(rows);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//通過性別查詢全部使用者,並按照使用者名稱升序排序
public List<User> queryUsers(int sex) throws SQLException, ClassNotFoundException {
List<User> list = new ArrayList<>();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user WHERE sex=" +sex+ "ORDER BY username";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
//讀一行,放到一個新建的物件中
User user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
list.add(user);
}
if(rs!=null) {rs.close();}
if(stmt!=null) {stmt.close();}
if(conn!=null) {conn.close();}
return list;
}
//通過使用者名稱查詢對應的使用者
public User queryUser(String username) throws ClassNotFoundException, SQLException {
User user = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "SELECT id,username,password,sex,"
+ "id_number,tel,addr FROM t_user WHERE username='" +username+ "'";
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()) {
user = new User(rs.getLong(1),rs.getString(2),rs.getString(3),
rs.getInt(4),rs.getString(5),rs.getString(6),rs.getString(7));
}
if(rs!=null) {rs.close();}
if(stmt!=null) {stmt.close();}
if(conn!=null) {conn.close();}
return user;
}
//通過id刪除一個使用者
public int deleteUserById(long id) throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
String sql = "DELETE FROM t_user WHERE id=" + id;
int rows = stmt.executeUpdate(sql);
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
//新增一個使用者到使用者表,id可以使用序列t_user_id_seq
public int addUser(User user) throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "easybuy", "easybuy");
Statement stmt = conn.createStatement();
* 首先要建立序列,語法如下
* CREATE SEQUENCE t_user_id_seq
* START WITH 10
* INCREMENT BY 1;
String sql = "INSERT INTO t_user(id,username,password,sex,id_number,tel,addr)"
+ "VALUES(t_user_id_seq.NEXTVAL,'"+user.getUsername()+ "','"+user.getPassword()+ "',"+user.getSex()+ ",'"+user.getIdNumber()+ "','"+user.getTel()+ "','"+user.getAddr()+ "'" +")";
int rows = stmt.executeUpdate(sql);
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
return rows;
}
}