12-jdbc入门
一、jdbc基本概念
jdbc : Java Database Connectivity
sun公司為了統(tǒng)一對數(shù)據(jù)庫的操作,定義了一套api,稱之為jdbc
這套api完全有接口組成,我們在編寫程序的時候針對接口進行調(diào)用
這些接口交給數(shù)據(jù)庫廠家去實現(xiàn), 不同的數(shù)據(jù)庫廠商會提供不同的實現(xiàn)類,這些實現(xiàn)類被我們稱作數(shù)據(jù)庫的驅(qū)動
?
二、實現(xiàn)jdbc程序
步驟:
1. 實驗環(huán)境
建 user 表? user.sql
create database day12 character set utf8 collate utf8_general_ci;
?
use day12;
?
create table users(
??? id int primary key auto_increment,
??? name varchar(40),
??? password varchar(40),
??? email varchar(60),
??? birthday date
)character set utf8 collate utf8_general_ci;
?
insert into users(name,password,email,birthday)
values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday)
values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday)
values('wangwu','123456','wangwu@sina.com','1979-12-04');
?
2. 導入數(shù)據(jù)庫的驅(qū)動
mysql-connector-java-5.0.8-bin.jar
?
3. 編程java程序
// 1. 注冊數(shù)據(jù)庫的驅(qū)動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2. 建立與mysql數(shù)據(jù)庫的連接? 用到 jdbc api
String url = "jdbc:mysql://localhost:3306/day11";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 創(chuàng)建用于發(fā)送sql語句的 Statement 對象
Statement stmt = conn.createStatement();
// 4. 編寫一句 sql
String sql = "select * from users";
// 5. 發(fā)送sql, 獲得結(jié)果集
ResultSet rs = stmt.executeQuery(sql);
// 6. 處理結(jié)果集
System.out.println("id | name?? | password | email? | birthday");
while(rs.next()) {
??? // 有第一行
??? int id = rs.getInt("id");?? // 通過列名取值比較直觀
??? String name = rs.getString("name");
??? String psw = rs.getString("password");
??? String email = rs.getString("email");
??? Date birthday = rs.getDate("birthday");
??? System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
}
// 7. 關(guān)閉連接 釋放資源
rs.close();
stmt.close();
conn.close();
?
三、jdbc程序詳解
1. 注冊驅(qū)動
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
上面的語句會導致注冊兩次驅(qū)動
原因在于,查看Driver類的源碼會發(fā)現(xiàn)在靜態(tài)代碼塊中完成了注冊驅(qū)動的工作,
也就是說注冊驅(qū)動其實很簡單,只需要加載驅(qū)動類即可
Class.forName(“com.mysql.jdbc.Driver”);
?
2. 創(chuàng)建數(shù)據(jù)庫的連接
Connection conn = DriverManager.getConnection(url, user, password);
其中:
url, 相當于數(shù)據(jù)庫的訪問地址,程序員通過url指定需要訪問的數(shù)據(jù)庫
jdbc:mysql:[]//localhost:3306/test?參數(shù)名:參數(shù)值
其中jdbc為主協(xié)議,mysql為子協(xié)議,localhost為主機名,3306為端口號,test為數(shù)據(jù)庫名
url的后面可以跟參數(shù),常用的參數(shù)有:user=root&password=root&characterEncoding=UTF-8
?
如果url地址后面跟了user和password,創(chuàng)建Connection對象時將不必再次傳入值
Connection conn = DriverManager.getConnection(url);
?
補充: 如果訪問的localhost:3306,url 可省寫為jdbc:mysql:///test
?
3. Connection 對象
Connection對象用于表示與某個數(shù)據(jù)庫之間的連接,在程序中對數(shù)據(jù)庫的所有操作都需要通過此對象來完成
常用方法有:
createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象。
prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預編譯sql的PreparedStatement對象。
prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的callableStatement對象。
setAutoCommit(boolean?autoCommit):設置事務是否自動提交。
commit() :在鏈接上提交事務。
rollback() :在此鏈接上回滾事務。
?
4. Statement 對象
用于向數(shù)據(jù)庫發(fā)送sql語句
execute(String sql):用于向數(shù)據(jù)庫發(fā)送任意sql語句,但是返回值為boolean,不能滿足我們的需求
executeQuery(String?sql) :只能向數(shù)據(jù)發(fā)送查詢語句,返回值是ResultSet 結(jié)果
executeUpdate(String?sql):只能向數(shù)據(jù)庫發(fā)送insert、update或delete語句
addBatch(String?sql) :把多條sql語句放到一個批處理中。
executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行。
?
5. ResultSet 對象
對于查詢操作,該對象特別重要,因為它專門用于封裝結(jié)果集
存儲的形式就是一種表格的形式,同樣是列+行,說白了就和我們在 dos 命令行窗口查詢的結(jié)果一樣
?
遍歷方式:
一開始游標指向結(jié)果集第一行, 也就是表頭
通過 next 將游標移向下一行, 如果沒有下一行,該方法會返回false
獲得當前行的數(shù)據(jù)需要調(diào)用get方法:
get(int index)獲得第幾列? 列數(shù)從1開始
get(String columnName) 根據(jù)列名獲得值? 常用
?
數(shù)據(jù)庫的數(shù)據(jù)類型與java中數(shù)據(jù)類型的對應關(guān)系
?
ResultSet對象的常用方法
next():移動到下一行
previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最后面。
?
6. 釋放數(shù)據(jù)庫資源
由于數(shù)據(jù)庫的資源非常寶貴,所以用完了一定要記得釋放資源
特別是Connection對象,因為數(shù)據(jù)允許的并發(fā)訪問連接數(shù)量往往都比較有限
?
在java程序中,我們應該將最終必須要執(zhí)行的代碼放到finally當中
?
釋放資源的代碼
if(rs!=null) {
??? try {
?????? rs.close();
??? } catch (SQLException e) {
?????? e.printStackTrace();
??? }
??? rs = null;
}
?
if(stmt!=null) {
??? try {
?????? stmt.close();
??? } catch (SQLException e) {
?????? e.printStackTrace();
??? }
??? stmt = null;
}
?
if(conn!=null) {
??? try {
?????? conn.close();
??? } catch (SQLException e) {
?????? e.printStackTrace();
??? }
??? conn = null;
}
?
?
四、jdbc實現(xiàn)crud
1. 編寫程序?qū)ser表進行增刪改查操作
?
2. 防止 sql 注入
在 service 層進行邏輯判斷
使用PreparedStatement對象
?
3. 編寫工具類對 jdbc 程序進行優(yōu)化
將獲得連接和釋放資源的代碼寫到通用的工具類中
?
?
?
五、 jdbc案例
實現(xiàn)一個簡單的員工信息管理系統(tǒng),練習對員工表的crud
?
| 字段名 | 說明 | 類型 |
| id | 編號 | varchar(40) |
| name | 員工姓名 | varchar(20) |
| gender | 性別 | varchar(4) |
| birthday | 出生日期 | date |
| idcard | 身份證號 | varchar(20) |
| degree | 學歷 | varchar(20) |
| entrydate | 入職日期 | date |
| position | 部門 | varchar(40) |
| department | 職位 | varchar(20) |
?
?
web開發(fā)的兩種模式
?
model1: jsp+javabean?? 只適合小型應用
model2: servlet+jsp+javabean??? mvc
?????? jsp 的作用只是顯示的模板,所以在mvc中jsp應該禁止外界直接方法,藏在 web-inf下面
?
web應用的分層框架
?
案例實現(xiàn)步驟:
1. 搭建開發(fā)環(huán)境
1) 建工程 建包
2) 導入需要jar包
??? BeanUtils 相關(guān)jar包
??? jstl? 標簽
??? mysql 的驅(qū)動
3) 創(chuàng)建數(shù)據(jù)庫和表
??? create database day12_employee;
??? use day12_employee;
??? create table employee
??? (
?????? id varchar(40) primary key,
?????? name varchar(20),
?????? gender varchar(6),
?????? birthday date,
?????? idcard varchar(20),
?????? degree varchar(20),
?????? entrydate date,
?????? department varchar(20),
?????? position varchar(40)
??? );
?
?
2. 設計bean
Employee.java
?
3. 實現(xiàn)dao
?
4. 實現(xiàn)service
簡單service 原封不動調(diào)用dao的方法
?
5. 實現(xiàn)web層
首頁
?
?
?
?
?
?
?
?
?
總結(jié)
- 上一篇: 新中国第一艘核潜艇
- 下一篇: 德军装甲军团的秘密武器