使用JDBC进行MySQL 5.1的数据连接、查询、修改等操作练习。
目录
顺序查找
控制游标
条件与排序查询
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){}}}
}
相关文章:

Tensorflow多线程输入数据处理框架(一)——队列与多线程
参考书 《TensorFlow:实战Google深度学习框架》(第2版) 对于队列,修改队列状态的操作主要有Enqueue、EnqueueMany和Dequeue。以下程序展示了如何使用这些函数来操作一个队列。 #!/usr/bin/env python # -*- coding: UTF-8 -*- # c…

编译器错误信息: CS0016
编译器错误信息: CS0016: 未能写入输出文件,..\Temporary ASP.NET Files\WebApp\d087da43\c12930d8\9ze28k_8.dll”--拒绝访问 编译器错误信息: CS0016: 未能写入输出文件“d:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\5177u\d087da43\c12930d8\9ze…

Visual Studio 2008 Samples Page
Visual Studio 2008 Samples Page http://msdn.microsoft.com/zh-cn/bb330936(en-us).aspx 如何实现 - 常规开发http://msdn.microsoft.com/zh-cn/library/ms246578.aspx Visual Studio 2008http://msdn.microsoft.com/zh-cn/library/aa187917.aspx .NET Framework 3.5http://m…

iOS开发网络篇—HTTP协议
说明:apache tomcat服务器必须占用8080端口 一、URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) 通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址、位置,互联网上的每个资源都有一个…

操作系统导论部分章节习题
进程 一。单选题(共1题,10.0分) 当某个进程进行系统调用以通过网络传输TCP数据包时,以下哪些步骤不会总是发生? A进程进入内核模式。 B,CPU的程序计数器转移到地址空间的内核部分。 C,该进…

Go-技篇第一 技巧杂烩
Go-技篇第一 技巧杂烩一句话技巧把你面向对象的大脑扔到家里吧,去拥抱接口。mikegehard学习如何使用Go的方式做事,不要把别的的编程风格强行用在Go里面。DrNic多用接口总比少用好。evanphx拥抱这种简洁、并行、工整的语言。francesc阅读官网golang.org上…

Visual Studio 2008 到底有多强?漫画告诉你 !
插入数据需要无数个SQL语句支持,而现在,你只需要有一个强大的LinQ巴士,就直接一次性全搞定,方便快捷 " 强大的中转站,帮你解决额外的问题,数据传输选择最优路径,完成工作。数据给了WCF&a…

使用c#生成高品质小空间的缩略图
dot自带的生成缩略图的方法是Bitmap.GetThumbnailImage这个方法生成的缩略图不够清晰,一般我们会使用Graphics高质量插值发生成清晰的缩略图,这时候大小会不尽人意,怎么办?我们可以使用jpeg压缩的方法压缩一下图片,这样…

将Project的内容导出成单独的XPO文件
AX跟VSS整合的版本管理可以通过创建知识库将当前层的代码全部签入到VSS中,但是如果不是一个团队开发solution,而是针对客户的需求随时做得一些小改动,一般都希望以Project的形式组织代码和发布代码。AX与VSS的整合没有提供一种方法可以将一个…

.Net Core MVC初学习
.net core已经出来很长一段时间了,没有很好的学习过,现在工作不那么忙了,参考官方文档,在这里记录自己的学习过程! ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程…

编译原理考点复习
名词填空、名词解释、解答题: 文法是什么?文法、句子、句型、确定有穷自动机(DFA)、非确定有穷自动机(NFA)的定义?编译过程主要有哪些功能模块?有什么辅助模块(表格管理…

网络工程师如何才能实现职位晋升
一、如何在公司得到攀升的机会?如果不想保持低月薪,就运用你的技术积极参与公司的业务发展从最近我们公司招生来看,一个很明显的问题阴魂不散的笼罩在“网络工程师”这个行业。问题的根本是对网络工程师职业前途的严重误解。很多人认为目前的…

Linux中/etc/resolv.conf文件简析
https://blog.csdn.net/lcr_happy/article/details/54867510转载于:https://www.cnblogs.com/answercard/p/10354514.html

第二章 Servlet核心技术 实训二
question.html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>简单测试</title> </head> <body> <p>请回答下面的问题:</p> <form action"simpletest.do"meth…

BZOJ 4025 二分图
题目大意 给定一个\(n\)个点, \(m\)条边的无向图, 每条边在一定时间范围内存在. 要你判断每个时间点这张图是否为二分图.\(n \le 10^5\)\(m \le 2 \times 10^5\) Solution 我们考虑一个合法的二分图有什么性质: 图中不存在奇环, 即环上边数(点数)为奇数的环. 考虑如何判断每个时…

javascript对象之window对象详解
frames 表示当前窗口中所有frame对象的数组 status 表示浏览器的状态行信息 defaultstatus 表示浏览器的状态行信息 history 表示当前窗口的历史记录,这可以引用在网页导航中 closed 表示当前窗口是否关闭的逻辑值 document 表示当前窗口中显示的当前文档对象 location 表示当前…

Wsus简单笔记
一:安装前的要求1:iis6.0以上,bits、Asp.net2.02:sql20053:Microsoft Management Console 3.04:microsof report viewer redistributable 20055:ntsf分区二:安装1:过程比较简单,注意设置本地补丁…

机器学习-Sklearn
Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sklearn 包含了很多种机器学习的方式:Classification 分类 Regression 回归 Clustering 非监督分类 Dimensionality reduction 数据降维 Model Selection 模型选择 Preprocessing 数据预处理 我们总…

[翻译]自动维护索引重新生成组织的SQL批处理语句
脚本来自《Inside Server 2005 T-SQL Programming》 SET NOCOUNT ON;DECLARE objectid int;DECLARE indexid int;DECLARE partitioncount bigint;DECLARE schemaname nvarchar(258);DECLARE objectname nvarchar(258);DECLARE indexname nvarchar(258);DECLARE partitionnum bi…

DTrace memory leak 内存泄露
http://blog.sina.com.cn/s/blog_538040b70100eecn.html如下程序用于跟踪,在分配和回收都会触发探针 #!/usr/sbin/dtrace -s pid$target:libc:malloc:entry{ self->trace 1; self->size arg0;}pid$target:libc:malloc:return/self->trace 1/{ …

Spark的安装和使用
Spark2.1.0入门:Spark的安装和使用 Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0(2.7.1)/Ubuntu14.04(16.04) 手把手教你在VirtualBox中与主机共享文件夹

SQL Server 2005系列教学(6) 多表操作及子查询
多表查询;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />人事表: 公司表:姓名性别年龄姓名公司地址张三男25李四女25张三新…

(点)分治学习笔记
哗我看了一下好像没有很详细专门讲分治的blog?那就主要先学一下点分治吧,其他的……等我记得把C一本通带到机房来再说吧先咕着啦 写在前面 刷题进度 入门题(0/3) 好题(0/9) 问题解决进度 Q1 Q2 正文 淀粉质 点分治 点分治就是在一…

十五个步骤收获学习的习惯
"真正的发现的航程,并非是在寻找新的土地,而且用新的视界去寻找"--普鲁斯特 "智慧日进者方值得尊敬。"-林肯 "我从不让我在学校所学的干扰我的教育"-马克吐温 如果公立学校尚未摧残你的灵魂,那么学习是一项极佳的活动。它…

熟悉scala命令,scala语言运行超级素数和猴子大王
实验目的 在Linux操作系统中安装Scala输入“scala”命令,熟悉地运行Scala解释器scala语言运行超级素数和猴子大王实验仪器 Virtualbox管理器 实验框图(电路图/流程图) 在Windows中使用VirtualBox安装Ubuntu,安装好scala后…

安装mayavi和VTK库的血泪史
一开始安装VTK库是从官网上下载,但是怎么都找不到whl文件,只有exe文件(vtkpython-7.1.1-Windows-64bit.exe)。下载安装之后再PyCharm中import vtk出错。当时认为是文件出错。后来在一篇博客(Python下VTK 编程 - lj6952…

Python LEGB (Local, Enclosing, Global, Build in) 规则
1 Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性2 Global 一个 module 定义了一个 global 作用域; PyFrameObject 中的 f_global 属性.3 BuiltIn open, dir 的作用域等等, python 最顶层的作用…

图解DotNet框架系列
图解.Net框架系列(索引贴) (声明:本系列已完成,故索引帖重发) 众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文…

【Linux基础】文件处理实例
1.文件拆分 //每4000行拆分一个文件 split -l 4000 epms_t_ep_fx_stl_xy_20190129.dat 2.行处理 //查找第二列为711611且第三列为711100记录,打印行号和整行数据 awk -F ‘^C’ {if ($3711100 && $2711611) print NR,$0 } epms_t_ep_fx_stl_xy_20190229.d…

scala语言运行递归“分鱼”程序
A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 B 第二个醒来,也将鱼分…