?? databaseoperation.java
字號:
//【例11.2】 連接指定數據庫并獲得數據庫屬性信息。
//【例11.3】 執行數據操縱的SQL語句。
// 數據庫操作類
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import javax.swing.*;
import javax.swing.table.*;
public class DataBaseOperation
{
private Connection connection; //數據庫連接對象
//構造方法,連接指定數據庫。4個參數分別指定JDBC驅動程序、數據庫URL、用戶名和口令
public DataBaseOperation(String driver,String url, String user, String password)
throws ClassNotFoundException,SQLException
{
this.connection = null;
Class.forName(driver); //指定JDBC驅動程序
this.connection = DriverManager.getConnection(url,user,password); //返回數據庫連接對象
}
public DataBaseOperation(String driver, String url) throws ClassNotFoundException,SQLException
{
this.connection = null;
Class.forName(driver);
this.connection = DriverManager.getConnection(url);
}
public void finalize() throws SQLException //析構方法,關閉數據庫連接
{
this.connection.close();
}
public String getDBAbout() throws SQLException //獲得所連接數據庫的屬性信息,返回字符串
{
String message = "";
DatabaseMetaData dbmd = this.connection.getMetaData();
message = "JDBC驅動程序:" + dbmd.getDriverName() +" "+ dbmd.getDriverVersion() + "\r\n" +
"JDBC URL:" + dbmd.getURL() + "\r\n" +
"數據庫:" + dbmd.getDatabaseProductName() + "\r\n" +
"數據庫版本:" + dbmd.getDatabaseProductVersion() + "\r\n"+
"用戶名:" + dbmd.getUserName() + "\r\n";
return message;
}
//【例11.3】 執行數據操縱的SQL語句。
//執行數據更新的SQL語句,包括INSERT、UPDATE、DELETE語句
//執行成功返回所影響的行數,否則返回0
public int dataUpdate(String sql) throws SQLException
{
Statement statement = this.connection.createStatement();
int result = statement.executeUpdate(sql);
statement.close();
return result;
}
//執行數據查詢的SELECT語句,參數table 指定表名,conditions 指定WHERE子句的查詢條件,多個條件時用邏輯運算符連接
//執行成功返回數據結果集,否則返回null。
public void select(String sql) throws SQLException
{
Statement statement = this.connection.createStatement();
ResultSet resultset = statement.executeQuery(sql); //執行數據查詢SELECT語句
ResultSetMetaData rsmd = resultset.getMetaData(); //返回元數據對象
int columnCount = rsmd.getColumnCount(); //獲得列數
for(int j=1;j<=columnCount;j++)
System.out.print(rsmd.getColumnLabel(j)+" "); //獲得列名
System.out.println();
while(resultset.next()) //從前向后訪問每行
{
for(int j=1;j<=columnCount;j++) //獲得每列值
System.out.print(resultset.getString(j)+" "); //獲得當前行指定列的值
System.out.println();
}
resultset.close();
statement.close();
}
//實驗11 按省份分類瀏覽student數據庫中的stuinfo表。
//【例13.1】 輸入并分類瀏覽參賽隊信息。
//執行數據查詢的SELECT語句,參數table 指定表名,conditions 指定WHERE子句的查詢條件,多個條件時用邏輯運算符連接
//執行成功返回數據結果集,否則返回null。
public String[] selectDistinct(String table, String column) throws SQLException
{
String[] results=null;
if(table!=null && table!="")
{
String sql = "SELECT DISTINCT "+column+" FROM "+table+" ORDER BY "+column; //獲得指定列不重復的值
Statement statement = this.connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY); //設置結果集屬性為可滾動、只讀
ResultSet resultset = statement.executeQuery(sql); //執行數據查詢SELECT語句
if (resultset!=null)
{
int rowCount=0;
while(resultset.next()) //獲得結果集總行數
rowCount++;
results = new String[rowCount+1]; //按列數分配一維數組空間
results[0] = "全部";
resultset.beforeFirst(); //移動指針到第一行之前
int i=1;
while(resultset.next()) //獲得每列數據
{
results[i] = resultset.getString(1); //獲得當前行指定列的值
i++;
}
}
resultset.close();
statement.close();
}
else
throw new SQLException("表名不能為空。");
return results;
}
//執行包含集函數的數據查詢SELECT語句
public int selectCount(String sql) throws SQLException
{
Statement statement = this.connection.createStatement();
ResultSet resultset = statement.executeQuery(sql); //執行數據查詢SELECT語句
resultset.next();
int count = resultset.getInt(1);
resultset.close();
statement.close();
return count;
}
//執行數據查詢的SELECT語句,參數table 指定表名,conditions 指定WHERE子句的查詢條件,多個條件時用邏輯運算符連接
//執行成功返回數據結果集,否則返回null。
public void select(String table, String conditions, String sort_column, DefaultTableModel tableModel) throws SQLException
{
if(table!=null && table!="")
{
String sql = "SELECT * FROM " + table; //查詢全部列時
if(conditions!=null && conditions!="")
sql +=" WHERE " + conditions; //增加查詢條件
sql +=" ORDER BY "+ sort_column ; //按指定列的升序排序
// sql +=" ORDER BY '#1'" ; //默認按第1列的升序排序,SQL Server不支持#1
// System.out.println(sql);
Statement statement = this.connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); //設置結果集屬性為可滾動、只讀
ResultSet resultset = statement.executeQuery(sql); //執行數據查詢SELECT語句
if (resultset!=null)
{
int rowCount=0;
while(resultset.next()) //獲得結果集總行數
rowCount++;
ResultSetMetaData rsmd = resultset.getMetaData(); //返回元數據對象
int columnCount = rsmd.getColumnCount(); //獲得列數
tableModel.setRowCount(rowCount);
tableModel.setColumnCount(columnCount);
resultset.beforeFirst(); //移動指針到第一行之前
int i=0;
while(resultset.next()) //獲得每列數據
{
for(int j=1;j<=columnCount;j++)
tableModel.setValueAt(resultset.getString(j), i, j-1);//獲得當前行指定列的值
i++;
}
// dataModel.fireTableChanged(null);
}
else
tableModel.setRowCount(0);
resultset.close();
statement.close();
}
else
throw new SQLException("表名不能為空。");
}
}
/*
① 執行數據插入INSERT語句的方法
在DataBaseOperation類中添加下列insert()方法。insert()方法將參數指定的表、列及列值轉換成一條數據插入的INSERT語句,參數table指定表名,columns[]數組指定多個列,values[]數組指定多個列對應的取值,執行成功返回1,否則返回0。該方法聲明如下。
② 執行數據查詢SELECT語句的方法
在DataBaseOperation類中添加下列select()方法。select()方法將參數指定的表及條件轉換成一條數據查詢的SELECT語句,參數table指定表名,conditions指定WHERE子句的查詢條件,多個條件時用邏輯運算符連接。
由于調用executeQuery()方法執行SELECT語句返回一個結果集ResultSet對象,這個對象需要在保持數據庫連接的狀態才能訪問,而select()方法調用是不基于數據庫連接的,所以,select()方法不能簡單返回一個ResultSet對象,需要將ResultSet對象中的數據讀出并轉移到一個二維數組Object[][]中。該方法聲明如下。
其中,將ResultSet對象屬性設置為可滾動的,按從前向后的方向對結果集訪問了兩次,第一次循環獲得結果集的總行數,以確定二維數組的維數,再調用beforeFirst()方法使結果集指針回到第1行之前,準備再一次對結果集進行訪問。
*/
/*
//執行數據查詢的SELECT語句,參數table 指定表名,conditions 指定WHERE子句的查詢條件,多個條件時用邏輯運算符連接
//執行成功返回數據結果集,否則返回null。
public Object[][] select(String table, String conditions) throws SQLException
{
Object[][] resultobj = null;
if(table!=null && table!="")
{
String sql = "SELECT * FROM " + table; //查詢全部列時
if(conditions!=null && conditions!="")
sql +=" WHERE " + conditions; //增加查詢條件
sql +=" ORDER BY '#1'" ; //默認按第1列的升序排序
System.out.println(sql);
Statement statement = this.connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE); //設置結果集屬性為可滾動、只讀
ResultSet resultset = statement.executeQuery(sql); //執行數據查詢SELECT語句
if (resultset!=null)
{
int rowCount=0;
while(resultset.next()) //獲得結果集總行數
rowCount++;
ResultSetMetaData rsmd = resultset.getMetaData(); //返回元數據對象
int columnCount = rsmd.getColumnCount(); //獲得列數
resultobj = new String[rowCount][columnCount]; //按行列數分配二維數組空間
resultset.beforeFirst(); //移動指針到第一行之前
int i=0;
while(resultset.next()) //獲得每列數據
{
for(int j=1;j<=columnCount;j++)
resultobj[i][j-1] = resultset.getString(j); //獲得當前行指定列的值
i++;
}
}
resultset.close();
}
else
throw new SQLException("表名不能為空。");
return resultobj;
}
//數據查詢,沒有條件,返回表中全部數據
public Object[][] select(String table) throws SQLException
{
return select(table,"");
}
//執行INSERT語句插入一行數據,參數table指定表名,columns[]數組指定多個列,values[]數組指定多個列對應的取值
//執行成功返回1,否則返回0
public int insert(String table, String[] columns, Object[] values) throws SQLException
{
int result = 0;
String sql = "INSERT INTO " + table + " "; //轉換表名
if (columns!=null) //轉換多個列名
{
sql += " (" + columns[0];
for(int i=1;i<columns.length;i++)
sql += " , " + columns[i];
sql += ")";
}
sql += " VALUES ('"+ values[0]+"'"; //轉換多個列值
for(int i=1;i<values.length;i++)
sql += " , '" + values[i] +"'";
sql += ")";
System.out.println(sql);
Statement statement = this.connection.createStatement();
result = statement.executeUpdate(sql); //執行數據插入INSERT語句
statement.close();
return result;
}
//數據插入,沒有指定列,values[]數組指定所有列的取值
public int insert(String table, Object[] values) throws SQLException
{
return insert(table, null, values);
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -