目录

顺序查找

控制游标

条件与排序查询

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";//条件1String 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;  //预处理语句对象preSqlResultSet rs;con = GetDBConnection.connectDB("EDUC","root","");if(con == null ) return;String sqlStr ="insert into student values(?,?,?,?,?)";try { preSql2 = con.prepareStatement(sqlStr);//得到预处理语句对象preSqlpreSql2.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);//得到预处理语句对象preSq2preSql2.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){}}}
}

使用JDBC进行MySQL 5.1的数据连接、查询、修改等操作练习。相关推荐

  1. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作 在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据 ...

  2. jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码

    搜索这个标题找到一篇文章: 适用所有使用jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码 http://alexlsg.iteye.com/blog/700015 看了之后,试 ...

  3. sharepoint 2016 学习系列篇(14)-自定义列表应用篇-(3)列表数据的新增,修改,删除操作

    前面添加完列表的字段之后,接下来介绍列表数据的新增,修改,删除操作,不需要开发,就能实现数据的新增,修改,删除等操作. 重新返回到列表的http://192.168.1.73:7003/Lists/U ...

  4. java中mysql中标点符号_java – 如何在使用JDBC从MySQL数据库中提取数据时避免丢失标点符号?...

    首先,我正在使用: Java 1.7.0_02 MySQL 5.1.50 ZendServer CE (if that matters) 我用来从Java连接到MySQL的JDBC驱动程序是com.m ...

  5. jdbc和mysql面试题_JDBC数据访问技术面试题(附答案)

    随着移动互联网的发展,从事计算机行业的人越来越多,这些人中,选择java的人占了很大一部分比例,相信有很多的人都有面试的需要.在java面试中,少不了的内容就是面试题了,今天来说一说JDBC数据访问技 ...

  6. 4/5 MySQL入门总结:数据表(TABLE)操作

    数据表操作 数据表(或称表)是数据库最重要的组成部分之一,是其它对象的基础. 行:记录 列:字段 说明 操作 打开数据库 mysql> USE db_name; 查看数据表列表 mysql> ...

  7. mysql为何500w拆表_【mysql】MySQL 单表500W+数据,查询超时,如何优化呢?

    1.问题描述: MySQL 数据库,单表 `im_data_record`,查询超时(30s) 表结构如下图: 表索引如下图: 查询语句如下: SELECT `record_global_id`, ` ...

  8. mysql join on 索引_连接查询,表关联查询join on,索引,触发器,视图

    一.连接查询 1.统计每一个部门的人数  "部门名,部门的人数" select department,count(eid) from employee group by depar ...

  9. MySQL INNER JOIN:内连接查询

    内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接.简单来说,就是利用条件表达式来消除交叉连接的某些数据行. 在MySQL FROM 子句中使用关键字 INNER JOI ...

最新文章

  1. Android中WIFI开发总结(一)
  2. CentOS Linux解决Device eth0 does not seem to be present 但是没有发现eth1
  3. java响应事件_Swing中添加事件响应的三种处理方式说明
  4. Mysql使用Data Modeler
  5. python入门学习:4.if语句
  6. 中国连计算机硬盘都无法生产吗,中国仍无能力制造出电脑中的硬盘
  7. 计算机数学基础知识点归纳,《计算机数学基础》(一)――离散数学期末复习参考...
  8. Windows Phone开发之路(6) XAML基础(下)
  9. java数组函数_Java数组
  10. Atitit java的异常exception 结构Throwable类
  11. python简明教程_02
  12. python画散点图、折线图
  13. 企业开展自媒体推广,重点是什么?
  14. Java 基本数据类型存储位置
  15. 重写QLabel实现图片显示框选截取保存
  16. rangecoder
  17. 第八届中国信息安全大会在京召开
  18. .Net中Web增加加密狗管理
  19. mc服务器常用指令_我的世界服务器指令大全 最新服务器指令汇总
  20. python职业发展规划书范文_职业发展规划书精选范文

热门文章

  1. Python基础学习3
  2. 在 Ubuntu Natty 中解除系统托盘限制
  3. 236. Lowest Common Ancestor of a Binary Tree
  4. 20160127:开始学VBA:(三)、判断语句
  5. Facebook如何使用Avartarnode提升HDFS可靠性
  6. 【OpenCV】内核的形状函数使用记录
  7. OpenCV 【十六】RNG随机数发生器putText绘制文字
  8. ADO.NET 2.0 中的架构
  9. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击
  10. GCC编译选项参数介绍