第十章 JDBC數據庫連接技術 第一部分


常見的文件類型:

•純文本:沒有文件的格式要求
•數據傳輸格式:html, xml, json,規定一定的規範的純文本文件
•指定公司特定格式:excel, csv等等
•專門做數據存儲的公司:mysql,sqlsever,oracle,DB2等

• 數據庫簡介

–數據庫服務器:硬件
–數據庫服務:軟件
–數據庫客戶端:軟件
		•命令行:sql語句
		•客戶端軟件:不是唯一的
		•自開發的軟件:我們自己寫的軟件
–數據庫的名字:一般代表某一個應用程序
	
• 數據庫的主要職能
		–保存大量數據
		–檢索數據
		–數據維護(備份、壓縮等)
		
• 根據實際項目的規模與需求
		–選擇合適的數據存儲技術
		–選擇合適的數據庫產品

常見數據庫   通用語言都是SQL
		• MySql
		• SqlServer
		• Oracle
		• SqlLite

MySQL數據庫

• MySQL是目前在Internet上使用最廣泛的關係型數據庫管理系統之一
• MySQL支持多種操作系統平臺
• MySQL分爲商業版和社區版
–兩個版本都是免費、開源的
–商業版更穩定、安全,性能比社區版好;包含企業級軟件、服務和支持;源碼編排規範

SQL語句介紹

• SQL是Structured Query Language(結構化查詢語言)的縮寫,
SQL是專爲數據庫而建立的操作命令集,是一種功能齊全的數據庫語言

• SQL功能強大、簡單易學、使用方便,已經成爲了數據庫操
作的基礎,並且現在幾乎所有的數據庫均支持SQ

在這裏插入圖片描述

在這裏插入圖片描述

不同數據庫有不同的端口。
java只提供了操作數據庫的接口,具體實現由數據庫服務商提供。

在這裏插入圖片描述

• Java中JDBC的基本操作

JDBC的概念和類型

• JDBC是Java Database Connectivity的簡稱
• 是由一組Java語言編寫的類和接口組成,是一種用於執行SQL語句的規範
• 官方網址:
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136101.html

java提供接口,數據庫廠商實現接口


• JDBC API 提供兩類主要接口:
–一是面向開發人員的java.sql程序包,使得Java程序員能夠進行數
據庫連接,執行SQL查詢,並得到結果集合。
–一是面向底層數據庫廠商的JDBC Drivers。

在這裏插入圖片描述

前期準備工作/配置環境/導包

java建立工程,右鍵new filder新文件夾,命名爲lib
在這裏插入圖片描述
jar包複製到新建的文件夾中,右鍵 bulid pash 選擇第一個;

創建JDBC應用的步驟

• 1.加載數據庫的驅動程序(首先引入數據庫驅動的jar包)
–Class.forName(“driverName”);
• 2.建立數據庫連接
–String connStr = “jdbc:<JDBC驅動程序名:端口號>:數據源”
–Connection conn=DriverManager.getConnection(connStr);
• 3.執行數據庫操作SQL
–Statement stmt = conn.createStatement();
–ResultSet rs = stmt.executeQuery(sql);
• 4.得到ResultSet進行結果處理
• 5.關閉數據庫連接
–conn.close();
1.引入數據庫驅動的jar包
• 下載數據庫信息連接包
–MySQL連接驅動
•http://dev.mysql.com/downloads/connector/j/
–……
• 一般在工程目錄下新建libs文件夾,拷貝對應的jar文件到工程目錄下,添加buildpath
2.加載數據庫的驅動程序
• 構造數據庫的驅動字符
–MySQL驅動字符
• com.mysql.jdbc.Driver
• 加載MySQL驅動
–Class.forName(“com.mysql.jdbc.Driver”);

Driver

• Driver接口:每個JDBC數據庫驅動程序都會提供Driver接口
的具體實現
• 如果想連接數據庫,必須先加載數據庫廠商提供的數據庫驅
動程序
• 不同類型的JDBC數據庫驅動程序在編程時的加載方法也不同
• JDBC驅動程序加載方法:
–Class.forName(“jdbcdriver_classname”).newInstance();
–對於MySql數據
• jdbcdriver_classname=com.mysq.jdbc.Driver。
3.建立數據庫連接
連接數據庫的連接字符串
–MySQL連接字符串
• jdbc:mysql://localhost:3306/dbname
• 建立連接MySQL的代碼
Connection connectMySQL =
DriverManager.getConnection("jdbc:mysql://localhost:3306/myuser","root" ,"root" );

• JDBC URL 定義驅動程序與數據源之間的連接
–jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]….
–jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

解決數據庫與java服務器亂碼問題,底部紅字
在這裏插入圖片描述

可用參數

–user				 用戶名
–password 			 密碼
–autoReconnect 		 聯機失敗,是否重新聯機(true/false)
–maxReconnect 		 嘗試重新聯機次數
–initialTimeout 	 嘗試重新聯機間隔
–useUnicode 		 是否使用Unicode字體編碼(true/false)
–characterEncoding 	 何種編碼(GB2312/UTF-8/…)
–relaxAutocommit 	 是否自動提交(true/false)
–capitalizeTypeNames 數據定義的名稱以大寫表示

DriverManager

• DriverManager是 JDBC 的管理層,管理一組JDBC驅動程序的基本服務。
• DriverManager類的主要作用是跟蹤可用的驅動程序,並在數據庫和相應驅動程序之間建立連接。
• 調用DriverManager.getConnection()方法將建立與數據庫的連接,得到與數據庫連接的Connection對象。

Connection

• Connection類是JDBC規範中的最核心的類。
	–Statement對象和ResultSet對象等都直接或者間接的來源於它
• Connection對象表示與特定數據庫的連接(會話)。
	–得到Statement對象
		• createStatement()
		•prepareStatement(String sql)
		•prepareCall(String sql)
–爲了保證數據庫事務的原子性,Connection可以設置手動提交事務
conn.setAutoCommit(false);//不讓自動提交
	try {
		Statement stmt=conn.createStatement();
		stmt.execute (sql);
		conn.commit();
		} catch (SQLException e1) {
	conn.rollback();//事務回滾
}
SQL中一條語句就是一個事務

–boolean isClosed() 查詢此 Connection 對象是否已經被關閉
–CallableStatement prepareCall(String sql)
該方法返回一個CallableStatement對象,該對象能夠處理存儲過程
–PreparedStatement prepareStatement(String sql) throws
SQLException
這個方法返回一個PreparedStatement對象,並能把sql語句提交到
數據庫進行預編譯
–void commit() throws SQLException
進行當前業務開始以來的所有改變
–void rollback() throws SQLException
放棄當前業務開始以來的所有改變

手動提交事務和回滾

爲什麼要手動提交事務
–保證事務的原子性
• 關鍵代碼
–conn.setAutoCommit(false);try {
– Statement stmt=conn.createStatement();
– stmt.execute (sql);
– conn.commit();} catch (SQLException e1) {
conn.rollback();//事務回滾
}
4.執行數據庫操作SQL
• Java.sql.Statement常用方法:
–ResultSet executeQuery(String sql):執行給定的 SQL 語句,
該語句返回單個 ResultSet 對象
–int executeUpdate(String sql):執行給定 SQL 語句,可能爲
INSERT、UPDATE 或 DELETE 語句
–boolean isClosed():獲取是否已關閉了此 Statement 對象
–ResultSet getResultSet():以 ResultSet 對象的形式獲取當前結果
–int getUpdateCount():以更新計數的形式獲取當前結果;如果
結果爲 ResultSet 對象或沒有更多結果,則返回 -1

Statement

• Statement是向數據庫提交SQL語句並返回相應結果的工具。
語句可以是SQL查詢、修改、插入或者刪除
–PreparedStatement接口
•防止SQL注入攻擊(使用佔位符“?”)
•提高SQL的執行性能(在執行之前有預處理)
•避免使用SQL方言
•提高JDBC中有關SQL代碼的可讀性
–CallableStatement接口用於執行 SQL 存儲過程的接口

• execute:執行給定 SQL 語句,該語句可能返回多條結果
• executeQuery:執行給定的 SQL 語句,該語句返回單個
ResultSet 對象
• executeUpdate執行,該語句可能爲 INSERT、UPDATE
或 DELET給定 SQL 語句
• getConnection:獲取生成此 Statement 對象的
Connection 對象

• close:立即釋放此 Statement 對象的數據庫和 JDBC 資
源,而不是等待該對象自動關閉時發生此操作
• getFetchSize:獲取結果集合的行數
• getQueryTimeout:獲取驅動程序等待 Statement 對象
執行的秒數

PreparedStatement示例

• 在實際的項目裏,往往會要求使用PreparedStatement,
而不是Statement
• 同學們自己應該把前面的示例通過這種方式實現,並熟練
應用該方式

CallableStatement

• CallableStatement用於執行 SQL 存儲過程的接口
• CallableStatement繼承了PreparedStatement接口,所
以也繼承了PreparedStatement的方法
–在Java項目裏,已經很少應用存儲過程

ResultSet

• ResultSet表示數據庫結果集的數據表,通常通過執行查詢
數據庫的語句生成
• ResultSet對象具有指向其當前數據行的光標
• ResultSet類常用方法:
–String getString(int columnIndex):以 Java 編程語言中 String
的形式獲取此 ResultSet 對象的當前行中指定列的值

while (rs.next()) {
System.out.println(rs.getString("name"));
}


–boolean next():將光標從當前位置向前移一行。當調用 next 方
法返回 false 時,光標位於最後一行的後面
–int getInt(String columnIndex):以 Java 編程語言中 int 的形
式獲取此 ResultSet 對象的當前行中指定列的值。
–next:將光標從當前位置向前移一行
–getXXX:以某種對象的形式獲取指定 JDBC 該類型參數的值
–absolute:將光標移動到此 ResultSet 對象的給定行編號
–afterLast:將光標移動到此 ResultSet 對象的末尾,正好位於最
後一行之後
–beforeFirst:將光標移動到此 ResultSet 對象的開頭,正好位於
第一行之前


–close:立即釋放此 ResultSet 對象的數據庫和 JDBC 資源,而不
是等待該對象自動關閉時發生此操作
–first:將光標移動到此 ResultSet 對象的第一行
–getRow:獲取當前行編號
–isFirst:獲取光標是否位於此 ResultSet 對象的第一行
–isLast:獲取光標是否位於此 ResultSet 對象的最後一行
–last:將光標移動到此 ResultSet 對象的最後一行
–previous:將光標移動到此 ResultSet 對象的上一行

SQL數據類型

• 關係型數據庫的字段有自己的類型
• JDBC中有Java數據類型
• 對應關係:
–char-----java.lang.String
–varchar------ java.lang.String
–integer ----- java.lang.Integer
–date------java.sql.Date,java.util.Date
–……
• 特殊類型:日期時間、布爾型……
5.關閉數據庫連接
• 數據庫使用完畢後要進行手動關閉,否則造成系統資源浪費。
–檢測ResultSet是否關閉,否則關閉
–檢測Statement是否關閉,否則關閉
–檢測Connection是否關閉,否則關閉
if(rs!=null)try{rs.close();}catch(Exception e){e.printStackTrace();}
if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();}
if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();}

用JDBC進行數據庫連接

 從數據庫中查詢出員工的信息,並打印到控制檯上。
Class.forName("com.mysql.jdbc.Driver");
	String url ="jdbc:mysql://127.0.0.1:3306/em?useUnicode=true&characterEncoding=UTF-8";
		Connection conn = DriverManager.getConnection(url, "root", "");
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select * from employees");
		while (rs.next()) {
		System.out.println(rs.getString(“name”));
	}
conn.close();

用JDBC進行數據庫連接

• 通過程序增加員工信息到數據庫中,並提示添加是否成功
• 根據用戶輸入的員工編號及相關信息,通過程序更新員工信息到數據庫中,並提示更新是否成功
• 根據用戶輸入的員工編號,通過程序刪除員工信息,並提示刪除是否成功

完整代碼(兩部分)

package lww.onest;

import java.sql.SQLException;

import lww.onest.util.DBUtil;

public class DBTest {
//測試類
	public static void main(String[] args) {
		try {
			DBUtil dbUtil = new DBUtil();
			dbUtil.showJobs();
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
	}

}

package lww.onest.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	/**
	 * 查詢em數據庫中jobs表中的記錄
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public void showJobs() throws ClassNotFoundException, SQLException {
//1. 加載驅動,加載用的jar包,用的是第九章 反射的方法
		Class.forName("com.mysql.jdbc.Driver");//參數是固定的,一種數據庫一個參數。
		
		
		
//2. 獲取數據庫連接對象
		//連接的目標數據庫名,知道是那個數據庫。
		String connStr = "jdbc:mysql://localhost:3306/em";
		//上面的參數是固定的,一種數據庫一個參數格式,參數最後一部分是數據庫名字;
		//數據庫類型  用的端口號 訪問的數據庫名稱。
		
		//訪問數據庫的用戶名
		String user = "root";
		//訪問數據庫的密碼
		String pwd = "";
		Connection conn = DriverManager.getConnection(connStr, user, pwd);
		//參數 鏈接字符串,用戶名,密碼
		
		
//3. 利用連接對象獲取用於操作sql語句的Statement對象
		Statement statement = conn.createStatement();
		
		
//4. 利用Statement對象執行SQL語句實現數據操作
		String sql = "select * from jobs";
		ResultSet rs = statement.executeQuery(sql);	//ResultSet是一個記錄集,SQL包的靜態方法。
//		statement.execute("SQL語句");多用於數據定義
//		statement.executeUpdate("sql語句");(增加,刪除,修改的操作,返回值是受影響的個數)
		//遍歷ResultSet 獲取相應數據
		while(rs.next()) {//是否可以向下移動
			//獲取當前記錄中的數據
			//方法1. 通過字段索引獲取id,列索引是從1開始的。
			int id = rs.getInt(1);
			//方法2. 通過字段名稱獲取name
			String name = rs.getString("name");//是什麼類型就get什麼
			//在控制檯打印
			System.out.println(id + "\t" + name);// /t表示多個空格
		}
//5. 關閉數據庫連接
		statement.close();
		conn.close();
	}
}

數據庫連接代碼優化

現階段的數據庫連接代碼存在的問題:
–1、現階段代碼一次連接一次查詢,一般應用程序一次連接後可多
次執行數據操作
–2、數據庫的常量信息,每次都要進行代碼修改?是否可以提取出
相應的工程配置文件?
–3、對於現在的程序來說都是客戶端直接訪問數據庫操作?這樣不
利於界面和數據訪問的分離,如何添加業務邏輯?

對數據庫操作的封裝

• 分析在操作數據庫的代碼中,哪些是變化的,哪些是不變的?
• 將數據庫的連接和斷開操作封裝到工具類,可以反覆使用
public class ConnectionManager{
	public static Connection getConnection(){
		Connection connection = null;
		Class.forName("com.mysql.jdbc.Driver");
		String url =
		"jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEn
		coding=UTF-8";
		conn = DriverManager.getConnection(url, "admin", "");
		return connection;
	}
}

數據庫連接代碼優化

• 現階段的數據庫連接代碼存在的問題:
–1、現階段代碼一次連接一次查詢,一般應用程序一次連接後可多
次執行數據操作
–2、數據庫的常量信息,每次都要進行代碼修改?是否可以提取出
相應的工程配置文件?
–3、對於現在的程序來說都是客戶端直接訪問數據庫操作?這樣不
利於界面和數據訪問的分離,如何添加業務邏輯?

配置文件配置數據庫參數

• 在Java應用程序編寫過程中通常需要保存一些配置信息,
這些配置文件希望一般用戶可進行簡單配置。
• 常見配置文件種類:
–Xml配置文件
–Properties配置文件

在這裏插入圖片描述

配置文件配置數據庫參數

1、使用Java配置文件,配置工程常量
–在工程目錄下建立dbinfo.properties文件,PS:字符串不帶雙引號,不加分號

driver=com.mysql.jdbc.Driver
connectUrl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&ch
aracterEncoding=UTF-8
dbuser=admin
dbpwd=

• 2、在Java文件中讀取配置文件,用到Properties類。
	public class ConnectionManager{
		private static Properties properties;
		static {
			InputStream is =ConnectionManager.class.getResourceAsStream("/db.properties");
			properties = new Properties();
		
		try {
			properties.load(is);
			properties. getProperty("dbuser");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

MVC簡介

• MVC是模型(model)-視圖(view)-控制器(controller)的
縮寫。
• 一般的合理的工程目錄中要將此三部分進行分離。
–視圖層:是應用程序中用戶界面相關的部分,是用戶看到並與之
交互的界面。
–控制層:是根據用戶的輸入,控制用戶界面數據顯示和更新
model對象狀態。
–模型層:通常模型對象負責在數據庫中存取數據

數據庫操作的完整封裝(DAO)

• 一般情況下Java中的實體類對應數據庫中的表。
–例如:數據庫的User表,對應Java程序中的User類,字段也相互
對應
• 所以我們對於一張表的所有操作,在Java程序中體現到了
一個實體類的所有的操作。
• 一般標準工程中一個實體類會有一個對應的DAO類(Data
Access Object),來進行這個類的所有的操作
public class UserDao {
	ConnectionManager cm = new ConnectionManager();
	public List<User> selectAll(){
		List<User> list = new ArrayList<User>();
		Connection conn = cm.getConnection();
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("select * from users");
		while (rs.next()) {
			User u = new User();
			//設置user的值
			list.add(u);
		}
		//....
		return list;
	}
}

Java程序分包

• 全包名:一般格式公司的網址倒敘:com.baidu
–com.baidu.ui:界面包
–com.baidu.controller:程序的控制器包
–com.baidu.business:程序的業務邏輯包
–com.baidu.dao:所有實體類的數據訪問包
–com.baidu.entity( com.baidu.model):實體類所在包
–com.baidu.utils:工具類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章