JDBC和DBUtils
JDBC
JDBC:Java DataBase Connectivity Java資料庫的連線。是SUN公司統一提供的一套介面規範(JDBC).各個資料庫生產商提供實現。Java提供訪問資料庫規範稱為JDBC,而生產廠商提供規範的實現類稱為驅動。驅動:兩個硬體裝置之間通訊的橋樑。
JDBC是介面,驅動是介面的實現,沒有驅動將無法完成資料庫連線,從而不能操作資料庫!每個資料庫廠商都需要提供自己的驅動,用來連線自己公司的資料庫,也就是說驅動一般都由資料庫生成廠商提供。
JDBC操作資料庫的步驟
- 註冊驅動
Class.forName(“com.mysql.jdbc.Driver”);
告知JVM使用的是哪一個資料庫的驅動 - 獲得連線
Connection con = DriverManager.getConnection(url, username, password);
使用JDBC中的類,完成對MySQL資料庫的連線 - 獲得語句執行平臺
普通的處理: Statement stat = con.createStatement();
預處理物件
String sql = “SELECT * FROM users WHERE username=? AND PASSWORD=?”;
PreparedStatement pstat = conn.prepareStatement(sql)
通過連線物件獲取對SQL語句的執行者物件 - 執行sql語句
int row = stat.executeUpdate(sql);
ResultSet rs = stat.executeQuery(sql);
使用執行者物件,向資料庫執行SQL語句
獲取到資料庫的執行後的結果 - 處理結果
- 釋放資源 一堆close()
JDBC操作資料庫的常用物件
Connection
建立執行SQL的物件
Statement createStatement()
PreparedStatement prepareStatement(String sql)
CallableStatement prepareCall(String sql) 建立一個CallableStatement物件來呼叫資料庫儲存過程
進行事務管理
void setAutoCommit(boolean bl)
void commit()
void rollback()
PreparedStatement
String sql = “SELECT * FROM users WHERE username=? AND PASSWORD=?”;
PreparedStatement pstat = 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型別值。
Statement
執行sql語句
ResultSet executeQuery(String sql)
int executeUpdate(String sql)
批處理執行
void addBatch(String sql) 將給定的SQL命令新增到此Statement物件的當前命令列表中
void clearBatch() 清空此Statement物件的當前命令列表
int[] executeBatch() 將一批命令提交給資料庫執行,如果全部成功,則返回更新計陣列成的陣列
ResultSet
JDBC的元資料MataData(瞭解)– 編寫通用性較高的程式碼
DatabaseMetaData:獲得資料庫連線的資訊,獲得資料庫的表的資訊.
獲得資料庫元資料:Connection中getMetaData();
ParameterMetaData:獲得SQL中的引數的個數及型別.
獲得引數元資料:PreparedStatement中getParameterMetaData()
ResultSetMetaData:獲得結果集中的列名及列的型別.
獲得結果集元資料:ResultSet中getMeta()
@Test
/**
* 資料庫元資料
*/
public void demo1(){
Connection conn = null;
conn = JDBCUtils2.getConnection();
// 獲得資料庫元資料:
try {
DatabaseMetaData metaData = conn.getMetaData();
System.out.println("獲得驅動名稱:"+metaData.getDriverName());
System.out.println("獲得驅動URL:"+metaData.getURL());
System.out.println("獲得使用者名稱:"+metaData.getUserName());
// 獲得表中的主鍵:
ResultSet rs = metaData.getPrimaryKeys(null, null, "category");
if(rs.next()){
String name = rs.getString("COLUMN_NAME");
System.out.println(name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
/**
* 引數元資料:
*/
public void demo2(){
Connection conn = null;
PreparedStatement stmt = null;
try{
conn = JDBCUtils2.getConnection();
String sql = "update category set cname = ? where cid = ?";
stmt = conn.prepareStatement(sql);
ParameterMetaData metaData = stmt.getParameterMetaData();
int count = metaData.getParameterCount();
System.out.println(count);
}catch(Exception e){
}
}
@Test
/**
* 結果集元資料:
*/
public void demo3(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = JDBCUtils2.getConnection();
String sql = "select * from category";
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
for(int i = 1;i<=count ;i++){
String name = metaData.getColumnName(i);
String type = metaData.getColumnTypeName(i);
System.out.println(name+type);
}
}catch(Exception e){
}
}
DBUtils
properties配置檔案
開發中獲得連線的4個引數(驅動、URL、使用者名稱、密碼)通常都存在配置檔案中,方便後期維護,程式如果需要更換資料庫,只需要修改配置檔案即可。
通常情況下,我們習慣使用properties檔案,此檔案我們將做如下要求:
1. 檔案位置:任意,建議src下
2. 檔名稱:任意,副檔名為properties
3. 檔案內容:一行一組資料,格式是“key=value”.
a) key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
b) value值不支援中文,如果需要使用非英文字元,將進行unicode轉換。
DBUtils
DBUtils就是JDBC的簡化開發工具包。需要專案匯入commons-dbutils-1.6.jar才能夠正常使用DBUtils工具。DBUtils是java程式設計中的資料庫操作實用工具,小巧簡單實用。
DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少寫程式碼。
Dbutils三個核心功能介紹
QueryRunner中提供對sql語句操作的API.
ResultSetHandler介面,用於定義select操作後,怎樣封裝結果集.
DbUtils類,它就是一個工具類,定義了關閉資源與事務處理的方法
QueryRunner
update(Connection conn, String sql, Object… params) ,用來完成表資料的增加、刪除、更新操作
query(Connection conn, String sql, ResultSetHandler rsh, Object… params) ,用來完成表資料的查詢操作
ResultSetHandler結果集處理類
- ArrayHandler 將結果集中的第一條記錄封裝到一個Object[]陣列中,陣列中的每一個元素就是這條記錄中的每一個欄位的值
- ArrayListHandler 將結果集中的每一條記錄都封裝到一個Object[]陣列中,將這些陣列在封裝到List集合中。
- BeanHandler 將結果集中第一條記錄封裝到一個指定的javaBean中。
- BeanListHandler 將結果集中每一條記錄封裝到指定的javaBean中,將這些javaBean在封裝到List集合中
- ColumnListHandler 將結果集中指定的列的欄位值,封裝到一個List集合中
- ScalarHandler 它是用於單資料。例如select count(*) from 表操作。
- MapHandler 將結果集第一行封裝到Map集合中,Key 列名, Value 該列資料
- MapListHandler 將結果集第(每)一行封裝到Map集合中,Key 列名, Value 該列資料,Map集合儲存到List集合