文章目錄
常見的文件類型:
•純文本:沒有文件的格式要求
•數據傳輸格式: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][¶m2=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:工具類