Java复习笔记17【JDBC查询1】

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);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值