標籤:java web
JDBC API :
是一系列的編程介面,可以用來串連資料庫,訪問資料等。
DriverManager : 驅動程式管理類,用來裝載驅動程式,為建立資料庫連接提供支援。
Connection:用於串連某一指定的資料庫
Statement : 提供了執行sql語句,擷取查詢結果的方法。有兩個子介面。分別是:
ResultSet : 提供了對結果集處理的方法
JDBC Driver API
是面向驅動程式開發商的介面,JDBC驅動程式主要有四種類型:
寫一個JDBC的應用程式:
首先,在mysql中建立表:
/*建立使用者表*/create table tbl_user(id int(11) unsigned not null auto_increment,name varchar(50) not null default ‘‘,password varchar(50) not null default ‘‘,email varchar(50) default ‘‘,primary key (id))engine = InnoDB /*mysql儲存引擎的一種,支援事務*/default charset = utf8;/*建立地址表*/create table tbl_address(id int(11) unsigned not null auto_increment,city varchar(20) default null,country varchar(20) default null,user_id int(11) unsigned not null, /*使用者表的主鍵*/primary key(id))engine = InnoDBdefault charset = utf8;
在資料庫中顯示如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/2C/wKiom1V1X2rQyupBAAA7DZ4IoFo049.jpg" title="QQ20150608172330.jpg" alt="wKiom1V1X2rQyupBAAA7DZ4IoFo049.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/2D/wKiom1V1X-XwqV3eAADX1QSglL0293.jpg" style="float:none;" title="QQ20150608172543.jpg" alt="wKiom1V1X-XwqV3eAADX1QSglL0293.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/28/wKioL1V1YYnRN9LlAADN0HsV_xw343.jpg" style="float:none;" title="QQ20150608172644.jpg" alt="wKioL1V1YYnRN9LlAADN0HsV_xw343.jpg" />
/*向表中插入資料*/insert into tbl_user(id, name, password, email) values(1,‘xiaoming‘, ‘123456‘, ‘[email protected]‘),(2, ‘daming‘, ‘654321‘,‘[email protected]‘);insert into tbl_address(city, country, user_id) values(‘beijing‘, ‘china‘, 1),(‘NewYork‘, ‘USA‘, 2);
JDBC 編程的步驟:
添加java代碼測試:將user表中的資料輸出
package com.jike.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JDBCTest {public static void main(String[] args) {String sql = "SELECT * FROM tbl_user";Connection conn = null; // 當前的資料連線Statement st = null; // 向資料庫發送sql語句ResultSet rs = null; // 封裝從資料庫裡查詢到的資料// 用ctrl+shift+o自動匯入以上用到的三個介面try {Class.forName("com.mysql.jdbc.Driver"); // 註冊MySQL的jdbc驅動程式 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "******", "*******");// 擷取資料庫連接,後面兩個分別是資料庫使用者名稱和密碼st = conn.createStatement();rs = st.executeQuery(sql); // 發送sql語句while(rs.next()){System.out.print(rs.getInt("id")+" ");System.out.print(rs.getString("name")+" ");System.out.print(rs.getString("password")+" ");System.out.print(rs.getString("email")+" ");System.out.println();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{ // 關閉順序由小到大try{rs.close();}catch(Exception e2){}try {st.close();} catch (Exception e3) {// TODO: handle exception}try {conn.close();} catch (Exception e4) {// TODO: handle exception}}}}
JDBC資料庫的插入,更新,刪除
package com.jike.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JDBCTest {// 擷取資料庫連接public static Connection getConnection(){Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "root", "mysqladmin");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return conn;}// 向資料庫表中插入資料public static void insert(){Connection conn = getConnection();try {String sql = "insert into tbl_user(name, password, email)"+"values(‘deci‘, ‘2255225‘, ‘[email protected]‘)";Statement st = conn.createStatement();int count = st.executeUpdate(sql);System.out.println("向資料庫中插入了" + count + "條記錄");conn.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}// 更新內容public static void update(){Connection conn = getConnection();try {String sql = "update tbl_user set email=‘[email protected]‘ where name = ‘deci‘";Statement st = conn.createStatement();int count = st.executeUpdate(sql);System.out.println("向資料庫中更新了" + count + "條記錄");conn.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}//刪除記錄public static void delete(){Connection conn = getConnection();try {String sql = "delete from tbl_user where name = ‘deci‘";Statement st = conn.createStatement();int count = st.executeUpdate(sql);System.out.println("向資料庫刪除了" + count + "條記錄");conn.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public static void main(String[] args) {//insert();//update();delete();}}
依次調用定義的方法,得到結果:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/71/wKiom1V8Ya3Ty8hqAAIrJraJzDA435.jpg" title="QQ20150614005947.jpg" alt="wKiom1V8Ya3Ty8hqAAIrJraJzDA435.jpg" />
JDBC 編程 ----交易處理:
事務:維護資料一致性的工作單位,要麼全部執行,要麼全部不執行。
事務的基本特徵:
與事務相關的sql語句
開始事務: begin transaction
提交事務: commit transaction
復原事務:rollback transaction
舉例:在使用者表和地址表中分別插入資料:
使用者表 插入:
"insert into tbl_user(id, name, password, email)"+ "values(10, ‘Tom‘, ‘2525252‘, ‘[email protected]‘)"
地址表插入:
"insert into tbl_address(id, city, country, user_id)"+"values(1, ‘shanghai‘, ‘china‘, ‘10‘)";
可以看出,原有的資料庫中地址表中已經有主鍵id=1的資料,程式會報出主鍵衝突的錯誤,具體代碼如下:
package com.jike.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class TransactionTest {public static Connection getConnection(){Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info", "root","mysqladmin");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return conn;}// 向使用者表中插入資料public static void insertUserData(){Connection conn = getConnection();try {String sql = "insert into tbl_user(id, name, password, email)"+"values(10, ‘Tom‘, ‘2525252‘, ‘[email protected]‘)";Statement st = conn.createStatement();int count = st.executeUpdate(sql);System.out.println("向使用者表中插入了"+count+"條資料");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}// 向地址表中插入資料public static void insertAddressData(){Connection conn = getConnection();try {String sql = "insert into tbl_address(id, city, country, user_id)"+"values(1, ‘shanghai‘, ‘china‘, ‘10‘)";//這裡注意, 因為這條語句規定插入地址表中的資料id號為1,但是地址表中已經有id=1的資料,因此會拋出異常// 這是一個很嚴重的問題,因為資料只有部分被插入。需要採用事務保證資料要麼完全插入,要麼全部復原。Statement st = conn.createStatement();int count = st.executeUpdate(sql);System.out.println("向地址表中輸入了"+count+"條記錄");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public static void main(String[] args) {insertUserData();insertAddressData();}}
程式報出異常
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/6D/wKioL1V8bWPz3blyAAPCUg8UNTg851.jpg" title="QQ20150614014247.jpg" alt="wKioL1V8bWPz3blyAAPCUg8UNTg851.jpg" />
這是,資料表中的插入結果如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/6D/wKioL1V8baPR-rVSAAEyfIe30qs590.jpg" title="QQ20150614014404.jpg" alt="wKioL1V8baPR-rVSAAEyfIe30qs590.jpg" />
可見,地址表中的資訊沒有正確插入,而使用者表中的資訊插入成功,這種插入是非常危險的,其無法保持資料的完整性。因此使用事務來處理這類問題。
極客學院地址:http://www.jikexueyuan.com/course/625.html
JSP (3)------JDBC編程1