本菜鳥才介入Java,我現在不急着去看那些基本的語法或者一些Java里面的版本的特征或者是一些晉級的知識,因為有一點.Net的OOP編程思想,所以對於Java的這些語法以及什么的在用到的時候在去發現學習一下。我現在很迫不及待用JAVA想來實現以下對數據庫的增刪改查。想實現就來看Java是怎么操作數據庫的,回想下.Net里你可能會配置web.Config,或者你去寫一些DBhelper類然后調用里面的自己定義的一些增刪改查的方法,更或者你去配一些數據控件等等往往發現操作基本都是一體化的簡單。現在面對Java呢?
JDBC技術
百度簡介 : JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基准,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。 JDBC並不能直接訪問數據庫,需要借助於數據庫廠商提供的JDBC驅動程序。
JDBC中常用的類和接口可用於我們編程開發,利用這些類和接口可以方便的經行數據訪問和處理。這些類和接口都位於java.sal包中。具體的下面一一揭曉~~
廢話一堆后,其實這些廢話都可以去百度找到的有木有發現百度很強大,很犀利,很友好,很無敵啊~~~~扯遠了。。。。下面開始JDBC的旅途.
數據庫連接
如果要在Java訪問數據庫,首先要加載一個數據庫驅動,數據庫驅動只需要在第一次訪問時加載一次。然后再每次訪問數據庫時創建一個Connection實例,獲取數據庫連接,這樣就可以執行操作數據庫的SQL語句。最后用完后釋放掉數據庫的連接。
數據庫驅動類
不同的數據庫實現JDBC接口不同,所以就產生了不同的數據庫驅動包。驅動包就包含一些負責數據庫連接的類,把我們要操作的SQL語句傳遞到里面去。因為我上班的PC用的是SQL2012,所以我們要去這里http://www.microsoft.com/zh-cn/search/DownloadResults.aspx?q=jdbc下載下面的驅動:
可能會有人說為什么下這個呢怎么不是下面的3.0或者2.0的驅動呢!因為我的SQL版本是2012的所以下載這個,如果你是2008或者2005的話你就可以下載下面的3.0驅動包!說這么多在不明白就點進去看下:
看明白就去下載適合自己SQL版本的驅動吧!
加載數據庫驅動類
Java加載數據庫驅動的方法是調用Class類的靜態方法forName().寫法如下:
Class.forName(String driveManager);
forName()方法的參數用於指定要加載的數據庫驅動。加載成功,將會加載驅動類注冊給DriveManager.失敗的話拋出ClassNotFoundExecption異常。
在扯一點沒必要的閑話:為了把程序的出錯性盡量的排斥掉,我可不希望我第一次用Java的JDBC就出一堆的錯誤,然后對在學者去用工具然后跳錯。因為操作的是我PC本地的SQL12數據庫,我准備一切都用默認(端口)的東西試試先。所以我們要開始就啟動我們SQL網絡配置協議TCP/IP設置為啟動,當然已經啟動的話就沒必要在此去啟動啦!
連接SQL2012數據庫
把我們剛才下的驅動加載到 MyEclipse中來,如下:
好萌的東西,像個牛奶瓶o(^▽^)o。
下面開始我們SQL2012的數據連接操作:
package myJava.jdbc; import java.sql.*; public class SelectQuery { Connection conn; //創建一個返回值為Connection的方法 public Connection getConnection(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); System.out.println("數據庫驅動加載成功"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); if(conn!=null){ System.out.println("數據庫連接成功"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回Connection對象 return conn; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SelectQuery getcon = new SelectQuery(); getcon.getConnection(); } }
運行結果如下:
看到這個應該算是一路順風吧!沒出什么異常,然后我們趁熱打鐵連接成功啦查詢一下有何不可,我搞一個很簡單的查詢具體代碼如下:
package myJava.jdbc; import java.sql.*; public class SelectQuery { Connection conn; //創建一個返回值為Connection的方法 public Connection getConnection(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); System.out.println("數據庫驅動加載成功"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); if(conn!=null){ System.out.println("數據庫連接成功"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回Connection對象 return conn; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SelectQuery getcon = new SelectQuery(); getcon.getConnection(); //查詢 String sql = "SELECT * FROM [dbo].[User]"; try { PreparedStatement Ps = getcon.conn.prepareStatement(sql); ResultSet Rs = Ps.executeQuery(); while(Rs.next()){ String name = Rs.getString("Name"); String password = Rs.getString("Password"); System.out.println(name); System.out.println(password); } Rs.close(); Ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
運行結果如下:
結果出來啦o(^▽^)o不是重點,重點是這個查詢里面我們都用到了JDBC技術中的那些類和接口,或許你看了上面的代碼還是茫然我說的是和我一樣入門的人,那么下面的解釋后,你就懂得啦!
首先是我們在getConnection中用到的 DriverManager類
DriverManager類是用來管理數據庫中所有的驅動程序,是JDBC的管理層,作用用戶和驅動程序之間,並在數據庫的驅動之間建立連接。DriverManager類中的方法都是靜態方法,所以用的時候不需要實例化,直接調用類名就可以。
DriverManager類的常用方法如下:
方法 | 功能 |
getConnection(String url,String user,String password) | 指定3個參數,連接數據庫的url,數據庫用戶名,數據庫密碼 |
setLoginTimeout() | 獲取驅動程序試圖登錄到某一個數據庫時可以等待的最長時間 |
printIn(String Message) | 將一條消息打印到當前JDBC日志流中 |
其次我們看到就是Connection接口
Connection接口代表與特定的數據庫的連接。要對數據表中的數據經行操作,首先要獲取數據庫連接。
Connection接口常用的方法如下:
方法 | 功能 |
createStatement() | 創建Statement對象 |
createStatement(int resultSetType,int resultSetConcurrency) | 創建一個Statement對象,該對象將生產具有給定類型,並發性和可保存性的ResultSet對象 |
prepareStatement() | 創建預處理對象PreparedStatement |
isReadOnly() | 查看當前的Connection對象的讀取模式是否為之讀形式 |
setReadOnly() | 設置當前Connection對象的讀寫模式i,默認是非只讀模式 |
commit() | 使所有上一次提交,回滾后進行的更改成為持久更改 |
roolback() | 取消再當前事物中經行的所有更改,並釋放此Connection對象當前持有的所有數據庫鎖 |
close() | 立即釋放Connection對象數據庫和JDBC資源 |
PreparedStatement接口
PreparedStatement接口繼承Statemetn接口,用於執行動態的SQL語句,通過PreparedStatement實例執行SQL語句,將被預編譯並保存到PreparedStatement實例中,從而可以反復的執行SQL語句。可以通過Connection類的prepareStatement()方法獲取PreparedStatement對象。PreparedStatement接口常用的方法:
方法 | 功能描述 |
execute() | 在此PreparedStatement對象中執行SQL語句,該語句可以是任何類型的SQL語句 |
executeQuery() | 在此PreparedStatement對象中SQL查詢語句,返回結果為查詢結果集ResultSet對象 |
executeUpadte() | 在此PreparedStatement對象中執行SQL語句,該SQL語句必須是個INSET,UPDATE,DELETE語句,或者返回沒有返回值的DDl語句 |
setByte(int pIndex,byte bt) | 將參數pIndex位置上設置為給定的byte型參數值bt |
setDouble(int pIndex,double dou) | 將參數pIndex位置上設置為給定的double型參數值dou |
setInt(int pInde,int x) | 將參數pIndex位置上設置為給定的int型參數值x |
setObject(int pIndex,Object o) | 將參數pIndex位置上設置為給定的Object型參數值o |
setString(int pIndex,String str) | 將參數pIndex位置上設置為給定的String型參數值str |
ResultSet接口
ResultSet接口類似一張數據表,用來暫時存放數據庫查詢操作獲得的結果集。ResultSet實例具有指向當前數據行的指定,指針開始的位置在查詢的結果集第一條記錄的前面。在獲取查詢結果集時,可通過next()方法將指針向下移動。如果存在下一行,還方法返回true,否則返回false.
方法 | 功能 |
getInt() | 以intt形式獲取ResultSet對象的當前行的指定值 |
getFloat() | 以float形式獲取ResultSet對象的當前行的指定值 |
getDate() | 以Data形式獲取ResultSet對象的當前行的指定值 |
getBoolean() | 以boolean形式獲取ResultSet對象的當前行的指定值 |
getString() | 以String形式獲取ResultSet對象的當前行的指定值 |
getObject() | 以Object形式獲取ResultSet對象的當前行的指定值 |
frist() | 將指針移到當前記錄的第一行 |
last() | 將指針移到當前記錄的最后一行 |
next() | 將指針下移一行 |
beforeFirst() | 將指針移到集合的開頭 |
afterLast() | 將指針移到集合的尾部 |
absolute(int index) | 將指針一到ResultSet指定編號的行 |
inFist() | 判斷指針是否位於當前ResultSet集合的第一行 |
isLast() | 判斷指針是否位於當前ResultSet集合的最后一行 |
updateInt() | 用指定的int值更新指定列 |
upadateFloat() | 用指定的float值更新指定列 |
updateLong() | 用指定的Long值更新指定列 |
updateString() | 用String值更新指定列 |
updateObject() | 用Object值更新指定列 |
updateNull() | 將指定列的值改為NULL |
updateDate() | 用指定的Date值更新指定列 |
updateDouble() | 用指定的double值更新指定列 |
getRow() | 查看當前的索引號 |
insertRow() | 將插入行的內容插入到數據庫 |
updateRow() | 將當前行的內容同步到數據庫 |
deleteRow() | 刪除當前行,但不同步到數據庫中,在執行close()方法后同步到數據庫中 |
基本解釋完了,有什么不具體或者不對的地方寫到具體的地方可以去查下資料在看看,然后我們繼續在寫一個增加的方法:
package myJava.jdbc; import java.sql.*; public class SelectQuery { Connection conn; //創建一個返回值為Connection的方法 public Connection getConnection(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); System.out.println("數據庫驅動加載成功"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); if(conn!=null){ System.out.println("數據庫連接成功"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回Connection對象 return conn; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SelectQuery getcon = new SelectQuery(); getcon.getConnection(); //查詢 /** String sql = "SELECT * FROM [dbo].[User]"; try { PreparedStatement Ps = getcon.conn.prepareStatement(sql); ResultSet Rs = Ps.executeQuery(); while(Rs.next()){ String name = Rs.getString("Name"); String password = Rs.getString("Password"); System.out.println(name); System.out.println(password); } Rs.close(); Ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } **/ //添加 try { Statement statement = getcon.conn.createStatement(); int count = statement.executeUpdate("INSERT INTO [dbo].[User] VALUES ('Superman','001002')"); getcon.conn.close(); System.out.println("添加行數為"+count); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
來看下運行結果:
OK,當我看添加成功后!結果不是重點,重點是增加方法里面用到了Statement接口
Statement實例用於在已經建立連接的基礎上向數據庫發送SQL語句。該接口用來執行靜態的SQL語句。Statement接口常用的方法如下:
方法 | 功能 |
execute(String sql) | 執行靜態的SELECT語句,該語句可能返回過個結果 |
executeQuery(String sql) | 執行給定SQL語句,該語句返回ResultSet對象 |
clearBatch() | 清空此Statement對象的當前SQL命令列表 |
executeBatch() | 將一批命令提交給數據庫執行,如果全部命令執行成功,則返回更新計數組的數組。 |
executeUpdate() | 執行給定的SQL語句,該語句可以為INSERT,UPDATE或者DELETE |
addBatch(String sql) | 將給定的SQL命令添加到Satement對象的當前命令列表中。 |
close() | 釋放Statement實例占用的數據庫和JDBC資源 |
接着我們在寫一個刪除這次的演示就搞完,刪除代碼如下:
package myJava.jdbc; import java.sql.*; public class SelectQuery { Connection conn; //創建一個返回值為Connection的方法 public Connection getConnection(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); System.out.println("數據庫驅動加載成功"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=DB_ShowData","sa","123456"); if(conn!=null){ System.out.println("數據庫連接成功"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //返回Connection對象 return conn; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SelectQuery getcon = new SelectQuery(); getcon.getConnection(); //查詢 /** String sql = "SELECT * FROM [dbo].[User]"; try { PreparedStatement Ps = getcon.conn.prepareStatement(sql); ResultSet Rs = Ps.executeQuery(); while(Rs.next()){ String name = Rs.getString("Name"); String password = Rs.getString("Password"); System.out.println(name); System.out.println(password); } Rs.close(); Ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } **/ //添加 /** try { Statement statement = getcon.conn.createStatement(); int count = statement.executeUpdate("INSERT INTO [dbo].[User] VALUES ('Superman','001002')"); getcon.conn.close(); System.out.println("添加行數為"+count); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } **/ //刪除 try { Statement statement = getcon.conn.createStatement(); int count = statement.executeUpdate("DELETE FROM [dbo].[User] WHERE Name LIKE 'Superman'"); getcon.conn.close(); System.out.println("成功刪除行數"+count); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
運行結果如下:
OK!關於JDBC的操作就先簡單的介紹到這里,后續我們在慢慢深入的學習,這個作為我的開始學習筆記,希望對我日后和新學Java的有所幫助,不過我的是針對SQL數據庫的,其他數據庫的就是在創建連接上有所不同,JDBC里面的接口的東西用法大同小異,可以試試去寫下!