這幾天剛做完數據庫的課程設計,來稍微總結一下如何通過jdbc訪問sql server數據庫進行簡單的增刪改查操作。在連接之前,需要簡單地配置一下,包括下載對應jdk版本的驅動,設置環境變量等等。相關配置可參考博客: https://blog.csdn.net/rebekahq/article/details/78691343
我重點總結一下如何在java代碼里連接數據庫,進行增刪改查。先貼一段用來查詢數據庫的代碼實例:
查詢
package com.ph; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class Test1 {
public static void main(String[]args) { PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; try { //1.加載驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.得到鏈接 127.0.0.1:1433
ct=DriverManager.getConnection ("jdbc:sqlserver://127.0.0.1:1433;databaseName=Mytest","sa","123456");
ps=ct.prepareStatement("select * from course"); rs=ps.executeQuery(); while(rs.next()) { String cno=rs.getString(1); String cname=rs.getString(2); String tno=rs.getString(3); System.out.println("cno "+cno+" cname "+cname+" tno "+tno); } }catch(Exception e) { e.printStackTrace(); }finally { try { if(rs != null)rs.close(); if(ps != null)ps.close(); if(ct != null)ct.close(); }catch(Exception e) { e.printStackTrace(); } } } }
分析一下代碼:
(1)、Class.forName() 如代碼中的注釋,第14行一整行代碼是用來加載sql server驅動的。那 Class.forName() 這個函數是用來干嘛的呢,它的作用是:用來初始化給定的類,即引號里面的類。如果換一種寫法:DriverManger.registerDriver(new Driver()); 更為直接點,直接初始化,也是可以的。對Class.forName()這個函數感興趣的,可以參考
http://www.jb51.net/article/117468.htm
(2)、DriverManger.getConnection() DriverManger這個類,查API就可以知道,是用來管理jdbc驅動的基本服務。如果把參數加上,就是:
static Connection DriverManger.getConnecttion(String url, String user, String password)
返回類型是Connection,其中的參數分別為:絕對路徑、用戶名、密碼。最好使用windows加Sql server混合驗證,在數據庫設置一下賬號和密碼,否則可能連不上。
絕對路徑是指本地數據庫的絕對路徑:jdbc:sqlserver://127.0.0.1:1433 其中包含了ip地址,對應的端口(這也是使用前必須設置好的,前面的鏈接有詳細教程)。
(3)、Connection接口介紹。 上一個方法的返回值,是Connection接口的一個實例對象,而Connection接口中的函數可以與連接的數據庫“對話”,注意:sql語句就是通過該接口的函數執行的。例如上述代碼中的:ps=ct.prepareStatement("select * from course"); Connection中的getMetaData方法還可以獲取已連接數據庫所支持的sql語法、存儲過程、此連接功能等信息。下面介紹PreparedStatement對象。
(4)、PreparedStatement對象。上條方法的返回值ps即為其實例,這個類與執行sql語句的效率有關。Connection中的sql語句可以預編譯保存在PreparedStatement對象中(如ps),當需要執行該語句時,直接調用ps,不需要重復地編譯select語句,提高了效率。
(5)、ResultSet。它用來承接PreparedStatement對象查詢到的結果,可以通過該對象中的方法來訪問數據庫。如代碼中的循環所示,一開始rs光標停在第一行的前面(注意,並非第一行),當第一次執行rs.next()函數時,光標才會到第一行,用一個while循環就可以遍歷整個表的行。而rs.getString(index)是用來返回第index列的值,是橫向的。注意:第一列的index就是1,而不是0,和數組下標有所區別。
(6)、整個代碼用try catch包起來,並且記得調用close方法依次關閉引用,做好善后工作,防止內存泄漏。(順序:后使用的率先關閉)
以上就是簡單的遍歷查詢方法,可以根據具體情況修改 sql語句、是否使用循環、以及循環跳出的條件。
修改
PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; try { //1.加載驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.得到鏈接 127.0.0.1:1433
ct=DriverManager.getConnection ("jdbc:sqlserver://127.0.0.1:1433;databaseName=student","sa","123456");
String sql="update s set sname=?,sex=?,age=?,saddress=?,"
+ "spnumber=?,dno=?,political=? where sno=?"; ps=ct.prepareStatement(sql); //給?賦值
ps.setString(1, jtf2.getText()); ps.setString(2, jtf3.getText()); ps.setString(3, jtf4.getText()); ps.setString(4, jtf5.getText()); ps.setString(5, jtf6.getText()); ps.setString(6, jtf7.getText()); ps.setString(7, jtf8.getText()); ps.setString(8, jtf1.getText());
ps.executeUpdate(); this.dispose(); }catch(Exception e) { e.printStackTrace(); }finally { try { if(rs!=null)rs.close(); if(ps!=null)ps.close(); if(ct!=null)ct.close(); }catch(Exception e) { e.printStackTrace(); } }
這個是所做項目中截取的,getText( )方法是用來獲取輸入框內的內容的, ps.setString( i , String )前一個參數對應着sql語句中第 i個問號(?),而String可以理解要給問號(?)賦的值。當然,不一定是String類型,也可以是其他的類型。
刪除
public class DeleData {
PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; public DeleData(String sId){ try { //1.加載驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.得到鏈接 127.0.0.1:1433
ct=DriverManager.getConnection ("jdbc:sqlserver://127.0.0.1:1433;databaseName=student","sa","123456");
ps=ct.prepareStatement("delete from s where sno=?"); ps.setString(1, sId); ps.executeUpdate();
}catch(Exception e) { e.printStackTrace(); }finally { try { if(ps!=null) ps.close(); if(ps!=null) ct.close(); }catch(Exception e) { e.printStackTrace(); } } }
}
換湯不換葯,看懂第一個,下面的也該會了。
添加
public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub
if(arg0.getSource()==jb1){ PreparedStatement ps=null; Connection ct=null; ResultSet rs=null; try { //1.加載驅動
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.得到鏈接 127.0.0.1:1433
ct=DriverManager.getConnection ("jdbc:sqlserver://127.0.0.1:1433;databaseName=student","sa","123456");
String sql="insert into s values(?,?,?,?,?,?,?,?)"; ps=ct.prepareStatement(sql); ps.setString(1, jtf1.getText()); ps.setString(2, jtf2.getText()); ps.setString(3, jtf3.getText()); ps.setString(4, jtf4.getText()); ps.setString(5, jtf5.getText()); ps.setString(6, jtf6.getText()); ps.setString(7, jtf7.getText()); ps.setString(8, jtf8.getText());
ps.executeUpdate(); this.dispose(); }catch(Exception e) { e.printStackTrace(); }finally { try { if(rs!=null)rs.close(); if(ps!=null)ps.close(); if(ct!=null)ct.close(); }catch(Exception e) { e.printStackTrace(); } } } }
以上代碼大多截取自最近做的學生檔案管理系統。。。也就是數據庫課程設計,用swing寫了一個小界面,也了解了如何通過jdbc連接訪問SQLserver,在eclipse中,對數據庫進行增刪改查操作。項目雖小,收獲還是挺大的,開森(/≧▽≦)/。
如有錯誤,歡迎批評指導!
