1. 程式人生 > >資料庫開發(九 JDBC篇一)JDBC六大步(操作流程)

資料庫開發(九 JDBC篇一)JDBC六大步(操作流程)

準備工作(使用自制的EasyBuy.sql指令碼進行練習):

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(迴圈)
  • 增刪改:
    • 返回影響的行數,沒有結果集的處理
  • 注:目前需要引數,以形參輸入,注意拼接,很容易出錯,尤其文字型,需要單引號

================

練習:

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;
	}
	
}