- 通過使用JDBC API,Java程序可以非常方便地操作各種主流數(shù)據(jù)庫,這是是Java語言的巨大魅力所在
- 由于Java語言的跨平臺特性,所以使用JDBC API所編寫的程序不僅可以實(shí)現(xiàn)跨數(shù)據(jù)庫,還可以跨平臺,具有非常優(yōu)秀的可移植性
- 程序使用JDBC API以統(tǒng)一的方式來連接不同的數(shù)據(jù)庫,然后通過Statement對象來執(zhí)行標(biāo)準(zhǔn)SQL語句,并可以獲得SQL語句訪問數(shù)據(jù)庫的結(jié)果
- 1.JDBC驅(qū)動:稱為JDBC–ODBC橋,這種驅(qū)動是最早實(shí)現(xiàn)的JDBC驅(qū)動程序,主要目的是為了快速推廣JDBC。這種驅(qū)動程序?qū)DBC API映射到ODBC API。JDBC-ODBC也需要驅(qū)動,這種驅(qū)動由Sun公司提供實(shí)現(xiàn)
- 2.JDBC驅(qū)動:直接將JDBC API映射成數(shù)據(jù)庫特定的客戶端API。這種驅(qū)動程序包含特定數(shù)據(jù)庫的本地代碼,用于訪問特定數(shù)據(jù)庫的客戶端
- 3.JDBC驅(qū)動:支持三層結(jié)構(gòu)的JDBC訪問方式。主要用于Applet階段,通過Applet訪問數(shù)據(jù)庫
- 4.JDBC驅(qū)動:是純Java的,直接與數(shù)據(jù)庫實(shí)例交互。這種驅(qū)動是智能的,它知道數(shù)據(jù)庫使用的底層協(xié)議,這種驅(qū)動是目前最流行的JDBC驅(qū)動
- (1)下載MySQL安裝文件
- (2)開始安裝MySQL后,在出現(xiàn)的對話框中單擊“Next”按鈕
- (3)單擊對話框的“Next”按鈕,將出現(xiàn)選擇安裝組件和安裝路徑的對話框。
- (4)單擊對話框中的“Next”按鈕,將可開始安裝MySQL數(shù)據(jù)庫系統(tǒng),安裝成功后,系統(tǒng)還要求配置MySQL數(shù)據(jù)庫
- (5)配置數(shù)據(jù)庫時注意選擇合適的字符集,并設(shè)置密碼
<br> - 查詢數(shù)據(jù)庫:show databases;
<br> - 刪除數(shù)據(jù)庫:drop database 數(shù)據(jù)庫名;
<br> - 進(jìn)入數(shù)據(jù)庫:use 數(shù)據(jù)庫名
<br> - 顯示創(chuàng)建庫名的所有數(shù)據(jù):show tables;
<br> - 輸出表名:desc 表名
<br> SQL語句四大部分
<br> - 數(shù)據(jù)定義語言(DDL):drop、create、alter
<br> - 數(shù)據(jù)操作語言(DML):insert、update、delete
<br> - 數(shù)據(jù)查詢語言(DQL):select、from、where、group by
<br> - 數(shù)據(jù)控制語言(DCL):grant、revoke、commit、rollback
<br> ```
- DriverManager
- Connection
- Statement
- PreparedStatement
- ResultSet
- (1)加載數(shù)據(jù)庫驅(qū)動
- (2)通過DriverManager獲取數(shù)據(jù)庫連接
- (3)通過Connection對象創(chuàng)建Statement對象
- (4)使用Statement執(zhí)行SQL語句。所有Statement都有如下三個方法來執(zhí)行SQL語句
- (5)操作結(jié)果集。如果執(zhí)行的SQL語句是查詢語句,執(zhí)行結(jié)果將返回一個ResultSet對象,該對象里保存了SQL語句查詢的結(jié)果。程序可以通過操作該ResultSet對象來取出查詢結(jié)果
- 使用executeUpdate執(zhí)行DDL和DML語句
- 使用execute方法執(zhí)行SQL語句
- 使用executeQuery方法執(zhí)行查詢語句
數(shù)據(jù)庫連接池的解決方案是:當(dāng)應(yīng)用程序啟動時,系統(tǒng)主動建立足夠的數(shù)據(jù)庫連接,并將這些連接組成一個連接池
每次應(yīng)用程序請求數(shù)據(jù)庫連接時,無需重新打開連接,而是從池中取出已有的連接使用,使用完后,不再關(guān)閉數(shù)據(jù)庫連接,而是直接將該連接歸還給連接池。通過使用連接池,將大大提高程序運(yùn)行效率
數(shù)據(jù)庫連接池的常用參數(shù)有如下:
- 數(shù)據(jù)庫的初始連接數(shù)
- 連接池的最大連接數(shù)
- 連接池的最小連接數(shù)
- 連接池的每次增加的容量
- DBCP:是Apache軟件基金組織下的開源連接池實(shí)現(xiàn),該連接池依賴該組織下的另一個開源系統(tǒng):common-pool
- C3P0:數(shù)據(jù)源性能更勝一籌,Hibernate就推薦使用該連接池
C3P0連接池不僅可自動清理不再使用的Connection,還可以自動清理Statement和ResultSet
<br> package cn.jdbc;
<br> import java.sql.Connection;
<br> import java.sql.DriverManager;
<br> import java.sql.SQLException;
<br> /**
<br> * 創(chuàng)建初始化并獲取
<br> */
<br> public class MyJdBc {
<br> private static Connection cot = null;//聲明
<br> //靜態(tài)代碼塊
<br> static{
<br> try {
<br> Class.forName("com.mysql.jdbc.Driver");
<br> //數(shù)據(jù)庫名稱,用戶名,密碼
<br> cot = DriverManager.getConnection("jdbc:mysql://localhost:3306/sqltestdb","root","root");
<br> if(!cot.isClosed()){
<br> System.out.println("數(shù)據(jù)連接成功");
<br> }
<br> } catch (ClassNotFoundException e) {
<br> e.printStackTrace();
<br> }catch(SQLException e){
<br> e.printStackTrace();
<br> }
<br> }
<br> public static Connection getInstace(){
<br> return cot;//返回對象
<br> }
<br> }
<br> ```
<br> ```
<br> package cn.jdbc;
<br> import java.sql.Connection;
<br> import java.sql.ResultSet;
<br> import java.sql.SQLException;
<br> import java.sql.Statement;
<br> import java.text.DateFormat;
<br> import java.text.ParseException;
<br> import java.text.SimpleDateFormat;
<br> import java.util.Date;
<br> import com.mysql.jdbc.PreparedStatement;
<br> /**
<br> * JAVA連接JDBC驅(qū)動器
<br> * @author JEEP-711
<br> *
<br> */
<br> public class JdBc {
<br> @SuppressWarnings("unused")
<br> public static void main(String[] args) throws SQLException, ParseException {
<br> Connection cot = MyJdBc.getInstace();//連接
<br> Statement st = cot.createStatement();//創(chuàng)建Statement類對象,來執(zhí)行SQL語句
<br> String sql = "select * from emp";//要執(zhí)行的SQL語句
<br> ResultSet rs = st.executeQuery(sql);//ResultSet類,用來存放獲取結(jié)果集
<br> System.out.println("-----------------------------------------------");
<br> System.out.println("------------------執(zhí)行結(jié)果如下所示------------------");
<br> System.out.println("-----------------------------------------------");
<br> System.out.println("ID"+"\t"+"姓名"+"\t"+"職稱"+"\t"+"\t時期"+"\t"+"資金");
<br> System.out.println("-----------------------------------------------");
<br> /**
<br> * 查詢
<br> */
<br> String job = null;//職位
<br> String names = null;//姓名
<br> String empon = null;//id號
<br> String hiredate = null;//時期
<br> String sal = null;//資金
<br> while(rs.next()){
<br> job = rs.getString("job");//獲取表中過得字段職稱st列數(shù)據(jù)
<br> names = rs.getString("ename");//獲取姓名數(shù)據(jù)
<br> empon = rs.getString("empon");//獲取ID號
<br> hiredate = rs.getString("hiredate");//獲取時間時期
<br> sal = rs.getString("sal");//獲取資金
<br> System.out.println(empon+"\t"+names+"\t"+job+"\t"+hiredate+"\t"+sal);//輸出結(jié)果
<br> /**
<br> * 添加數(shù)據(jù)
<br> */
<br> PreparedStatement pl;
<br> ResultSet res;
<br> //預(yù)處理添加數(shù)據(jù),其中有兩個參數(shù)--"?"
<br> pl = (PreparedStatement) cot.prepareStatement("insert into emp (empon,ename,job,hiredate,sal)"+
<br> "values(?,?,?,?,?)");
<br> pl.setInt(1, 3211);//設(shè)置參數(shù)為1,id為3212
<br> pl.setString(2, "王剛");//設(shè)置參數(shù)為2,name為王剛
<br> pl.setString(3, "總裁");//設(shè)置參數(shù)3,職位為總裁
<br> DateFormat df2 = new SimpleDateFormat("yyy-MM-dd");
<br> Date myDate2 = df2.parse("2010-09-13");
<br> pl.setDate(4, new java.sql.Date(myDate2.getTime()));
<br> pl.setFloat(5, (float)2000.3);
<br> pl.executeUpdate();//實(shí)行更新
<br> /**
<br> * 更新數(shù)據(jù)
<br> */
<br> //PreparedStatement gx;
<br> //預(yù)處理更新(修改)數(shù)據(jù),將王剛的sal修改為5000.00
<br> pl = (PreparedStatement) cot.prepareStatement("update emp set sal = ? where ename = ?");
<br> pl.setFloat(1,(float) 5000.00);
<br> pl.setString(2, "王剛");
<br> pl.executeUpdate();//實(shí)行修改
<br> /**
<br> * 刪除數(shù)據(jù)
<br> */
<br> //PreparedStatement sc;
<br> //預(yù)處理刪除數(shù)據(jù)
<br> pl = (PreparedStatement) cot.prepareStatement("delete from emp where sal & ?");
<br> pl.setFloat(1, 4500);
<br> pl.executeUpdate();//實(shí)行刪除
<br> pl.close();//關(guān)閉
<br> }
<br> rs.close();//關(guān)閉
<br> cot.close();//關(guān)閉
<br> } catch (ClassNotFoundException e) {
<br> System.out.println("數(shù)據(jù)庫驅(qū)動異常");//數(shù)據(jù)庫驅(qū)動類異常處理
<br> e.printStackTrace();
<br> } catch (SQLException e) {
<br> System.out.println("數(shù)據(jù)庫連接失敗");//數(shù)據(jù)庫連接失敗異常處理
<br> e.printStackTrace();
<br> } catch (Exception e) {
<br> e.printStackTrace();
<br> }finally{
<br> System.out.println("數(shù)據(jù)庫數(shù)據(jù)成功獲取!");
<br> }
<br> }
<br> }
<br> ```
更多建議: