JSP學習筆記(6)-使用資料庫

来源:http://www.cnblogs.com/pinnsvin/archive/2016/05/28/5538280.html
-Advertisement-
Play Games

1.連接MySQL資料庫 1.1.JDBC JDBC(Java Database Connectivity)提供了訪問資料庫的API,由一些Java類和介面組成,是Java運行平臺核心庫中的一部分。用Java語言編寫的資料庫驅動程式稱為JDBC數據驅動程式。 也就是說使用JDBC可以達到通過JDBC ...


1.連接MySQL資料庫

1.1.JDBC

JDBC(Java Database Connectivity)提供了訪問資料庫的API,由一些Java類和介面組成,是Java運行平臺核心庫中的一部分。用Java語言編寫的資料庫驅動程式稱為JDBC數據驅動程式。

也就是說使用JDBC可以達到通過JDBC實現應用程式操縱資料庫的效果。

使用JDBC進行如下操作:

  • 與一個資料庫建立連接
  • 向已經連接的資料庫發送SQL語句
  • 處理SQL語句返回的結果

1.2.連接

JDBC可以調用本地的JDBC資料庫驅動程式和相應的資料庫建立連接,一般有如下步驟:

(1)載入JDBC資料庫驅動程式

不同資料庫廠商提供了不同的JDBC驅動程式,想要連接操作資料庫時,就必須下載相應的JDBC。比如MySQL的JDBC可以去mysql的官網下載,將下載到的JDBC資料庫驅動程式(mysql-connector-java*.jar)複製到Tomcat所使用的JDK的拓展目錄中(../jre/lib/ext),或者複製到tomcat的安裝目錄/common/lib下。

//應用程式載入MySQL的JDBC資料庫驅動程式代碼
try{
     Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){}

(2)與指定的資料庫建立連接

Java.sql包中的DriverManager類中有兩個用於建立連接的類方法(static方法):

Connection getConnection(java.lang.String,java.lang.String,java.lang.String)
Connection getConnection(java.lang.String)

它們都會拋出SQLException異常。DriverManger類調用上面的方法可以和資料庫建立連接,返回一個connection對象。

假設mysql服務正常啟動,其伺服器ip為192.3.4.5,使用預設埠3306,用戶pinnsvin的密碼是pinnsvin,並且對資料庫test有所有許可權,那麼建立連接代碼如下:

//使用三個參數的方法
try{
  String uri="jdbc:mysql;//192.3.4.5:3306/test";
  String user="pinnsvin";
  String password="pinnsvin";
  con=DriverManager.getConnection(uri,user,pass);
}
catch(SQLException e){
  System.out.println(e);
}
//使用一個參數的方法
try{
 String uri="jdbc:mysql://192.3.4.5:3306/test?user=pinnsvin&password=pinnsvin";
 con=DriverManger.getConnection(uri);
} catch(SQLException e){
  System.out.println(e);
}

1.3.亂碼解決

(1)資料庫和表使用中文支持的字元編碼

關於在DBMS中設置編碼方式可以參考MySQL設置字元編碼一文.

(2)連接資料庫支持中文編碼

try{ Class.forName("com.mysql.jdbc.Driver");

}catch(Exception e){

  System.out.print(“忘記把mysql資料庫的JDBC驅動程式複製到JDK的拓展目錄或tomcat*/common/lib中了");

}

try{
  String uri="jdbc:mysql://127.0.0.1/test?user=pinnsvin&password=pinnsvin&characterEncoding=utf8";
  con=DriverManager.getConnection(uri);
}
catch(SQLException e){
  System.out.print(e);
}

 

2.查詢記錄

和資料庫建立連接後,就可以使用JDBC提供的API與資料庫交互信息,比如查詢、插入、更新、刪除資料庫表中數據以及對標的操縱。

2.1.結果集與查詢

資料庫的查詢結果會返回到一個Resquest對象中,習慣上稱Request對象為結果集對象。

(1)SQL語句對象

使用Statement聲明一個SQL語句對象,然後讓已創建連接的對象con調用方法createStatement() 創建這個SQL語句對象,代碼:

try{
  Statement sql=con.createStatement();
}
catch(SQLException e){
  System.out.print(e);
}

(2)SQL語句對象調用方法查詢數據

SQL語句對象可以調用相應的方法查詢資料庫中的表,並將查詢結果放在一個Resquest結果集中。例如:

Resquest rs=sql.executeQuery(“SELECT name,sex FROM user”);

結果集對象rs有兩列,第一列是name,第二列是sex。

Request結果集一次只能看一個數據行,使用next()方法走到下一行。

Request類常用方法

未標題-1

(3)獲取結果集列的數目

ResultSetMetaData(結果集的元數據對象)

ResultSetMetaData md=rs.getMetaData();
int colcount=md.getColumnCount();

(4)獲取結果集第i列的名字

ResultSetMetaData md=rs.getMetaData();
String colname=md.getColumnName(i);

2.2.隨機查詢

有時候我們需要一個可滾動的結果集,為了獲取一個滾動的結果集,必須先獲得一個Statement對象,然後根據參數type,concurrency的取值情況,返回相應的類型的結果集。

Statement stmt=con.createStatement(int type,int concurrency);
Request re=stmt.executeQuery(SQL語句);

type取值及說明:

ResultSet.TYPE_FORWORD_ONLY 結果集的游標只能向下滾動
ResultSet.TYPE_SCROLL_INSENSITIVE 結果集的游標可以上下滾動,當資料庫變化時,當前結果集不變
ResultSet.TYPE_SCROLL_SENSITIVE 返回可滾動的結果集,當資料庫變化時,當前結果集同步改變

concurrency取值及說明:

ResultSet.CONCUR_READ_ONLY 不能使用結果集更新資料庫中的表
ResultSet.CONCUR_UPDATABLE 能用結果集更新資料庫中的表

滾動查詢常用方法:

public boolean previous() 將游標向上移動,當移動到結果集第1行的前面時返回false
public void beforeFirst() 將游標移動到結果集的初始位置,第一行之前
public void afterLast() 將游標移動到結果集最後一行之後
public void first() 將游標移動到結果集的第一行
public void last() 將游標移動到結果集的最後一行
public boolean isAfterLast() 判斷游標是否在最後一行之後
public boolean isBeforeFirst() 判斷游標是否在第一行之前
public boolean isFirst() 判斷游標是否指向結果集的第一行
public boolean isLast() 判斷游標是否指向結果集的最後一行
public int getRow() 得到當前游標所指行的行號,行號從1開始,如果結果集沒有行,返回0
public boolean absolute(int row) 將游標移動到參數row指定的行號,如果row取負值,就是倒數的行數

3.操縱數據

3.1.添加、更新、刪除記錄

使用SQL語句添加、更新、刪除紀錄。Statement對象調用public int executeUpdate(String sqlStatement)方法通過參數sqlStatement指定的方式實現向資料庫表中添加、更新、刪除紀錄。

    //添加
    executeUpdate("INSERT INTO user VALUES('007','邦德');

    //更新

    executeUpdate("UPDATE user SET name='詹姆斯·邦德'");

    //刪除

    executeUpdate("DELETE FROM user WHERE id='007'");

 

3.2.用結果集操作資料庫中的表

如果熟悉資料庫的DML語句,不必使用這種方式,使用結果集操作資料庫表必須先返回結果集。為了避免中文亂碼,數據的連接方式中需要加入characterEncoding=uft8或gb2312或gbk。例如:

try{
  Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){
  System.out.print("缺失JDBC驅動程式");
}
try{
  String uri="jdbc:mysql://127.0.0.1/test?"+"user=pinnsvin&password=pinnsvin&characterEncoding=utf8";
  //預設埠可以省略,使用+為了使代碼清晰
  con=DriverManager(uri);
  Statement sql=con.createStatement(ResultSet.TYPE_SCRO;;_SECSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=sql.executeQuery("SELECT * FORM user");
}
catch(SQLException e){
  System.out.print(e);
}

3.2.1.更新

使用結果集更新資料庫表中第n行記錄中某列的值:

(1)使結果集rs的游標移動到第n行

          rs.absolute(n);

(2)結果集更新第n行第m列的值,可以使用下麵的方法更新列值

updateInt(String columnName,int x) updateInt(int columnIndex,int x)
updateLong(String columnName,long x) updateLong(int columnIndex,long x)
updateDouble(String columnName,double x) updateDouble(int columnIndex,double x)
updateString(String columnName,String x) updateString(int cloumnIndex,String x)
updateBoolean(String columnName,Boolean x) updateBoolean(int columnIndex,Boolean x)
updateDate(String columnName,Date x) updateDate(int columnIndex,Date x)

(3)結果集調用updateRow方法用結果集中的第n行更新資料庫中第n行記錄

例:更新user表中第4行記錄的name列的值

rs.absolute(4);
rs.updateString(2,"傑森斯坦森");//也可rs.updateString("name","傑森斯坦森");
rs.updateRow();

3.2.2.插入

(1)使用moveToInsertRow()方法將結果集rs的游標移動到插入行

(2)使用updateXxx()方法更新列值

(3)結果集調用insertRow()方法用結果集中的插入行向資料庫表中插入一行新紀錄

4.預處理語句

Java提供了更高效的資料庫操作機制,就是PreparedStatement對象,也就是預處理語句對象。

4.1.為什麼使用預處理語句呢?

當向資料庫發送一個SQL語句,資料庫庫中的SQL解釋器負責將SQL語句生成底層的內部命令,然後執行該命令,完成有關的數據操作。如果不斷的向資料庫發送SQL語句就會增加資料庫中SQL解釋器的負擔,影響執行速度。如果應用程式能針對連接的資料庫,事先將SQL語句解釋為底層的內部命令,然後直接然資料庫執行這個命令,這樣會降低解釋器的壓力,並且提高訪問速度。

4.2.如何使用預處理語句?

使用Connection連接對象調用prepareStatement(String sql)方法對參數sql指定的SQL語句進行預編譯處理,生成該資料庫底層的內部命令,並將該命令封裝在PreparedStatement對象pre中,pre可以調用下麵的方法執行內部命令:

ResultSet executeQuery()

boolean execute()

int executeUpdate()

4.3.使用通配符

在對SQL進行預處理時可以使用通配符“?”來代替欄位的值,必須在語句執行前設置通配符代表的值。

prepareStatement pre=con.prepareStatement("SELECT * FROM user WHERE age<?");
pre.setInt(1,18);//設置第一個通配符的值為18

5.事務

5.1.什麼是事務?

事務(Transaction)是併發控制的單位,是用戶定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。事務是保證資料庫中數據完整性與一致性的重要機制。

5.2.JDBC事務處理步驟

5.2.1.setAutoCommit(boolean autoCommit)方法

使用setAutoCommit(boolean autoCommit)方法關閉自動提交模式。

因為和資料庫建立連接的對象con的提交模式是自動提交模式,即該連接con產生的Statement或PreparedStatement對象對資料庫提交任何一個SQL語句操作會立即生效。為了能進行事務處理必須關閉con的自動提交模式(預設)。

con.setAutoCommit(false);

5.2.2.Commit()方法

con調用commit()方法可以讓事務中的SQL語句全部生效。如果事務中任何一個SQL語句沒有生效,就會拋出SQLException異常。

5.2.3.rollback()方法

在處理SQLException時,con必須調用rollback()方法,它的作用是:撤銷引起數據發生變化的SQL語句操作,將資料庫中的數據恢復到commit()方法執行之前的狀態。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • qpython是一個能讓安卓手機運行和編寫python的APP,到網上下載APK安裝或者在GOOGLE PLAY搜索安裝即可。 安裝之後你可以你手機跑自己的python程式。 qpython有兩個大版本的: qpython對應的是python 2.X qpython3對應的是python 3.X 當 ...
  • Session是一個域 作用範圍:當前會話範圍 生命周期:當程式第一次調用request.getSession()創建出客戶端的session對象,30分鐘沒有操作認為超時,這個可以在web.xml中進行配置 調用session.nvalidate()方法銷毀session 伺服器非正常關閉時銷毀s ...
  • 首先參考 http://jingyan.baidu.com/article/456c463b99f4370a583144a8.html 創建一個項目,照著上面教程到最後一步的時候,系統自動生成entity類,dao類,sessionfactory類和對應的配置文件 在下麵新建一個Test1.java ...
  • 在經過了一段時間的開發後,我對Laravel框架的認識又在逐步的加深,對於這個世界占有量NO.1的框架... 我想說,我已經在逐步的感受到他的恐怖之處... 一.建表--Laravel在資料庫建表上有自己獨立內置的結構,可以完全不用藉助原生SQL語句或者SQLyogEnt、Navicat 這樣的建表 ...
  • 使用Eclipse上傳/下載Git項目 前提: + Eclipse已安裝EGit插件 + 已擁有GitLab/GitHub賬號 SSH方式 配置SSH授權 1. 本地生成授權Key Eclipse,選擇菜單: 2. 遠程托管配置本地授權的Public Key 進入GitLab管理首頁, 在 中輸入剛 ...
  • 表達式是PHP中一個重要的概念,可以把表達式理解為“任何有值的東西”。在本教程中涉及到表達式的語法,我們以“expr”來表示表達式。 下麵就是一個表達式: 在上面的例子中,當$x的值大於$y時,該表達式值為TRUE,否則為FALSE。 我們經常通過判斷一個表達式的值(包括具體數值和布爾值)來確定我們 ...
  • 先看列表是如何創建的: 同樣有兩種創建方式,但一般用第一種。 列表和元祖最大的不同就是列表是可以修改的。 老規矩,使用 help(list) ,真的是 help() 大法好呀。 好,來人,上代碼。 Help on class list in module __builtin__: class lis ...
  • 本文內容全部出自《Python基礎教程》第二版,在此分享自己的學習之路。 lxx___歡迎轉載:http://www.cnblogs.com/Marlowes/p/5537223.htmllxx___ Created on Marlowes 使用簡單的純文本文件只能實現有限的功能。沒錯,使用它們可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...