目錄
1、數據庫管理系統
數據庫是提供數據的基地,它能保存數據並能使用戶方便的訪問數據。
- DBMS是(Data Base Management System)的縮寫,是管理數據庫軟件的集合。
- DBMS包含面向用戶接口功能和麪向系統維護功能。
- 面向用戶接口功能是提供用戶訪問數據庫的一些必要手段。
- 面向系統維護功能是爲數據庫管理者提供數據庫的維護工具。
目前常見的數據庫管理系統有:
- Oracle
- Sybase
- Informix
- Microsoft SQL Server
- MySQL
2、MySQL
MySQL數據庫管理系統,簡稱MySQL,是世界上最流行的開源數據庫管理系統。
目前許多Web開發項目都選用MySQL,其主要原因是MySQL的社區版是開源數據庫管理系統、可以降低軟件的開發和使用成本。
MySQL提供的監視器(MySQL monitor),允許用戶使用命令行方式管理數據庫。
需要再打開一個MS-DOS命令行窗口,並使用MS-DOS命令進入到bin目錄中,然後使用默認的root用戶啓動MySQL監視器。命令如下:
mysql –u root
可以使用navicat快速操作,詳情見 點擊閱讀
3、JDBC
JDBC(Java DataBase Connectivity)提供了訪問數據庫的API,即由一
些Java類和接口組成,是Java運行平臺的核心類庫中的一部分。
我們經常使用JDBC進行如下的操作:
- 與一個數據庫建立連接。
- 向已連接的數據庫發送SQL語句。
- 處理SQL語句返回的結果。
JDBC-API中重要的接口和類(java.sql包中):
使用JDBC-數據庫驅動程序方式和數據庫建立連接需要經過2個步驟:
- 加載JDBC-數據庫驅動程序
- 指定的數據庫建立連接
借用菜鳥教程中的介紹:
jar 包:
MySQL 5 版本:mysql-connector-java-5.1.39-bin.jar
MySQL 8 版本:mysql-connector-java-8.0.19.jar
下載後把 mysql-connector-java-<對應版本>-bin.jar 拷貝到 tomcat 下 lib 目錄。
MySQL 8.0 以上版本的數據庫連接有所不同:
com.mysql.jdbc.Driver
更換爲 com.mysql.cj.jdbc.Driver
需要注意:MySQL 8 + JDBC 8 + JDK 8 或者 MySQL 5 + JDBC 5 + JDK 7
String driverClass = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC";
String urn = "root";
String psw = "123456";
Class.forName(driverClass);//加載驅動
Connection con = DriverManager.getConnection(url,urn,psw);//得到連接
4、數據庫操作
4.1 查詢
1.結果集與查詢:
讓連接對象con調用方法createStatement()創建執行SQL語句的Statement對象:
Statement sql=con.createStatement();
sql對象就可以調用相應的方法,實現對數據庫中表的查詢和修改,並將查詢結果存放在一個ResultSet類聲明的對象中:
ResultSet rs=sql.executeQuery("SELECT * FROM product");
//product爲表名
2.結果集的列名與列的數目
程序查詢的時候,希望知道數據庫表的字段(列)的名字以及表的字段的個數,那麼一個辦法是使用返回到程序中的結果集來獲取相關的信息。
- (1) 得到元數據對象metaData
ResultSetMetaData metaData = rs.getMetaData();
- (2)得到結果集的列的個數,即共有幾列
int columnCount = metaData.getColumnCount();
- (3)結果集rs中的第i列的名字:
String columnName = metaData.getColumnName(i);
3.隨機查詢
使用Result的next()方法順序地查詢數據,爲了得到一個可滾動的結果集,必須使用下述方法先獲得一個Statement對象:
Statement stmt=con.createStatement(int type ,int concurrency);
然後,根據參數的type、concurrency的取值情況,stmt返回相應類型的結果集:
ResultSet re=stmt.executeQuery(SQL語句);
type的取值決定滾動方式,取值可以是:
- ResultSet.TYPE_FORWORD_ONLY :
結果集的遊標只能向下滾動。 - ResultSet.TYPE_SCROLL_INSENSITIVE :
結果集的遊標可以上下移動,當數據庫變化時,當前結果集不變。 - ResultSet.TYPE_SCROLL_SENSITIVE :
返回可滾動的結果集,當數據庫變化時,當前結果集同步改變。
concurrency取值決定是否可以用結果集更新數據庫
- ResultSet.CONCUR_READ_ONLY:
不能用結果集更新數據庫中的表。 - ResultSet.CONCUR_UPDATETABLE:
能用結果集更新數據庫中的表。
4.條件查詢
select… from 表 where 字段 滿足的條件
select * from product where price > 2000 and price<5000
select * from product where name = 'java'
模糊查詢,使用“%”表示零個或多個字符,用“_”表示任意一個字符:
select * from product where name like '李%'
5.排序查詢
可以在SQL語句中使用ORDER BY子語句,對記錄排序。
例如,按總成績排序查詢的SQL語句:
SELECT * FROM student ORDER BY 總分
4.2更新、添加、刪除記錄
Statement對象調用方法:
public int executeUpdate(String sqlStatement);
實現對數據庫表中記錄的字段值的更新、添加和刪除記錄。
//更新
executeUpdate("UPDATE product SET price = 6866 WHERE name='海爾電視機'");
//添加
executeUpdate("INSERT INTO students VALUES ('012','神通手機’,'2015-2-26',2687)");
//刪除
executeUpdate("DELETE FROM product WHERE number = '888' ");
5、 用結果集操作數據庫中的表
使用結果集更新數據庫表中第n行記錄中某列的值的步驟是:
- 1.結果集rs的遊標移動到第n行
rs.absolute(n); - 2.結果集將第n行的某列的列值更新
例如 更新列名是columnName的日期值是x指定的值:
updateDate(String columnName, Date x); - 3.更新數據庫中的表
最後,結果集調用updateRow()方法用結果集中的第n行更新數據庫表中的第n行記錄。
以下代碼片段更新product表中的第3行記錄的name列(字段)的值。
rs.absolute(3);
rs.updateString("name", "IBM PC");
rs.updateRow();
使用結果集向數據庫表中插入(添加)一行記錄步驟是:
-
1.結果集rs的遊標移動到插入行(用於構建要插入的行的暫存區域)
rs.moveToInsertRow(); -
2.更新插入行的列值
例如:
rs.updateString(1, “c002”);
rs.updateString(2, “IBM iPad”);
rs.updateDate(3,Date());
rs.updateDouble(4, 5356); -
3.插入記錄
最後,結果集調用insertRow()方法用結果集中的插入行向數據庫表中插入一行新記錄。
6、預處理語句
對於JDBC,如果使用Connection和某個數據庫建立了連接對象con,那麼 con就可以調用
prepareStatement(String sql)
那麼pre 對象可以隨時調用下列方法都可以使得該底層內部命令被數據庫執行,提高了數據庫的訪問速度:
boolean execute()
int executeUpdate()
ResultSet executeQuery()
在對SQL進行預處理時可以使用通配符“?”來代替字段的值
prepareStatement pre=
con.prepareStatement("SELECT * FROM product WHERE price < ? ");
調用相應的方法設置通配符“?”,代表具體的值
pre.setDouble(1,6565);
指定上述預處理語句pre中第1個通配符“?”代表的值是 6565
預處理語句設置通配符“?”的值的常用方法有:
void setDate(int parameterIndex,Date x)
void setDouble(int parameterIndex,double x)
void setFloat(int parameterIndex,float x)
7、事務
事務是保證數據庫中數據完整性與一致性的重要機制。事務處理步驟如下:
- 1.連接對象使用setAutoCommit(boolean autoCommit)方法,
將參數autoCommit取值爲false來關閉自動提交模式:
con.setAutoCommit(false); - 2.commit()方法
con調用commit()方法就是讓事務中的SQL語句全部生效。 - 3.rollback()方法
只要事務中任何一個SQL語句沒有生效,就拋出SQLException異常。在處
理SQLException異常時,必須讓con調用rollback()方法。
8、小結
- JSP使用JDBC提供的API和數據庫進行交互信息。使用JDBC的應用程序一旦和數據庫建立連接,就可以使用JDBC提供的API操作數據庫。
- 當查詢ResultSet對象中的數據時,不可以關閉和數據庫的連接。
- 使用PreparedStatement對象可以提高操作數據庫的效率
9、登錄檢測實例
//接收用戶名和密碼
String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
String password = request.getParameter("password");
String driverClass = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC";
String urn = "root";
String psw = "123456";
Class.forName(driverClass);//加載驅動
Connection conn = DriverManager.getConnection(url,urn,psw);//得到連接
if(conn != null){
String sql = "select * from user_info where username='"+username+"' and password='"+ password + "'"; //驗證賬號密碼
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next())
response.sendRedirect("home.html");//登錄成功,轉到主頁
else
response.sendRedirect("fail.jsp");//登錄失敗,重新登錄
}
conn.close();