JDBC操作数据库 查询(Read)操作
0x01 引言
在上一篇的文章中,已简单说明了什么是JDBC,什么是CRUD操作。以及Java怎么通过JDBC向数据库插入数据的操作。传送门:JDBC操作数据库 Create操作总结
0x02 程序运行环境
- 环境
- 开发平台:Eclipse
- 数据库:Oracle 11g
- 数据库连接驱动:odbc6
0x03 JDBC操作数据库的基本步骤
- 注册数据库驱动程序;
- 建立数据库连接;
- 定义操作的SQL语句;
- 创建数据库操作对象;
- 执行SQL操作;
- 获取并处理结果集;
- 关闭对象,对数据库的操作资源进行回收(关闭对象资源),资源包括(结果集对象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查询操作
-
步骤:
- 创建数据库连接类(DBHelper)
- 创建person表实体类(PersonEntity)
- 创建测试类(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()); } } }
-
- Coding
-
Console输出效果