SQL游标的优点是可以方便从一个结果集中进行循环遍历数据在进行 *** 作。
1、游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的 *** 作,而不是一次对整个结果集进行同一种 *** 作;
2、它还提供对基于游标位置而对表中数据进行删除或更新的能力;
3、游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
在Java中,获得ResultSet的总行数的方法有以下几种。第一种:利用ResultSet的getRow方法来获得ResultSet的总行数
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE)
ResultSet rset = stmt.executeQuery("select * from yourTableName")
rset.last()
int rowCount = rset.getRow()//获得ResultSet的总行数
第二种:利用循环ResultSet的元素来获得ResultSet的总行数
ResultSet rset = stmt.executeQuery("select * from yourTableName")
int rowCount = 0
while(rset.next()) {
rowCount++}rowCount就是ResultSet的总行数。
第三种:利用sql语句中的count函数获得ResultSet的总行数
ResultSet rset = stmt.executeQuery("select count(*) totalCount from yourTableName")
int rowCount = 0
if(rset.next()) {
rowCount=rset .getInt("totalCount ")}rowCount就是ResultSet的总行数。
我设计了一个思想并实现运行成功:设计思想:
把数据库表中数据全部查出。每一个数据为一个结点,比如说楼主表的A,B字段中共有数据a、b、c、d、e,则这5个数据为5个结点。创建一个双向图表示节点间的关系。比如说楼主提供的数据的双向图为a<--->b<--->c<--->d<--->e,在我的程序中表现为一个结点类的集合。求结果的时候只要求从指定节点能够到达的节点集合就可以了。
求结果时使用递归调用,原理是:求结点a能到达的节点=求结点a关联节点能到达的节点。
程序运行结果:
数据库数据:
+------+------+
| A| B|
+------+------+
| a| c|
| a| d|
| b| e|
| e| f|
+------+------+
result[a]=[a, c, d]
result[c]=[c, a, d]
result[e]=[e, b, f]
更改数据库数据,添加a和e的关联:
mysql>select * from aaa
+------+------+
| A| B|
+------+------+
| a| c|
| a| d|
| b| e|
| e| f|
| e| a|
+------+------+
5 rows in set (0.00 sec)
result[a]=[a, c, d, e, b, f, a]
从这个结果看出第一个数据库数据a c d和 b e f是独立的两块,建立了a e的关联后,成了一个整体的块,因此从a节点能到达所有节点。
程序代码:
本程序是使用的Mysql数据库,使用时请导入Mysql数据库驱动。创建TestJdbc.java复制代码进来直接运行。
如有错误或者疑问请联系QQ232319792或者1988-2@163.com或者直接发百度信息(别用baiduHi)
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.Statement
import java.util.ArrayList
import java.util.List
public class TestJdbc {
public static List<String>result=new ArrayList<String>()
public static void main(String args[]) throws Exception{
select("a")
System.out.println(result)
}
public static void select(String who) throws Exception{
List<Node>nodes=createMap()//获取节点图
Node thisNode=null
for(Node n:nodes)//从节点图中获取开始节点
if(n.getName().equals(who))thisNode=n
digui(thisNode,null)//递归调用,假设开始节点的父亲是空的。
}
public static void digui(Node star,Node father){
result.add(star.getName())//把本次开始节点加入结果集合
//遍历开始节点的关联节点集合
for(Node n:star.getSons()){
if(father!=null &&n.equals(father))
//该关联节点是开始节点的父亲节点,那么跳过
//当一个关联节点仅有一个关联节点即他的父亲,那么递归结束
continue
father=star//递归前设置父亲节点为本次开始节点
digui(n,father)//递归调用
}
}
public static List<Node>createMap() throws Exception{
List<Node>nodes=new ArrayList<Node>()//创建节点集合保存节电双向集合
//以下链接mysql数据库并把所有数据查询出来
String driverName="com.mysql.jdbc.Driver"
Class.forName(driverName)
String url="jdbc:mysql://127.0.0.1:3306/jdbc"
String username="root"
String pwd="root"
Connection con=null
con=DriverManager.getConnection(url,username,pwd)
Statement stmt = con.createStatement()
ResultSet rs = stmt.executeQuery("select * from aaa")
//创建节点引用,保存一条记录中的两个字段值
Node temp1=null
Node temp2=null
//遍历每条记录
while(rs.next()){
temp1=new Node(rs.getString(1))//创建节点
temp2=new Node(rs.getString(2))
temp1.getSons().add(temp2)//设置节点间关联
temp2.getSons().add(temp1)//设置节点间关联
if(nodes.indexOf(temp1)==-1)//如果A字段节点在节点图中不存在,则加入到节点图中
nodes.add(temp1)
else{//如果A字段节点在节点图中存在了
//得到已经存在的那个节点,并把B字段节点关联给他。
nodes.get(nodes.indexOf(temp1)).getSons().add(temp2)
temp1=nodes.get(nodes.indexOf(temp1))
//B字段节点关联的节点是已经存在的了,因此要更改关联对象。更改成已经存在的节点而不是new出来的。
temp2.getSons().clear()
temp2.getSons().add(nodes.get(nodes.indexOf(temp1)))
}
if(nodes.indexOf(temp2)==-1)
//如果B字段节点在节点图中不存在直接加入节点图
nodes.add(temp2)
else{
//否则,要重新关联。
nodes.get(nodes.indexOf(temp2)).getSons().add(temp1)
}
}
return nodes
}
}
//构造节点类
class Node{
private String name//节点值
private List<Node>sons=new ArrayList<Node>()//节点关联节点集合
public Node(String name){
this.name=name
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
public List<Node>getSons() {
return sons
}
public void setSons(List<Node>sons) {
this.sons = sons
}
@Override
public String toString() {
return name+" "
}
@Override
public boolean equals(Object obj) {
return name.equals(((Node)obj).getName())
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)