金刀的博客 | JDBC 查询操作

JDBC操作数据库 查询(Read)操作

0x01 引言

在上一篇的文章中,已简单说明了什么是JDBC,什么是CRUD操作。以及Java怎么通过JDBC向数据库插入数据的操作。传送门:JDBC操作数据库 Create操作总结

0x02 程序运行环境

  • 环境
    • 开发平台:Eclipse
    • 数据库:Oracle 11g
    • 数据库连接驱动:odbc6

0x03 JDBC操作数据库的基本步骤

  1. 注册数据库驱动程序;
  2. 建立数据库连接;
  3. 定义操作的SQL语句;
  4. 创建数据库操作对象;
  5. 执行SQL操作;
  6. 获取并处理结果集;
  7. 关闭对象,对数据库的操作资源进行回收(关闭对象资源),资源包括(结果集对象ResultSet,数据库操作对象PreparedStatement,数据库连接对象Connection);

0x04 单张表的查询操作

  • 表结构

    • person表

      CREATE TABLE person
      (
      	p_id NUMBER,			-- 编号
      	p_name VARCHAR2(200),	-- 名字
      	p_address VARCHAR2(200),-- 地址
      	p_phone VARCHAR2(50)	-- 联系方式
      );
      
      -- 创建person表的序列
      CREATE SEQUENCE person_sequence START WITH 1;
      
      -- 插入测试数据
      INSERT INTO person(p_id,p_name,p_address,p_phone) VALUES(person_sequence.nextval,'Jenny','中国光谷','13456673456');
      INSERT INTO person(p_id,p_name,p_address,p_phone) VALUES(person_sequence.nextval,'Tom','中国光谷','13456673456');
      INSERT INTO person(p_id,p_name,p_address,p_phone) VALUES(person_sequence.nextval,'Join','中国光谷','13456673456');
      INSERT INTO person(p_id,p_name,p_address,p_phone) VALUES(person_sequence.nextval,'Lucy','中国光谷','13456673456');
      INSERT INTO person(p_id,p_name,p_address,p_phone) VALUES(person_sequence.nextval,'Charles','中国光谷','13456673456');
      
      -- 提交事务
      COMMIT;
      
      -- 查询person表
      COL p_name FOR A10;
      COL p_address FOR A10;
      COL p_phone FOR A20;
      SELECT * FROM person;
      
    • person表记录

      (注意:在插入完成以后,数据是在内存中的,只有在事务提交(COMMIT)以后,数据才会写入到数据库中)

  • 单张表的JDBC查询操作

    • 步骤:

      1. 创建数据库连接类(DBHelper)
      2. 创建person表实体类(PersonEntity)
      3. 创建测试类(Test),用于编写查询方法,主方法(main)用于测试查询方法
    • Coding:

      • DBHelper

        package com.hopu.util;
        
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        
        /*
         * 数据库连接类
         */
        public class DBHelper {
            // 定义连接对象
            private static Connection conn = null;
            // 定义操作对象
        
            /**
             * 获取数据库连接的方法
             * @return  Connection连接对象
             */
            public static Connection getConnection() {
                // 定义驱动信息
                final String DRIVER = "oracle.jdbc.driver.OracleDriver";
                /*
                 * jdbc:表示采用jdbc方式连接数据库
                 * oracle:表示连接的是Oracle数据库
                 * thin:表示连接时采用thin模式
                 * @192.168.1.19表示目标数据库服务所在的网络位置
                 * 1521:端口号,Oracle服务默认端口1521
                 * orcl:数据库实例名称
                 */
                final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
                final String USER = "scott";        // 数据库登录用户名
                final String PASSWORD = "tiger";    // 数据库登录密码
                try {
                    // 注册驱动
                    Class.forName(DRIVER);
                    conn = DriverManager.getConnection(URL, USER, PASSWORD);
                } catch (Exception e) {
        
                }
                return conn;
            }
        
            /**
             * 关闭数据库资源
             * @param conn  数据库连接对象
             * @param pstm  数据库操作对象
             * @param rs    结果集对象
             */
            public static void closeConnection(Connection conn,PreparedStatement pstm,ResultSet rs) {
                try {
                    if(rs!=null) {
                        rs.close();
                    }
                    if(pstm!=null) {
                        pstm.close();
                    }
                    if(conn!=null) {
                        conn.close();
                    }
                } catch (Exception e) {
        
                }
            }
        
            /**
             * 测试数据库连接是否成功
             * @param args
             */
            public static void main(String[] args) {
                Connection connection = DBHelper.getConnection();
                if(connection!=null){
                    System.out.println("数据库连接成功!");
                }else{
                    System.out.println("数据库连接失败!");
                }
            }
        }
        
      • personEntity

        package com.hopu.entity;
        /**
         * person表实体类
         * @author Administrator
         */
        public class PersonEntity {
        	private Integer p_pid;	// 编号
        	private String p_name;	// 名字
        	private String p_address;	// 地址
        	private String p_phone;	// 联系方式
        	public Integer getP_pid() {
        		return p_pid;
        	}
        	public void setP_pid(Integer p_pid) {
        		this.p_pid = p_pid;
        	}
        	public String getP_name() {
        		return p_name;
        	}
        	public void setP_name(String p_name) {
        		this.p_name = p_name;
        	}
        	public String getP_address() {
        		return p_address;
        	}
        	public void setP_address(String p_address) {
        		this.p_address = p_address;
        	}
        	public String getP_phone() {
        		return p_phone;
        	}
        	public void setP_phone(String p_phone) {
        		this.p_phone = p_phone;
        	}
        }
        
        
      • Test类

        package com.hopu.util;
        
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.ArrayList;
        import java.util.List;
        
        import com.hopu.entity.PersonEntity;
        
        /**
         * 测试类
         * @author Administrator
         */
        public class Test {
        	// 定义数据库连接对象
        	private Connection conn = null;
        	// 定义数据库操作对象
        	private PreparedStatement pstm = null;
        	// 定义结果集对象
        	private ResultSet rs = null;
        	
        	/**
        	 * 查询Person表所有信息记录
        	 * @return	person表的信息集合
        	 * @throws SQLException
        	 */
        	public List<PersonEntity> getPersonInfo() throws SQLException{
        		// 声明并实例化ArrayList对象集合
        		List<PersonEntity> personInfo = new ArrayList<PersonEntity>();
        		// 获取 数据库连接对象
        		conn = DBHelper.getConnection();
        		// 定义SQL查询语句
        		final String QUERY = "SELECT p_id,p_name,p_address,p_phone FROM person";
        		// 获取数据库操作对象
        		pstm = conn.prepareStatement(QUERY);
        		// 执行查询语句 将返回的结果集赋值给rs
        		rs = pstm.executeQuery();
        		while(rs.next()){	// 如果有数据, 则可以执行
        			// 从ResultSet结果集中循环取出数据 用变量接受
        			Integer id = rs.getInt("p_id");
        			String name = rs.getString("p_name");
        			String address = rs.getString("p_address");
        			String phone = rs.getString("p_phone");
        			// 实例化person实体对象
        			PersonEntity person = new PersonEntity();
        			person.setP_pid(id);
        			person.setP_name(name);
        			person.setP_address(address);
        			person.setP_phone(phone);
        			personInfo.add(person);
        		}
        		return personInfo;
        	}
        	
        	// 测试查询方法
        	public static void main(String[] args) throws Exception {
        		Test test = new Test();
        		List<PersonEntity> personInfo = test.getPersonInfo();
        		for (PersonEntity per : personInfo) {
        			System.out.println(per.getP_pid()+" "+per.getP_name()+" "+
        								per.getP_address()+" "+per.getP_phone());
        		}
        	}
        }
        
        
    • Console输出效果

0x05 多表的查询操作

多表的查询操作与单表的查询操作,是极为相似的,唯一的区别是SQL查询语句的不同。

  • 数据表结构

    • 班级信息表

      -- 删除班级信息表(不经过回收站)
      DROP TABLE classInfo PURGE;
      
      --创建班级信息表
      CREATE TABLE classInfo
      (
        classId INT NOT NULL PRIMARY KEY, -- 班级编号
        className VARCHAR(40) NOT NULL, -- 班级名称
        classDate DATE DEFAULT SYSDATE NOT NULL,  -- 班级创建时间
        classNote VARCHAR(200)  -- 班级备注
      );
      
      -- 插入班级信息表测试数据
      INSERT INTO classInfo(classId,className,classDate,classNote) VALUES(100,'401班',DEFAULT,'401班');
      INSERT INTO classInfo(classId,className,classDate,classNote) VALUES(101,'402班',DEFAULT,'402班');
      INSERT INTO classInfo(classId,className,classDate,classNote) VALUES(102,'403班',DEFAULT,'403班');
      INSERT INTO classInfo(classId,className,classDate,classNote) VALUES(103,'404班',DEFAULT,'404班');
      INSERT INTO classInfo(classId,className,classDate,classNote) VALUES(104,'405班',DEFAULT,'405班');
      
      -- 提交事务
      COMMIT;
      
    • 学生信息表

      -- 删除学生信息表(不经过回收站)
      DROP TABLE student PURGE;
      
      -- 创建班级信息表
      CREATE TABLE Student
      (
        stuId NUMBER NOT NULL  PRIMARY KEY,  -- 学生编号
        stuName VARCHAR(20) NOT NULL, -- 学生姓名
        stuSex  VARCHAR(4)  NOT NULL, -- 学生性别
        stuAddress  VARCHAR(100), -- 学生住址
        classId INT REFERENCES classInfo(classId)-- 学生所在班级(引用班级信息表 班级编号)
      );
      -- 创建学生信息表索引
      CREATE SEQUENCE sequence_student;
      
      -- 插入学生信息表测试数据
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'刘备','男','中国光谷',100);
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'张飞','男','中国光谷',100);
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'关羽','男','中国光谷',100);
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'曹操','男','中国光谷',100);
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'孙权','男','中国光谷',104);
      INSERT INTO Student(stuId,stuName,stuSex,stuAddress,classId) VALUES(sequence_student.nextval,'王昭君','女','中国光谷',103);
      
      -- 提交事务
      COMMIT;
      
    • 查询班级信息表和学生信息表记录

      SELECT * FROM classinfo;
      COL stuname FOR A10;
      COL stuaddress FOR A10;
      SELECT * FROM student;
      

  • JDBC实现多表查询操作处理

    • Coding
      • DBHelper

        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        
        /*
         * 数据库连接类
         */
        public class DBHelper {
        	// 定义连接对象
        	private static Connection conn = null;
        	
        	/**
        	 * 获取数据库连接的方法
        	 * @return	Connection连接对象
        	 */
        	public static Connection getConnection() {
        		// 定义驱动信息
        		final String DRIVER = "oracle.jdbc.driver.OracleDriver";
        		/*
        		 * jdbc:表示采用jdbc方式连接数据库
        		 * oracle:表示连接的是Oracle数据库
        		 * thin:表示连接时采用thin模式
        		 * @192.168.1.19表示目标数据库服务所在的网络位置
        		 * 1521:端口号,Oracle服务默认端口1521
        		 * orcl:数据库实例名称
        		 */
        		final String URL = "jdbc:oracle:thin:@192.168.1.19:1521:orcl";
        		final String USER = "scott";		// 数据库登录用户名
        		final String PASSWORD = "tiger";	// 数据库登录密码
        		try {
        			// 注册驱动
        			Class.forName(DRIVER);
        			conn = DriverManager.getConnection(URL, USER, PASSWORD);
        		} catch (Exception e) {}
        		return conn;
        	}
        	
        	/**
        	 * 关闭数据库资源
        	 * @param conn	数据库连接对象
        	 * @param pstm	数据库操作对象
        	 * @param rs	结果集对象
        	 */
        	public static void closeConnection(Connection conn,PreparedStatement pstm,ResultSet rs) {
        		try {
        			if(rs!=null) {
        				rs.close();
        			}
        			if(pstm!=null) {
        				pstm.close();
        			}
        			if(conn!=null) {
        				conn.close();
        			}
        		} catch (Exception e) {
        			
        		}
        	}
        	
        	/**
        	 * 测试数据库连接是否成功
        	 * @param args
        	 */
        	public static void main(String[] args) {
        		Connection conn = DBHelper.getConnection();
        		if(conn!=null)
        			System.out.println("数据库连接成功!");
        		else
        			System.out.println("数据库连接失败!");
        	}
        }
        
        
      • ClassInfoEntity

        import java.util.Date;
        
        /**
         * 班级信息表实体对象
         * @author Mr. Yang
         */
        
        public class ClassInfoEntity {
        	private Integer classId;	// 班级编号
        	private String className;	// 班级名称
        	private Date classDate;		// 创建时间
        	private String classNote;	// 班级备注
        	public Integer getClassId() {
        		return classId;
        	}
        	public void setClassId(Integer classId) {
        		this.classId = classId;
        	}
        	public String getClassName() {
        		return className;
        	}
        	public void setClassName(String className) {
        		this.className = className;
        	}
        	public Date getClassDate() {
        		return classDate;
        	}
        	public void setClassDate(Date classDate) {
        		this.classDate = classDate;
        	}
        	public String getClassNote() {
        		return classNote;
        	}
        	public void setClassNote(String classNote) {
        		this.classNote = classNote;
        	}
        	
        }
        
        
      • StudentEntity

        /**
         * 学生信息表实体对象
         * @author Mr. Yang
         */
        public class StudentEntity {
        	private Integer stuId;	// 学生编号
        	private String stuName;	// 学生姓名
        	private String stuSex;	// 学生性别
        	private String stuAddress;	// 学生地址
        	private ClassInfoEntity classinfo;	// 班级信息对象
        	public Integer getStuId() {
        		return stuId;
        	}
        	public void setStuId(Integer stuId) {
        		this.stuId = stuId;
        	}
        	public String getStuName() {
        		return stuName;
        	}
        	public void setStuName(String stuName) {
        		this.stuName = stuName;
        	}
        	public String getStuSex() {
        		return stuSex;
        	}
        	public void setStuSex(String stuSex) {
        		this.stuSex = stuSex;
        	}
        	public String getStuAddress() {
        		return stuAddress;
        	}
        	public void setStuAddress(String stuAddress) {
        		this.stuAddress = stuAddress;
        	}
        	public ClassInfoEntity getClassinfo() {
        		return classinfo;
        	}
        	public void setClassinfo(ClassInfoEntity classinfo) {
        		this.classinfo = classinfo;
        	}
        	
        }
        
        
      • Test

        import java.util.ArrayList;
        import java.util.List;
        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.Date;
        
        /**
         * 测试类
         * @author Mr. Yang
         *
         */
        public class Test{
        	private Connection conn = null;
        	private PreparedStatement pstm = null;
        	private ResultSet rs = null;
        	public List<StudentEntity> getInformation(){
        		// 实例化ArrayList集合对象
        		List<StudentEntity> student = new ArrayList<StudentEntity>();
        		try {
        			// 获取数据库连接对象
        			conn = DBHelper.getConnection();
        			// 定义查询的SQL语句
        			final String QUERY_SQL = "SELECT stu.stuid,stu.stuname,stu.stusex,stu.stuaddress,info.classname,info.classdate,info.classnote FROM student stu,classinfo info WHERE stu.classid=info.classid(+)";
        			pstm = conn.prepareStatement(QUERY_SQL);
        			rs = pstm.executeQuery();
        			while(rs.next()) {	// 如果有数据,则继续执行
        				Integer stuid = rs.getInt("stuid");				// 学生编号
        				String stuname = rs.getString("stuname");		// 学生姓名
        				String stusex = rs.getString("stusex");			// 学生性别
        				String stuaddress = rs.getString("stuaddress");	// 学生地址
        				String classname = rs.getString("classname");	// 班级名称
        				Date classdate = rs.getDate("classdate");		// 创建日期
        				String classnote = rs.getString("classnote");	// 班级备注
        				ClassInfoEntity info = new ClassInfoEntity();
        				info.setClassName(classname);
        				info.setClassDate(classdate);
        				info.setClassNote(classnote);
        				StudentEntity stu = new StudentEntity();
        				stu.setStuId(stuid);
        				stu.setStuName(stuname);
        				stu.setStuSex(stusex);
        				stu.setStuAddress(stuaddress);
        				stu.setClassinfo(info);
        				student.add(stu);
        			}
        		} catch (SQLException e) {
        			e.printStackTrace();
        		} finally {
        			DBHelper.closeConnection(conn, pstm, rs);
        		}
        		return student;
        	}
        	
        	public static void main(String[] args) {
        		Test test = new Test();
        		List<StudentEntity> information = test.getInformation();
        		for (StudentEntity student : information) {
        			System.out.println(student.getStuId()+" "+student.getStuName()+" "+student.getStuSex()+" "+student.getStuAddress()+" "+
        								student.getClassinfo().getClassName()+" "+student.getClassinfo().getClassDate()+" "+student.getClassinfo().getClassNote());
        		}
        	}
        }
        
        
  • Console输出效果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值