📄 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 + -