目录
顺序查找
控制游标
条件与排序查询
1. where子语句 一般格式:
2. 排序
更新、添加与删除操作
1.更新
2.添加
3.删除
通用查询
顺序查找
所谓顺序查询,是指ResultSet对象一次只能看到一个数据行,使用 next()方法移到下一个数据行,next()方法最初的查询位置,即游标 位置,位于第一行的前面。next()方法向下(向后、数据行号大的方 向)移动游标,移动成功返回true,否则返回false。
Example1 查询EDUC数据库中student表的全部记录。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example1 {
public static void main(String[] args) {
Connection con=null;
Statement sql;
ResultSet rs;
try{ Class.forName("com.mysql.jdbc.Driver"); //加载JDBC_MySQL驱动
}
catch(Exception e){}
String uri = "jdbc:mysql://localhost:3308/EDUC?user=root&password=&useSSL=true&characterEncoding=utf-8";
String user ="root";
String password ="";
try{
con = DriverManager.getConnection(uri,user,password); //连接代码
}
catch(SQLException e){ }
try {
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM student"); //查询student表
while(rs.next()) {
String sno=rs.getString(1);
String sname=rs.getString(2);
String ssex=rs.getString(3);
int sage=rs.getInt(4);
String sdept=rs.getString(5);
System.out.printf("%s\t",sno);
System.out.printf("%s\t",sname);
System.out.printf("%s\t",ssex);
System.out.printf("%d\t",sage);
System.out.printf("%s\n",sdept);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
控制游标
为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象。
Statement stmt = con.createStatement(int type,int concurrency);
Example2 随机查询student表的2条记录,首先将游标移动到最后一行, 再获取最后一行的行号,以便获得表中的记录数目。
(本例用到了第8章例子18中的GetRandomNumber类的static方法)
public static int [] getRandomNumber(int max,int amount) 返回1至max之间的amount个不同的随机数
将数据库连接的代码单独封装到一个GetDatabaseConnection类中。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example2 {
public static void main(String args[]) {
Connection con;
Statement sql;
ResultSet rs;
con = GetDBConnection.connectDB("EDUC","root","");
if(con == null ) return;
try {
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,//为了得到一个可滚动的结果集
ResultSet.CONCUR_READ_ONLY);
rs = sql.executeQuery("SELECT * FROM student ");
rs.last();
int max = rs.getRow();
System.out.println("表共有"+max+"条记录,随机抽取2条记录:");
int [] a =GetRandomNumber.getRandomNumber(max,2);//得到1-max之间2个不同随机数
for(int i:a){
rs.absolute(i);//游标移动到第i行
String sno=rs.getString(1);
String sname=rs.getString(2);
String ssex=rs.getString(3);
int sage=rs.getInt(4);
String sdept=rs.getString(5);
System.out.printf("%s\t",sno);
System.out.printf("%s\t",sname);
System.out.printf("%s\t",ssex);
System.out.printf("%d\t",sage);
System.out.printf("%s\n",sdept);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
条件与排序查询
1. where子语句 一般格式:
select 字段 from 表名 where 条件
(1)字段值和固定值比较,例如:
select sname, ssex from student where sname='李四'
(2)字段值在某个区间范围,例如:
select * from student where sage<23 and sage>19
2. 排序
用order by子语句对记录排序
select * from student where sname like '%林%' order by sname
Example3 查询student表中姓名至少包括2个汉字、sage大于22的女生, 并按学号排序。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example3 {
public static void main(String args[]) {
Connection con;
Statement sql;
ResultSet rs;
con = GetDBConnection.connectDB("EDUC","root","");
if(con == null ) return;
String c1=" ssex='女' and sage>22";//条件1
String c2=" sname Like '__%'"; //条件2:至少包括两个汉字
String sqlStr =
"select * from student where "+c1+" and "+c2+" order by sno";
try {
sql=con.createStatement();
rs = sql.executeQuery(sqlStr);
while(rs.next()) {
String sno=rs.getString(1);
String sname=rs.getString(2);
String ssex=rs.getString(3);
int sage=rs.getInt(4);
String sdept=rs.getString(5);
System.out.printf("%s\t",sno);
System.out.printf("%s\t",sname);
System.out.printf("%s\t",ssex);
System.out.printf("%d\t",sage);
System.out.printf("%s\n",sdept);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
更新、添加与删除操作
1.更新
update 表 set 字段 = 新值 where <条件子句>
2.添加
insert into 表(字段列表) values (对应的具体的记录) 或 insert into 表 values (对应的具体的记录)
3.删除
delete from 表名 where <条件子句>
Example4 向student插入2条记录
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example4 {
public static void main(String args[]) {
Connection con;
Statement sql;
ResultSet rs;
con = GetDBConnection.connectDB("EDUC","root","");
if(con == null ) return;
String jiLu="('201800101','王三','男',19, '软件工程系'),"+
"('201800102','王珊','女',20, '计算机科学系')"; //2条记录
String sqlStr ="insert into student values "+jiLu;
try {
sql=con.createStatement();
int ok = sql.executeUpdate(sqlStr);
rs = sql.executeQuery("select * from student");
while(rs.next()) {
String sno=rs.getString(1);
String sname=rs.getString(2);
String ssex=rs.getString(3);
int sage=rs.getInt(4);
String sdept=rs.getString(5);
System.out.printf("%s\t",sno);
System.out.printf("%s\t",sname);
System.out.printf("%s\t",ssex);
System.out.printf("%d\t",sage);
System.out.printf("%s\n",sdept);
}
con.close();
}
catch(SQLException e) {
System.out.println("记录中sno值不能重复"+e);
}
}
}
Example5 中使用预处理语句向student表添加记录并查询了姓刘的记录
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Example5 {
public static void main(String args[]) {
Connection con;
PreparedStatement preSql,preSql2; //预处理语句对象preSql
ResultSet rs;
con = GetDBConnection.connectDB("EDUC","root","");
if(con == null ) return;
String sqlStr ="insert into student values(?,?,?,?,?)";
try {
preSql2 = con.prepareStatement(sqlStr);//得到预处理语句对象preSql
preSql2.setString(1,"A002"); //设置第1个?代表的值
preSql2.setString(2,"刘伟2"); //设置第2个?代表的值
preSql2.setString(3,"男"); //设置第3个?代表的值
preSql2.setFloat(4,20); //设置第4个?代表的值
preSql2.setString(5,"通信系"); //设置第5个?代表的值
int okk = preSql2.executeUpdate();
sqlStr="select * from student where sname like ? ";
preSql2 = con.prepareStatement(sqlStr);//得到预处理语句对象preSq2
preSql2.setString(1,"刘%"); //设置第1个?代表的值
rs = preSql2.executeQuery();
while(rs.next()) {
String sno=rs.getString(1);
String sname=rs.getString(2);
String ssex=rs.getString(3);
int sage=rs.getInt(4);
String sdept=rs.getString(5);
System.out.printf("%s\t",sno);
System.out.printf("%s\t",sname);
System.out.printf("%s\t",ssex);
System.out.printf("%d\t",sage);
System.out.printf("%s\n",sdept);
}
con.close();
}
catch(SQLException e) {
System.out.println("记录中sno值不能重复"+e);
}
}
}
通用查询
编写一个类,只要用户将数据库名、SQL语句传递给该类对象,那么该对象就用一个二维数组返回查询的记录。
结果集ResultSet对象rs调用getMetaData()方法返回一个 ResultSetMetaData对象(结果集的元数据对象):
ResultSetMetaData metaData = rs.getMetaData(); metaData,调用getColumnCount()方法就可以返回结果集rs中的列的数目:
int columnCount = metaData.getColumnCount();
metaData调用getColumnName(int i)方法就可以返回结果集rs中的第i列 的名字:
String columnName = metaData.getColumnName(i);
Example6 将数据库名以及SQL语句传递给Query类的对象,用表格 (JTable组件)显示查询到的记录。
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Example6 {
public static void main(String args[]) {
String [] tableHead;
String [][] content;
JTable table ;
JFrame win= new JFrame();
Query findRecord = new Query();
findRecord.setDatabaseName("EDUC");
findRecord.setSQL("select * from student");
content = findRecord.getRecord();
tableHead=findRecord.getColumnName();
table = new JTable(content,tableHead);
win.add(new JScrollPane(table));
win.setBounds(12,100,400,200);
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Query.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class Query {
String databaseName=""; //数据库名
String SQL; //SQL语句
String [] columnName; //全部字段(列)名
String [][] record; //查询到的记录
public Query() {
try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC-MySQL驱动
}
catch(Exception e){}
}
public void setDatabaseName(String s) {
databaseName=s.trim();
}
public void setSQL(String SQL) {
this.SQL=SQL.trim();
}
public String[] getColumnName() {
if(columnName ==null ){
System.out.println("先查询记录");
return null;
}
return columnName;
}
public String[][] getRecord() {
startQuery();
return record;
}
private void startQuery() {
Connection con;
Statement sql;
ResultSet rs;
String uri =
"jdbc:mysql://localhost:3308/"+
databaseName+"?useSSL=true&characterEncoding=utf-8";
try {
con=DriverManager.getConnection(uri,"root","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery(SQL);
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();//字段数目
columnName=new String[columnCount];
for(int i=1;i<=columnCount;i++){
columnName[i-1]=metaData.getColumnName(i);
}
rs.last();
int recordAmount =rs.getRow(); //结果集中的记录数目
record = new String[recordAmount][columnCount];
int i=0;
rs.beforeFirst();
while(rs.next()) {
for(int j=1;j<=columnCount;j++){
record[i][j-1]=rs.getString(j); //第i条记录,放入二维数组的第i行
}
i++;
}
con.close();
}
catch(SQLException e) {
System.out.println("请输入正确的表名"+e);
}
}
}
Example7 用了事务处理,将student表中sno字段是A001的 ssage的值减少2,并将减少的2增加到字段是A002的ssage上。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example7{
public static void main(String args[]){
Connection con = null;
Statement sql;
ResultSet rs;
String sqlStr;
con = GetDBConnection.connectDB("EDUC","root","");
if(con == null ) return;
try{ int n = 2;
con.setAutoCommit(false); //关闭自动提交模式
sql = con.createStatement();
sqlStr = "select sname,sage from student where sno='A001'";
rs = sql.executeQuery(sqlStr);
rs.next();
int h1 = rs.getInt(2);
System.out.println("事务之前"+rs.getString(1)+"年龄:"+h1);
sqlStr = "select sname,sage from student where sno='A002'";
rs = sql.executeQuery(sqlStr);
rs.next();
int h2 = rs.getInt(2);
System.out.println("事务之前"+rs.getString(1)+"年龄:"+h2);
h1 = h1-n;
h2 = h2+n;
sqlStr = "update student set sage ="+h1+" where sno='A001'";
sql.executeUpdate(sqlStr);
sqlStr = "update student set sage ="+h2+" where sno='A002'";
sql.executeUpdate(sqlStr);
con.commit(); //开始事务处理,如果发生异常直接执行catch块
con.setAutoCommit(true); //恢复自动提交模式
String s = "select sname,sage from student"+
" where sno='A001' or sno='A002'";
rs =
sql.executeQuery(s);
while(rs.next()){
System.out.println("事务后"+rs.getString(1)+
"年龄:"+rs.getFloat(2));
}
con.close();
}
catch(SQLException e){
try{ con.rollback(); //撤销事务所做的操作
}
catch(SQLException exp){}
}
}
}