Java是面向对象的,关系数据库中的表的每一行代表一组数据且每一列数据含义相同。所以很容易就想到,Java中的一个对象可以对应到数据库表的一行元素,那么Java对象的每个属性就可以自然对应到数据库一行中的一列。
这样做是非常有意义的,因为最终要把数据库中的数据显示在网页上,还得先使用Java语言把数据库中的数据查询出来,然后放在Java对象里面,最后通过一些方式把Java对象里面的内容输出到网页上,是这么一个过程。
好的,如果是单独一张表,对应到一个Java类和对象,非常简单自然,本篇主要演示下多张表且表之间有关系的情况下,如何设计与使用Java类和对象。
首先准备三张表:学生信息表(student_info),班级信息表(class_info)和房间信息表(room_info) 。我们前提是这是一个小学哈,一个学生只属于一个班级,一个班级包含多个学生,一个班级固定在一个房间上下课。
OK,我们使用Navicat建立表后结构如下:
然后插入一些测试数据如下(可以先执行truncate student_info语句将之前测试的student_info表数据清空):
INSERT INTO `class_info` VALUES ('1', '一年级一班', '1');
INSERT INTO `class_info` VALUES ('2', '一年级二班', '2');
INSERT INTO `class_info` VALUES ('3', '三年级四班', '3');
INSERT INTO `room_info` VALUES ('1', '二楼201房间');
INSERT INTO `room_info` VALUES ('2', '二楼202房间');
INSERT INTO `room_info` VALUES ('3', '三楼301房间');
INSERT INTO `student_info` VALUES ('1', '张三', '1');
INSERT INTO `student_info` VALUES ('2', '李四', '1');
INSERT INTO `student_info` VALUES ('3', '赵柳', '2');
猫哥希望大家能看出来,张三和李四是一年级一班的,教室在二楼201房间。
OK,可以设计类了,本篇的所有类和代码还是在sql包下,同一个包下的类可以直接访问比较方便哈哈。
首先设计跟表对应的类StudentInfo、ClassInfo、RoomInfo。如下:
package sql;
public class StudentInfo {
private String studentId;
private String studentName;
private ClassInfo studentClass;//一个学生对应一个班级,所以此处直接写一个ClassInfo对象
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public ClassInfo getStudentClass() {
return studentClass;
}
public void setStudentClass(ClassInfo studentClass) {
this.studentClass = studentClass;
}
}
package sql;
import java.util.ArrayList;
public class ClassInfo {
private String classId;
private String className;
private ArrayList classStudents;//一个班级包含多个学生,所以此处使用一个StudentInfo类型的列表
private RoomInfo roomInfo;//一个班级对应一个房间,所以直接写一个RoomInfo对象
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public ArrayList getClassStudents() {
return classStudents;
}
public void setClassStudents(ArrayList classStudents) {
this.classStudents = classStudents;
}
public RoomInfo getRoomInfo() {
return roomInfo;
}
public void setRoomInfo(RoomInfo roomInfo) {
this.roomInfo = roomInfo;
}
}
package sql;
public class RoomInfo {
private String roomId;
private String roomName;
private ClassInfo classInfo;//一个房间对应一个班级
public String getRoomId() {
return roomId;
}
public void setRoomId(String roomId) {
this.roomId = roomId;
}
public String getRoomName() {
return roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
public ClassInfo getClassInfo() {
return classInfo;
}
public void setClassInfo(ClassInfo classInfo) {
this.classInfo = classInfo;
}
}
OK,我们需要对这三个表进行增删改查操作,所以定义一个接口如下:
package sql;
import java.util.List;
public interface ObjectOperation {//对象操作接口,用于执行数据库中对象对应表的增删改查操作
public List selectAll();//选取表中所有数据
public Object selectById(String id);//按id获取一条记录
public int add(Object obj);//添加数据
public int deleteById(String id);//按id删除一条记录
public int update(Object obj);//按obj对象的信息修改一条记录
}
最后我们实现一个具体的操作类及演示:
OK,其他类的设计也是如此,到此我们实现了数据库连接池的使用、数据库操作类的使用、数据库表对象化的增删改查操作。
但是,大家好像也发现了,现在的代码非常的冗余,其实每个StudentOperation操作类里面的内容都是一样的,无外乎增删改查,那么有什么办法可以精简我们的操作,以实现程序设计避免重复的基本原则,且听下回分解。