package com.lesson12.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
/*
* 学会封装查询代码,了解结构化结果集
* */
/*
* 基本概念
* 1.【ResultSet】结果集
* (1)关于某个表的信息或一个查询的结果集合。
* (2)必须逐行访问数据行,但是可以任何顺序访问列。
* 2.【ResultSetMetaData】结果集结构
* (1)有关ResultSet中列的名称和类型的信息。
* --------------------------------------------------
* 【注意】
* (1)ResultSet从本质上讲它是对一个一般宽度和未知长度的表的一种抽象。
* 几乎所有的方法和查询都将数据作为ResultSet返回。
* ResultSet包含任意数量的命名列,可以按名称访问这些列。
* 它还包含一个或多个行,可以按顺序自上而下逐一访问。
* <span style="white-space:pre"> </span>当获得一个 ResultSet 时,它正好指向第一行之前的位置。
* 使用 next()方法得到其他每一行,当没有更多行时,该方法会返回 false
* (2)ResultSetMetaData是JDBC提供一种的机制:可以通过sql语句
* 获取所要查询的字段信息。
* 结果集结构可以按列序号或列名获取列的内容,记录的列序号从 1开始,而不是从0开始。
* getMetaData()方法可从 ResultSet中获取 ResultSetMetaData对象。
* 可以使用此对象获得列的数目和类型以及每一列的名称。
*
* */
public class JDBCExample {
private Connection conn = null;
private Statement stmt = null;
private ResultSet res = null;
private ResultSetMetaData rsmd = null;
/*
* 阶段一:最基础的查询操作
* ---------------------------------
* 该方法只能查询指定表格中的确定字段,不具有通用性
* */
public void find1(String sql){
getConnection();
try {
res = stmt.executeQuery(sql);
while(res.next()){
int Sno = res.getInt("Sno");
String Sname = res.getString("Sname");
int age = res.getInt("age");
System.out.println("Sno:"+Sno+";Sname:"+Sname+";age:"+age);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
close();
}
}
/*
* 阶段二:提炼查询代码,使其能够查询不同的表格的不同字段
* ---------------------------------------
* 实现了读取不同table的功能,通过通过读取不同的sql语句
* 能够查询所需要的字段名和字段值
* ---------------------------------------
* 注意:查询不同table的某些字段时,只有table的名称和
* column(字段)不同
* */
public void find2(String sql){
getConnection();
try{
/*
* 方法:ResultSetMetaData getMetaData()
* 对象:ResultSet
* 参数:无
* 返回值:ResultSetMetaData 结果集结构
* */
res = stmt.executeQuery(sql);
ResultSetMetaData rsmd = res.getMetaData();
//rsmd中存储了ResultSet中列的信息
/*
* 方法:public int getColumnCount()
* 对象:ResultSetMetaData
* 参数:无
* 返回值:int 当前查询的字段总数
* ---------------------------------
* 方法:public String getColumnName(int index)
* 对象:ResultSetMetaData
* 参数:int index 查询字段的索引
* 返回值:String 字段名称
* */
//sql语句不同,得到的字段也不一定相同,所以需要确认记录中的字段数
int columnCount = rsmd.getColumnCount();
System.out.println("当前查询字段总数:"+columnCount);
while(res.next()){ //循环获取查询结果集中的记录
for(int i=1;i<=columnCount;i++){ //【注意】字段序号从1开始,而不是0
//通过for循环获取[当前next()指向的记录]所有字段
String columnName = rsmd.getColumnName(i);
System.out.print("第" + i + "个字段名是:"+columnName);
/*
* 通过ResultSet的getXXXX方法获取字段值,为了能够接收所有的值,使
* 用String类型统一接收所有类型的字段值(String可以自由转化其他类型)
* */
String columnValue = res.getString(columnName);
System.out.println(";该字段的值是:" + columnValue);
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
close();
}
}
/*
* 该方法用于连接数据库
* */
public void getConnection(){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3308/test";
conn = DriverManager.getConnection(url,"root","mysql");
stmt = conn.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}
/*
* 该方法用于关闭资源
* */
public void close(){
try{
if(res != null){ //关闭结果集
res.close();
}
if (stmt != null) { //关闭语句对象
stmt.close();
}
if(conn != null){ //关闭连接
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
JDBCExample je = new JDBCExample();
System.out.println("-------- 阶段一 只能查询指定表格 ---------");
String sql1 = "select * from student";
je.find1(sql1);
System.out.println("-------- 阶段二 能够查询不同表格的不同字段 ---------");
String sql2 = "select * from student";
je.find2(sql2);
//可指定查询字段
String sql3 = "select Sno,Sname from student";
je.find2(sql3);
}
}
Java复习笔记17【JDBC查询1】
最新推荐文章于 2024-06-28 18:39:41 发布