一、概述
java數據庫管理系統?程序開發沒有數據庫的參與,可以說幾乎是不可能的。數據庫和Java都已經有了簡單的了解,現在的關鍵是對兩者進行連接,起到這一作用的正是JDBC——Java Database Connectivity,數據庫橋接。JDBC提供了一整套API使應用程序對數據庫進行操作,如下圖所示。
首先你要有一個能用的數據庫,我比較熟悉MySQL,因此我并不想跳出舒適圈子,所有的數據庫操作應該沒什么不同,因此就以MySQL為例,MySQL的詳細安裝過程見這篇隨筆。但是只有命令行對數據庫的管理造成困難,因此介紹一款數據庫圖形化界面管理工具Navicat for MySQL(一個系列的,還有針對SQL Server,Oracle和MongoDB的版本)。官網在這https://www.navicat.com.cn/,這樣管理起來相當方便。
準備工作的最后一步是下載JDBC驅動jar包(不要去搞什么jdbc-odbc設置),這個非常好找,下載之后解壓找到jar包(我的這版名稱是mysql-connector-java-5.1.40-bin.jar)導入目標工程中的library中即可,不論你是Eclipse還是IDEA,大致流程都相同,之前對Eclipse已經輕車熟路了,現在展示以下IDEA導入jar到library庫中的詳細步驟。
第一步:File——Project Structure
第二步:選擇library,點擊加號添加
第三步:選擇Java,找到那個jar包
完結撒花!!等等,這好像才剛剛開始。
整個全部流程如下:
二、數據庫連接和SQL“更新”語句的執行
這里我先上一段代碼,作用是在數據庫中創建一個表。
import java.sql.*;public classConnect {public static voidmain (String [] args)
{
String url= "jdbc:mysql://localhost:3306/manager?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
String user= "root";
String password= "123456";try{//注冊驅動
DriverManager.registerDriver(newcom.mysql.jdbc.Driver());//獲得連接對象
Connection connection =DriverManager.getConnection(url, user, password);
Statement s=connection.createStatement();
String sql= "create table course " +
"( Course_id int primary key," +
" CourseNumber varchar(10)," +
" CourseName varchar(50))";
s.executeUpdate(sql);
s.close();
connection.close();
}catch(SQLException e)
{
}
}
}
//注冊驅動
DriverManager.registerDriver(newcom.mysql.jdbc.Driver());//獲得連接對象
Connection connection = DriverManager.getConnection(url, user, password);
這兩句代碼就是通過驅動連接數據庫了,首先要注冊驅動,當然除了registerDriver方法,還有其他的注冊方法,例如Class.forName(“com.mysql.jdbc.Driver”)等,注冊驅動之后需要調用getConnection方法返回一個Connection對象,參數是String形式的數據庫的url,用戶名和密碼,即預先設置的String串,其中紅色部分代表數據庫名稱,要進行相應的改變。 返回的Connection對象的最重要的作用應該就是創建另外一個對象,
Statement s = connection.createStatement();
就是Statement對象,Statement對象能夠執行SQL語句,其重要性不言而喻,也是任何Java數據庫初學者必須要接觸的類。執行SQL語句并非只有一個方法,而是分為executeUpdate()和executeQuery()兩種,分別執行更新和查詢功能。本節介紹更新語句的執行,包括CREATE、DROP、INSERT等不返回結果的SQL語句都被歸類于此。
String sql = "create table course " +
"( Course_id int primary key," +
" CourseNumber varchar(10)," +
" CourseName varchar(50))";
s.executeUpdate(sql);
方法調用形式也比較簡易,只需將SQL語句的String形式作為參數即可,但是要注意SQL語句不能語法出錯,否則異常可不好定位。上述語句將會創建一個名為course的表,并且擁有三個屬性。
s.close();
connection.close();
做大事者需要拘小節,不要忘記關閉對象,也許這不會影響你程序的運行,也許會,但是一個良好的編碼習慣是必要的。
? ? ? ? ? ? ??
創建的表,在navicat中的詳情展示。
大多數情況下,更新語句的功能都可以可視化的操作,因此這一部分好像顯得不是非常重要,但這絕對是要必須掌握的,僅僅只會查詢語句和可視化的操作效率未必高、流程未必規范。
三、SQL“查詢”語句的執行
本屆介紹查詢語句的執行,內容比較多,主要在于對查詢結果的信息獲取和處理。分為對列的處理和對行的處理,先來看對列的處理:
import java.sql.*;public classSelect {publicString url;publicString user;publicString password;
Select(String a,String b,String c)
{
url=a;
user=b;
password=c;
}public Connection getConnection () throwsSQLException
{
DriverManager.registerDriver(newcom.mysql.jdbc.Driver());//獲得連接對象
Connection connection =DriverManager.getConnection(url, user, password);returnconnection;
}public static voidmain(String []args)
{
String url= "jdbc:mysql://localhost:3306/manager?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
String user= "root";
String password= "123456";try{
Select select= newSelect(url, user, password);
Connection c=select.getConnection();
Statement s=c.createStatement();
String sql= "select * from course";
ResultSet rs=s.executeQuery(sql);
ResultSetMetaData rm=rs.getMetaData();int n =rm.getColumnCount();for (int i = 0; i < n; i++) {
System.out.println("第" + (i + 1) + "列");
System.out.println("名稱是:" + rm.getColumnName(i + 1));
System.out.println("類型是:" + rm.getColumnTypeName(i + 1));
System.out.println("精度是:" + rm.getPrecision(i + 1));
}
s.close();
c.close();
}catch(SQLException e)
{
}
}
}
執行語句和更新基本相同,但是方法換成了executeQuery()方法,然后返回ResultSet類的實例對象,查詢結果的所有信息都將從中獲得。如想獲得查詢結果的列信息,還需要調用getMetaData()返回ResultSetMetaData對象。
上述代碼的運行結果是:
第1列
名稱是:Course_id
類型是:INT
精度是:11第2列
名稱是:CourseNumber
類型是:VARCHAR
精度是:10第3列
名稱是:CourseName
類型是:VARCHAR
精度是:50
處理行可能會是更為關注的內容,也即對查詢的結果進行處理。行的處理一般是直接對ResultSet對象進行處理,先看實例
import java.sql.*;public classSelect2 {public static voidmain(String []args) {
String url= "jdbc:mysql://localhost:3306/manager?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
String user= "root";
String password= "123456";try{
Select select= newSelect(url, user, password);
Connection c=select.getConnection();
Statement s=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql= "select * from course";
ResultSet rs=s.executeQuery(sql);/*row*/rs.last();
System.out.println("共查詢到"+rs.getRow()+"條記錄");
rs.beforeFirst();while(rs.next())
{
System.out.println("第"+rs.getRow()+"行:");
System.out.println("id is "+rs.getInt(1));
System.out.println("number is "+rs.getInt(2));
System.out.println("name is "+rs.getString("CourseName"));
}
s.close();
c.close();
}catch(SQLException e)
{
}
}
}
結果如下:
共查詢到3條記錄
第1行:
id is1number is1010name is Java
第2行:
id is2number is1111name is C
第3行:
id is3number is1234name is C++
數據庫中的數據:
首先的與之前的區別在于createStatement()的參數不能再是空的了,多了兩個參數,第一個是resultSetType設置返回結果集訪問記錄的順序:
第二個參數是resultSetConcurrency設置是否能對結果集進行更新
而程序中的兩個參數使得可以對結果集的記錄以任意的順序進行訪問,較為常用。
其余的方法可以將ResultSet考慮成一個游標或者指針,last()將其指向最后一條記錄,first()則是第一條,beforeFirst()指向第一條之前,next()指向下一條,初始情況指向第一條之前,與beforeFirst()一致,getRow()能夠獲取當前的行號。而常用的遍歷結果集的方法正如代碼中所示結合next()方法和getInt()或者getString()這些方法【參數可以是列名,也可以是列標號】。
此外,ResultSet也有打開和關閉兩種狀態,每個Statement實例對象可以進行多次查詢,并產生多個ResultSet對象,但是每個時刻只能有一個處于打開狀態,即當每次運行SQL產生新的ResultSet對象時,其他的就會關閉。當Statement對象被關閉時,其產生的ResultSet對象也都會關閉。
插一個JDBC(數據庫)和JAVA類型的對照表:
四、帶參數的SQL語句執行
實際上帶參數的SQL語句是十分常用的,尤其是在嵌入到程序中時。比如當我輸入課程號,輸出相應的課程名稱:
Select select = newSelect(url, user, password);
Connection c=select.getConnection();
Statement s=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
Scanner sc= newScanner(System.in);int ii =sc.nextInt();
String sql= "select CourseName from course where Course_id = ' " + ii +" '";
ResultSet rs=s.executeQuery(sql);
rs.next();
System.out.println("name is " + rs.getString("CourseName"));
s.close();
c.close();
結果:
借此實現一些簡單的數據庫交互操作,但是更常見的方法是使用PreparedStatement,如下
Select select = newSelect(url, user, password);
Connection c=select.getConnection();
Scanner sc= newScanner(System.in);int ii =sc.nextInt();
/*PreparedStatement*/PreparedStatement ps= c.prepareStatement("select CourseName from course where Course_id = ?");
ps.setInt(1,ii);
ResultSet rs=ps.executeQuery();
rs.next();
System.out.println("name is " + rs.getString("CourseName"));
ps.close();
c.close();
1.首先PreparedStatement也是通過Connection對象調用方法preparedStatement,值得一提的是與createStatement()不同,參數不是為空,或者ResultType等設置,而必須是sql語句,可帶?代表未定參數。
2.之后設置這些參數int型就用setInt()方法,字符串就用setString()方法,一般都是兩個參數,第一個代表是前面sql中的第幾個?,第二個是具體值。
3.最后PreparedStatement執行直接調用executeQuery()方法,無需任何參數即可返回ResultSet對象,之后的步驟和Statement就相同了。
比較Statement和PreparedStatement來說,后者會更加安全,而且多次使用會提高效率。但是單次執行來說前者會是更優的選擇。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态