[TOC]
# 簡介
* JDBC-ODBC橋接技術
|
|---在windows中有ODBC技術,ODBC是指開放數據庫連接,可以利用JDBC間接操作ODBC技術,從而實現數據庫連接
* JDBC直接連接
|
|---直接由不同的數據庫生產商提供指定的數據庫連接驅動程序實現,此類方式由于JDBC直接操作數據庫,所以性能是最好的
* JDBC網絡連接
|
|--- 使用專門的數據庫網絡連接指令進行指定主機的數據庫操作,
JDBC是接口,驅動是接口的實現,沒有驅動將無法完成數據庫連接,從而不能操作數據庫!
每個數據庫廠商都需要提供自己的驅動,用來連接自己公司的數據庫,也就是說驅動一般都由數據庫生成廠商提供。
# 開發步驟
1. 注冊驅動.
2. 獲得連接.
3. 獲得語句執行平臺
4. 執行sql語句
5. 處理結果
6. 釋放資源.
創建lib目錄,用于存放當前項目需要的所有jar包
## 注冊驅動
代碼:
~~~
Class.forName("com.mysql.jdbc.Driver");
~~~
JDBC規范定義驅動接口:java.sql.Driver,MySql驅動包提供了實現類:com.mysql.jdbc.Driver
DriverManager工具類,提供注冊驅動的方法 registerDriver(),方法的參數是java.sql.Driver,所以我們可以通過如下語句進行注冊:
~~~
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
~~~
以上代碼不推薦使用,存在兩方面不足
1. 硬編碼,后期不易于程序擴展和維護
2. 驅動被注冊兩次。
通常開發我們使用Class.forName() 加載一個使用字符串描述的驅動類。
如果使用Class.forName()將類加載到內存,該類的靜態代碼將自動執行。
通過查詢com.mysql.jdbc.Driver源碼,我們發現Driver類“主動”將自己進行注冊
~~~
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
……
}
~~~
驅動注冊了兩次.我們只需要將靜態代碼塊執行一次,類被加載到內存中會執行靜態代碼塊,并且只執行一次.
現在只需要將類加載到內存中即可:
方式1:
★Class.forName("全限定名");//包名+類名 com.mysql.jdbc.Driver
方式2:
類名.class;
方式3:
對象.getClass();
## 獲得鏈接
代碼:
~~~
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);
~~~
獲取連接需要方法 DriverManager.getConnection(url,username,password),三個參數分別表示,url 需要連接數據庫的位置(網址) user用戶名 password 密碼
url比較復雜,下面是mysql的url:
jdbc:mysql://localhost:3306/mydb
JDBC規定url的格式由三部分組成,每個部分中間使用冒號分隔。
* 第一部分是jdbc,這是固定的;
* 第二部分是數據庫名稱,那么連接mysql數據庫,第二部分當然是mysql了;
* 第三部分是由數據庫廠商規定的,我們需要了解每個數據庫廠商的要求,mysql的第三部分分別由數據庫服務器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。
## 獲得語句執行平臺
~~~
String sql = "某SQL語句";
~~~
獲取Statement語句執行平臺:
~~~
Statement stmt = con.createStatement();
~~~
常用方法:
* int executeUpdate(String sql); --執行insert update delete語句.
* ResultSet executeQuery(String sql); --執行select語句.
* boolean execute(String sql); --執行select返回true 執行其他的語句返回false.
## 處理結果集(執行insert、update、delete無需處理)
ResultSet實際上就是一張二維的表格,
我們可以調用其boolean next()方法指向某行記錄,
當第一次調用next()方法時,便指向第一行記錄的位置,
這時就可以使用ResultSet提供的getXXX(int col)方法
(與索引從0開始不同個,列從1開始)來獲取指定列的數據:
~~~
rs.next();//指向第一行
rs.getInt(1);//獲取第一行第一列的數據
~~~
常用方法:
* Object getObject(int index) / Object getObject(String name) 獲得任意對象
* String getString(int index) / Object getObject(String name) 獲得字符串
* int getInt(int index) / Object getObject(String name) 獲得整形
* double getDouble(int index) / Object getObject(String name) 獲得雙精度浮點型
## 釋放資源
與IO流一樣,使用后的東西都需要關閉!
關閉的順序是先得到的后關閉,后得到的先關閉。
~~~
rs.close();
stmt.close();
con.close();
~~~
# 預處理
## 預處理對象
使用PreparedStatement預處理對象時,建議每條sql語句所有的實際參數,都使用逗號分隔。
~~~
String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement預處理對象代碼:
PreparedStatement psmt = conn.prepareStatement(sql)
~~~
常用方法:
執行SQL語句:
~~~
int executeUpdate(); --執行insert update delete語句.
ResultSet executeQuery(); --執行select語句.
boolean execute(); --執行select返回true 執行其他的語句返回false.
~~~
設置實際參數
`void setXxx(int index, Xxx xx) 將指定參數設置為給定Java的xx值。在將此值發送到數據庫時,驅動程序將它轉換成一個 SQL Xxx類型值。`
例如:
setString(2, "家用電器") 把SQL語句中第2個位置的占位符? 替換成實際參數 "家用電器"
## 預處理對象executeUpdate方法
通過預處理對象的executeUpdate方法,完成記錄的insert\update\delete語句的執行。操作格式統一如下:
1. 注冊驅動
2. 獲取連接
3. 獲取預處理對象
4. SQL語句占位符設置實際參數
5. 執行SQL語句
6. 釋放資源
### 插入記錄:insert
實現向分類表中插入指定的新分類
~~~
public void demo01() throws Exception {
// 1注冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2獲取連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3獲得預處理對象
String sql = "insert into sort(sname) values(?)";
PreparedStatement stat = conn.prepareStatement(sql);
// 4 SQL語句占位符設置實際參數
stat.setString(1, "奢侈品");
// 5執行SQL語句
int line = stat.executeUpdate();
System.out.println("新添加記錄數:" + line);
// 6釋放資源
stat.close();
conn.close();
}
~~~
### 更新記錄:update
實現更新分類表中指定分類ID所對應記錄的分類名稱
~~~
public void demo02() throws Exception {
// 1注冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2獲取連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3獲得預處理對象中
String sql = "update sort set sname=? where sid=?";
PreparedStatement stat = conn.prepareStatement(sql);
// 4 SQL語句占位符設置實際參數
stat.setString(1, "數碼產品");
stat.setInt(2, 1);
// 5執行SQL語句
int line = stat.executeUpdate();
System.out.println("更新記錄數:" + line);
// 6釋放資源
stat.close();
conn.close();
}
~~~
### 刪除記錄:delete
實現刪除分類表中指定分類ID的記錄
~~~
public void demo03() throws Exception {
// 1注冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2獲取連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3獲得預處理對象
String sql = "delete from sort where sid=?";
PreparedStatement stat = conn.prepareStatement(sql);
// 4 SQL語句占位符設置實際參數
stat.setInt(1, 1);
// 5執行SQL語句
int line = stat.executeUpdate();
System.out.println("刪除記錄數:" + line);
// 6釋放資源
stat.close();
conn.close();
}
~~~
## 預處理對象executeQuery方法
通過預處理對象的executeQuery方法,完成記錄的select語句的執行。操作格式統一如下:
1. 注冊驅動
2. 獲取連接
3. 獲取預處理對象
4. SQL語句占位符設置實際參數
5. 執行SQL語句
6. 處理結果集(遍歷結果集合)
7. 釋放資源
### 查詢記錄:select
* 實現查詢分類表中指定分類名稱的記錄
~~~
public void demo05() throws Exception {
// 1注冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2獲取連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3獲得預處理對象
String sql = "select * from sort where sname=?";
PreparedStatement stat = conn.prepareStatement(sql);
// 4 SQL語句占位符設置實際參數
stat.setString(1, "奢侈品");
// 5執行SQL語句
ResultSet rs = stat.executeQuery();
// 6處理結果集(遍歷結果集合)
while( rs.next() ){
//獲取當前行的分類ID
String sid = rs.getString("sid");//方法參數為數據庫表中的列名
//獲取當前行的分類名稱
String sname = rs.getString("sname");
//顯示數據
System.out.println(sid+"-----"+sname);
}
// 7釋放資源
rs.close();
stat.close();
conn.close();
}
~~~
# properties配置文件
開發中獲得連接的4個參數(驅動、URL、用戶名、密碼)通常都存在配置文件中,方便后期維護,程序如果需要更換數據庫,只需要修改配置文件即可
通常情況下,我們習慣使用properties文件,此文件我們將做如下要求:
1. 文件位置:任意,建議src下
2. 文件名稱:任意,擴展名為properties
3. 文件內容:一行一組數據,格式是“key=value”.
a) key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
b) value值不支持中文,如果需要使用非英文字符,將進行unicode轉換。
* 創建配置文件
在項目跟目錄下,創建文件,輸入“db.properties”文件名。
文件中的內容
~~~
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=root
~~~
* 加載配置文件:Properties對象
對應properties文件處理,開發中也使用Properties對象進行。我們將采用加載properties文件獲得流,然后使用Properties對象進行處理。
JDBCUtils.java中編寫代碼
~~~
public class JDBCUtils {
private static String driver;
private static String url;
private static String user;
private static String password;
// 靜態代碼塊
static {
try {
// 1 使用Properties處理流
// 使用load()方法加載指定的流
Properties props = new Properties();
Reader is = new FileReader("db.properties");
props.load(is);
// 2 使用getProperty(key),通過key獲得需要的值,
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 獲得連接
*/
public static Connection getConnection() {
try {
// 1 注冊驅動
Class.forName(driver);
// 2 獲得連接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
~~~
## ResourceBundle 工具
~~~
//jdk提供的工具類加載properties文件,名字db.properties的后綴可以省略
ResourceBundle bundle = ResourceBundle.getBundle("db");
//通過key獲得需要的值
String driver = bundle.getString("driver");
System.out.println(driver);
~~~
- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化