JDBC 教程
jdbc 教程
jdbc 即 java database connectivity,是指 java 數(shù)據(jù)庫連接,在 java 語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。
jdbc 提供了一組 api,用于訪問任何形式的表格數(shù)據(jù),尤其是存儲(chǔ)在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。
jdbc 使用流程如下:
- 連接數(shù)據(jù)源,比如:數(shù)據(jù)庫。
- 為數(shù)據(jù)庫傳遞查詢和更新指令。
- 處理數(shù)據(jù)庫響應(yīng)并返回的結(jié)果。
1. jdbc 架構(gòu)
jdbc api支持兩層和三層處理模型進(jìn)行數(shù)據(jù)庫訪問,但在一般的jdbc體系結(jié)構(gòu)由兩層組成:
- jdbc api: 提供了應(yīng)用程序?qū)dbc的管理連接。
- jdbc driver api: 支持jdbc管理到驅(qū)動(dòng)器連接。
jdbc api 的使用驅(qū)動(dòng)程序管理器和數(shù)據(jù)庫特定的驅(qū)動(dòng)程序提供透明的連接到異構(gòu)數(shù)據(jù)庫。
dbc驅(qū)動(dòng)程序管理器可確保正確的驅(qū)動(dòng)程序來訪問每個(gè)數(shù)據(jù)源。該驅(qū)動(dòng)程序管理器能夠支持連接到多個(gè)異構(gòu)數(shù)據(jù)庫的多個(gè)并發(fā)的驅(qū)動(dòng)程序。
以下是結(jié)構(gòu)圖,它顯示了驅(qū)動(dòng)程序管理器方面的jdbc驅(qū)動(dòng)程序和java應(yīng)用程序的位置:
2. jdbc 組件
jdbc api 提供了以下接口和類:
- drivermanager
這個(gè)類管理數(shù)據(jù)庫驅(qū)動(dòng)程序的列表。內(nèi)容是否符合從java應(yīng)用程序使用的通信子協(xié)議正確的數(shù)據(jù)庫驅(qū)動(dòng)程序的連接請求。識別jdbc在一定子協(xié)議的第一個(gè)驅(qū)動(dòng)器將被用來建立數(shù)據(jù)庫連接。 - driver
此接口處理與數(shù)據(jù)庫服務(wù)器通信。很少直接與驅(qū)動(dòng)程序?qū)ο蟆O喾矗褂胐rivermanager中的對象,它管理此類型的對象。它也抽象與驅(qū)動(dòng)程序?qū)ο蠊ぷ飨嚓P(guān)的詳細(xì)信息。 - connection
此接口與接觸數(shù)據(jù)庫的所有方法。連接對象表示通信上下文,即,與數(shù)據(jù)庫中的所有的通信是通過唯一的連接對象。 - statement
可以使用這個(gè)接口創(chuàng)建的對象的sql語句提交到數(shù)據(jù)庫。一些派生的接口接受除執(zhí)行存儲(chǔ)過程的參數(shù)。 - resultset
這些對象保存從數(shù)據(jù)庫后,執(zhí)行使用statement對象的sql查詢中檢索數(shù)據(jù)。它作為一個(gè)迭代器,讓您可以通過移動(dòng)它的數(shù)據(jù)。 - sqlexception
這個(gè)類處理發(fā)生在一個(gè)數(shù)據(jù)庫應(yīng)用程序的任何錯(cuò)誤。
3. jdbc 編程步驟
1)加載驅(qū)動(dòng)程序
class.forname(driverclass) //加載mysql驅(qū)動(dòng) class.forname("com.mysql.jdbc.driver") //加載oracle驅(qū)動(dòng) class.forname("oracle.jdbc.driver.oracledriver")
2)獲得數(shù)據(jù)庫連接
drivermanager.getconnection("jdbc:mysql://127.0.0.1:3306/imooc", "root", "root");
3)創(chuàng)建 statement\preparedstatement 對象
conn.createstatement(); conn.preparestatement(sql);
4. jdbc 完整編程范例
import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.statement; public class dbutil { public static final string url = "jdbc:mysql://localhost:3306/imooc"; public static final string user = "liulx"; public static final string password = "123456"; public static void main(string[] args) throws exception { //1.加載驅(qū)動(dòng)程序 class.forname("com.mysql.jdbc.driver"); //2. 獲得數(shù)據(jù)庫連接 connection conn = drivermanager.getconnection(url, user, password); //3.操作數(shù)據(jù)庫,實(shí)現(xiàn)增刪改查 statement stmt = conn.createstatement(); resultset rs = stmt.executequery("select user_name, age from imooc_goddess"); //如果有數(shù)據(jù),rs.next()返回true while(rs.next()){ system.out.println(rs.getstring("user_name")+" 年齡:"+rs.getint("age")); } } }
5. jdbc 增刪改查編程范例
public class dbutil { public static final string url = "jdbc:mysql://localhost:3306/imooc"; public static final string user = "liulx"; public static final string password = "123456"; private static connection conn = null; static{ try { //1.加載驅(qū)動(dòng)程序 class.forname("com.mysql.jdbc.driver"); //2. 獲得數(shù)據(jù)庫連接 conn = drivermanager.getconnection(url, user, password); } catch (classnotfoundexception e) { e.printstacktrace(); } catch (sqlexception e) { e.printstacktrace(); } } public static connection getconnection(){ return conn; } } //模型 package liulx.model; import java.util.date; public class goddess { private integer id; private string user_name; private integer sex; private integer age; private date birthday; //注意用的是java.util.date private string email; private string mobile; private string create_user; private string update_user; private date create_date; private date update_date; private integer isdel; //getter setter方法。。。 } //---------dao層-------------- package liulx.dao; import liulx.db.dbutil; import liulx.model.goddess; import java.sql.connection; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; import java.util.arraylist; import java.util.list; public class goddessdao { //增加 public void addgoddess(goddess g) throws sqlexception { //獲取連接 connection conn = dbutil.getconnection(); //sql string sql = "insert into imooc_goddess(user_name, sex, age, birthday, email, mobile,"+ "create_user, create_date, update_user, update_date, isdel)" +"values("+"?,?,?,?,?,?,?,current_date(),?,current_date(),?)"; //預(yù)編譯 preparedstatement ptmt = conn.preparestatement(sql); //預(yù)編譯sql,減少sql執(zhí)行 //傳參 ptmt.setstring(1, g.getuser_name()); ptmt.setint(2, g.getsex()); ptmt.setint(3, g.getage()); ptmt.setdate(4, new date(g.getbirthday().gettime())); ptmt.setstring(5, g.getemail()); ptmt.setstring(6, g.getmobile()); ptmt.setstring(7, g.getcreate_user()); ptmt.setstring(8, g.getupdate_user()); ptmt.setint(9, g.getisdel()); //執(zhí)行 ptmt.execute(); } public void updategoddess(){ //獲取連接 connection conn = dbutil.getconnection(); //sql, 每行加空格 string sql = "update imooc_goddess" + " set user_name=?, sex=?, age=?, birthday=?, email=?, mobile=?,"+ " update_user=?, update_date=current_date(), isdel=? "+ " where id=?"; //預(yù)編譯 preparedstatement ptmt = conn.preparestatement(sql); //預(yù)編譯sql,減少sql執(zhí)行 //傳參 ptmt.setstring(1, g.getuser_name()); ptmt.setint(2, g.getsex()); ptmt.setint(3, g.getage()); ptmt.setdate(4, new date(g.getbirthday().gettime())); ptmt.setstring(5, g.getemail()); ptmt.setstring(6, g.getmobile()); ptmt.setstring(7, g.getupdate_user()); ptmt.setint(8, g.getisdel()); ptmt.setint(9, g.getid()); //執(zhí)行 ptmt.execute(); } public void delgoddess(){ //獲取連接 connection conn = dbutil.getconnection(); //sql, 每行加空格 string sql = "delete from imooc_goddess where id=?"; //預(yù)編譯sql,減少sql執(zhí)行 preparedstatement ptmt = conn.preparestatement(sql); //傳參 ptmt.setint(1, id); //執(zhí)行 ptmt.execute(); } public list query() throws sqlexception { connection conn = dbutil.getconnection(); statement stmt = conn.createstatement(); resultset rs = stmt.executequery("select user_name, age from imooc_goddess"); list gs = new arraylist(); goddess g = null; while(rs.next()){ g = new goddess(); g.setuser_name(rs.getstring("user_name")); g.setage(rs.getint("age")); gs.add(g); } return gs; } public goddess get(){ goddess g = null; //獲取連接 connection conn = dbutil.getconnection(); //sql, 每行加空格 string sql = "select * from imooc_goddess where id=?"; //預(yù)編譯sql,減少sql執(zhí)行 preparedstatement ptmt = conn.preparestatement(sql); //傳參 ptmt.setint(1, id); //執(zhí)行 resultset rs = ptmt.executequery(); while(rs.next()){ g = new goddess(); g.setid(rs.getint("id")); g.setuser_name(rs.getstring("user_name")); g.setage(rs.getint("age")); g.setsex(rs.getint("sex")); g.setbirthday(rs.getdate("birthday")); g.setemail(rs.getstring("email")); g.setmobile(rs.getstring("mobile")); g.setcreate_date(rs.getdate("create_date")); g.setcreate_user(rs.getstring("create_user")); g.setupdate_date(rs.getdate("update_date")); g.setupdate_user(rs.getstring("update_user")); g.setisdel(rs.getint("isdel")); } return g; }