生活随笔
收集整理的這篇文章主要介紹了
JDBC操作步骤及数据库连接操作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
一、JDBC操作步驟
1.加載數(shù)據(jù)庫驅(qū)動程序:各個數(shù)據(jù)庫都會提供JDBC的驅(qū)動程序開發(fā)包,直接把JDBC操作所需要的開發(fā)包(一般為*.jar或*.zip)直接配置到classpath路徑即可。
2.連接數(shù)據(jù)庫:根據(jù)各個數(shù)據(jù)庫的不同連接的地址也不同,此連接地址將由數(shù)據(jù)庫廠商提供,一般在使用JDBC連接數(shù)據(jù)庫的時候都要求用戶輸入數(shù)據(jù)庫連接的用戶名和密碼,用戶在取得連接之后才可以對數(shù)據(jù)庫進行查詢或更新的操作。
3.使用語句進行數(shù)據(jù)庫操作:數(shù)據(jù)庫操作分為更新和查詢兩種操作,除了可以使用標準的SQL語句之外,對于各個數(shù)據(jù)庫也可以使用其自己提供的各種命令。
4.關閉數(shù)據(jù)庫連接:數(shù)據(jù)庫操作完畢之后需要關閉連接以釋放資源。
?
二、配置數(shù)據(jù)庫的驅(qū)動程序
1.下載驅(qū)動:http://www.mysql.com/downloads/connector/j/
2.配置環(huán)境變量:在classpath中添加驅(qū)動路徑(例如我的路徑是D:\mysql-connector-java-5.1.21-bin.jar;);
?
三、加載驅(qū)動
?
[java]?view plain?copy
public?class?connector?{??????public?static?final?String?DBDRIVER?=?"org.gjt.mm.mysql.Driver";???//定義MySQL數(shù)據(jù)庫驅(qū)動程序??????public?static?void?main(String[]?args)?{??????????try?{??????????????Class.forName(DBDRIVER);?//加載驅(qū)動程序??????????}?catch?(ClassNotFoundException?e)?{??????????????e.printStackTrace();??????????}??????}??}??
四、連接及關閉數(shù)據(jù)庫
?
1.使用DriverManager類進行連接操作,DriverManager類的常用方法:
? ? ? ?(1)通過連接地址連接數(shù)據(jù)庫
? ? ? ? ? ? ? ? public static Connection getConnection(String url) throws SQLException
? ? ? ?(2)通過連接地址連接數(shù)據(jù)庫同時輸入用戶名和密碼
? ? ? ? ? ? ? ? public static Connection getConnection(String url, String user, String password) throws SQLException
2.DriverManager說明:
(1)在DriverManager中,提供的主要操作是得到一個數(shù)據(jù)庫的連接,getConnection()方法就是取得連接對象,此方法返回的類型是Connection對象,不管使用那種方式連接,都必須提供一個數(shù)據(jù)庫的連接地址,如果在連接數(shù)據(jù)庫的時候需要用戶名和密碼,則還需要將用戶名和密碼設置上。MySQL數(shù)據(jù)庫的連接地址格式如下:jdbc:mysql://IP地址:端口號/數(shù)據(jù)庫名稱
(2)數(shù)據(jù)庫連接地址的形式由三部分組成:
? ? ? ?a.jdbc協(xié)議:JDBC URL中的協(xié)議總是jdbc;
? ? ? ?b.子協(xié)議:驅(qū)動程序名和數(shù)據(jù)庫連接機制(這種機制可由一個或多個驅(qū)動程序支持)的名稱,例如:mysql;
? ? ? ?c.子名稱:一種標識數(shù)據(jù)庫的方法。必須遵循"/主機名:端口/子協(xié)議"的標準URL命名約定,例如://localhost:3306/Joywy.
3.Connection
通過DriverManager取得Connection對象之后,實際上就表示數(shù)據(jù)庫連接上了,連接上數(shù)據(jù)庫之后就可以進行數(shù)據(jù)庫的更新及查詢操作,但是操作的最后數(shù)據(jù)庫的連接必須關閉。
連接數(shù)據(jù)庫代碼如下:
?
[java]?view plain?copy
import?java.sql.Connection;??import?java.sql.DriverManager;??import?java.sql.SQLException;????public?class?ConnectionDemo{??????//定義MySQL驅(qū)動程序??????public?static?final?String?DBDRIVER?=?"org.gjt.mm.mysql.Driver";??????//定義MySQL數(shù)據(jù)庫的連接地址??????public?static?final?String?DBURL?=?"jdbc:mysql://localhost:3306/xiaowei";??????//MySQL數(shù)據(jù)庫的連接用戶名??????public?static?final?String?DBUSER?=?"root";??????//MySQL數(shù)據(jù)庫的連接密碼??????public?static?final?String?DBPASS?=?"android";??????public?static?void?main(String[]?args){??????????//數(shù)據(jù)庫連接??????????Connection?con?=?null;??????????try{??????????????//加載驅(qū)動??????????????Class.forName(DBDRIVER);??????????}catch(ClassNotFoundException?e){??????????????e.printStackTrace();??????????}??????????try{??????????????con?=?DriverManager.getConnection(DBURL,?DBUSER,?DBPASS);??????????}catch(SQLException?e){??????????????e.printStackTrace();??????????}??????????System.out.println(con);??????????try{??????????????//數(shù)據(jù)庫關閉??????????????con.close();??????????}catch(SQLException?e){??????????????e.printStackTrace();??????????}??????}??}??
五、數(shù)據(jù)庫操作
?
1.Statement接口
此接口通過使用Connection接口中的createStatement()方法實例化,此接口定義了一下方法:
?
| No. | 方法 | 類型 | 描述 |
| 1 | Int?executeUpdate(String?sql)throws?SQLException | 普通 | 執(zhí)行數(shù)據(jù)庫更新的SQL語句,例如:INSERT、UPDATE、DELETE等語句,返回更新的記錄數(shù) |
| 2 | ResultSet?executeQuery(String?sql)throws?SQLException | 普通 | 執(zhí)行數(shù)據(jù)庫查詢操作,返回一個結(jié)果集對象 |
| 3 | void?addBatch(String?sql)throws?SQLException | 普通 | 增加一個待執(zhí)行的SQL語句 |
| 4 | int[]?executeBatch()throws?SQLException | 普通 | 批量執(zhí)行SQL語句 |
| 5 | void?close()throws?SQLException | 普通 | 關閉Statement操作 |
| 6 | Boolean?execute(String?sql)throws?SQLException | 普通 | 執(zhí)行SQL語句 |
2.ResultSet接口
?
使用SQL中的SELECT語句可以將數(shù)據(jù)庫的全部結(jié)果查詢出來,在JDBC的操作中數(shù)據(jù)庫的所有查詢記錄將使用ResultSet進行接收,并使用ResultSet顯示內(nèi)容。
3.PreparedStatement接口
PreparedStatement接口是Statement的子接口,屬于預處理操作,與直接使用Statement不同的是,PreparedStatement在操作時,是先在數(shù)據(jù)表之中準備好一條SQL語句,但是此SQL語句的具體內(nèi)容暫時不設置,而是之后再進行設置,以插入數(shù)據(jù)為例,使用PreparedStatement插入數(shù)據(jù)時,數(shù)據(jù)表中的指針首先指向最后一條數(shù)據(jù)之后,但是里面的內(nèi)容是不知道的,而是等待用戶分別設置的。
注意:設置日期格式的問題,在PreparedStatement中定義了setData(),此方法可以設置日期內(nèi)容,但是此方法使用時,后面的Data類型變量是java.sql.Data,而不是java.util.Data,所以如果要想將一個java.util.Data類型的內(nèi)容變?yōu)閖ava.sql.Date類型的內(nèi)容應該使用如下的語句形式:
?
[java]?view plain?copy
??????????????String?birthday?=?"2007-08-27"????????//生日??java.util.Date?temp?=?null;?????????//聲明一個Date對象??//通過SimpleDataFormat類將一個字符串變?yōu)閖ava.util.Date類型??temp?=?new?SimpleDataFormat("yyyy-MM-dd").parse(birthday);??//通過java.util.Data取出具體的日期數(shù),并將其變?yōu)閖ava.sql.Data類型??java.sql.Data?bir?=?new?java.sql.Data(temp.getTime());??
?
?
代碼如下:
DBHelper.java
?
[java]?view plain?copy
import?java.sql.Connection;??import?java.sql.DriverManager;??import?java.sql.PreparedStatement;??import?java.sql.ResultSet;??import?java.sql.SQLException;??import?java.util.ArrayList;??import?java.util.List;??????public?class?DBHelper?{??????public?static?final?String?DBDRIVER?=?"com.mysql.jdbc.Driver";??????public?static?final?String?DBURL?=?"jdbc:mysql://localhost:3306/test";??????public?static?final?String?DBUSER?=?"root";??????public?static?final?String?DBPASS?=?"1111";????????????public?static?Connection?getConnection(){??????????Connection?conn?=?null;??????????try?{??????????????Class.forName(DBDRIVER);??????????????conn?=?DriverManager.getConnection(DBURL,?DBUSER,?DBPASS);??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}??????????return?conn;??????}?????????????public?static?void?save(){??????????Connection?con?=?getConnection();??????????String?sql?=?"insert?into?Info?values(?,??,??)";??????????PreparedStatement?psmt?=?null;??????????try?{??????????????psmt?=?con.prepareStatement(sql);??????????????psmt.setString(1,?"123");??????????????psmt.setString(2,?"12");??????????????psmt.setInt(3,?3);??????????????int?count?=?psmt.executeUpdate();??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}finally{??????????????if(psmt?!=?null){??????????????????try?{??????????????????????psmt.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????????if(con?!=?null){??????????????????try?{??????????????????????con.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????}??????}????????????public?static?void?delete(){??????????Connection?con?=?getConnection();??????????String?sql?=?"delete?from?Info?where?id=?";??????????PreparedStatement?psmt?=?null;??????????try?{??????????????psmt?=?con.prepareStatement(sql);??????????????psmt.setString(1,?"10330070");??????????????int?count?=?psmt.executeUpdate();??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}finally{??????????????if(psmt?!=?null){??????????????????try?{??????????????????????psmt.close();??????????????????}?catch?(SQLException?e)?{??????????????????????//?TODO?Auto-generated?catch?block??????????????????????e.printStackTrace();??????????????????}??????????????}??????????????if(con?!=?null){??????????????????try?{??????????????????????con.close();??????????????????}?catch?(SQLException?e)?{??????????????????????//?TODO?Auto-generated?catch?block??????????????????????e.printStackTrace();??????????????????}??????????????}??????????}??????}????????????public?static?void?update(){??????????Connection?con?=?getConnection();??????????String?sql?=?"update?Info?set?age?=???where?id?=??";??????????PreparedStatement?psmt?=?null;??????????try?{??????????????psmt?=?con.prepareStatement(sql);??????????????psmt.setInt(1,?22);??????????????psmt.setString(2,?"111313");??????????????int?count?=?psmt.executeUpdate();??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}finally{??????????????if(psmt?!=?null){??????????????????try?{??????????????????????psmt.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????????if(con?!=?null){??????????????????try?{??????????????????????con.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????}??????}????????????public?static?List<Info>?query(){??????????List<Info>?list?=?new?ArrayList<Info>();??????????Connection?con?=?getConnection();??????????String?sql?=?"select?*?from?Info";??????????PreparedStatement?psmt?=?null;??????????ResultSet?rs?=?null;????????????????????try?{??????????????psmt?=?con.prepareStatement(sql);??????????????rs?=?psmt.executeQuery();????????????????????????????while(rs.next()){????//依次取出數(shù)據(jù)??????????????????Info?info?=?new?Info();??????????????????info.setId(rs.getString("id"));??????????????????info.setPass(rs.getString("pass"));??????????????????info.setAge(rs.getInt("age"));??????????????????System.out.println(info.getId()?+"\t"?+?info.getPass()?+?"\t"?+?info.getAge());??????????????????list.add(info);??????????????}??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}finally{??????????????if(rs?!=?null){??????????????????try?{??????????????????????rs.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????????if(psmt?!=?null){??????????????????try?{??????????????????????psmt.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????????if(con?!=?null){??????????????????try?{??????????????????????con.close();??????????????????}?catch?(SQLException?e)?{??????????????????????e.printStackTrace();??????????????????}??????????????}??????????}??????????return?list;??????}????????????public?static?void?main(String[]?args){??????????System.out.println(query().get(0).getAge());????????????????}??}??
Info.java
?
?
[java]?view plain?copy
public?class?Info?{??????private?String?id;??????private?String?pass;??????private?int?age;??????public?String?getId()?{??????????return?id;??????}??????public?void?setId(String?id)?{??????????this.id?=?id;??????}??????public?String?getPass()?{??????????return?pass;??????}??????public?void?setPass(String?pass)?{??????????this.pass?=?pass;??????}??????public?int?getAge()?{??????????return?age;??????}??????public?void?setAge(int?age)?{??????????this.age?=?age;??????}??}??注:
?
(1)一般來說,我會習慣使用PreparedStatement對數(shù)據(jù)庫進行操作。PreparedStatement是預編譯方式的,在執(zhí)行SQL語句的時候效率就要高一些,還有就是PreparedStatement可以更好地避免SQL注入問題;在拼接sql語句時,采用PreparedStatement可以有效地減少出錯的幾率;PreparedStatement是Statement的一個子類,理所當然地PreparedStatement對Statement有一定的擴展,在性能方面有一定的提高。
(2)在開發(fā)中是不能直接使用"SELECT * FROM user",因為這樣在查詢的時候并不能明確的表示要取的內(nèi)容是什么,所以開發(fā)中查詢時肯定要明確地寫出需要查找的列。
轉(zhuǎn)載于:https://my.oschina.net/u/3787897/blog/1628403
總結(jié)
以上是生活随笔為你收集整理的JDBC操作步骤及数据库连接操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。