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输出效果

猜你喜欢

转载自blog.csdn.net/Charles_Yeoung/article/details/82502138