对象关系映射
- 概念:
对象关系映射 (Object Relational Mapping,简称 ORM,或 O/RM,或 O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。 从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 - 建立对象关系映射
一对多:
在一的一方,建立多的的一方的集合,由于考虑到集合中的对象必须是唯一的,所以通常会采用Set集合实现,由于一对多的查询方式较为复杂而且不利于维护,所以通常采用多对一的查询方式。
package com.csi.domain;
import java.io.Serializable;
import java.util.Set;
/**
* 年级信息表
*/
public class Grade implements Serializable {
private Integer gradeId ;
private String gradeName ;
private String gradeDesc ;
//一对多关系映射
private Set<Student> students ;
多对一:在多的一方,建立对一的一方的引用。
package com.csi.domain;
import java.io.Serializable;
import java.util.Date;
/**
* 学生信息表
*/
public class Student
implements Serializable {
private Integer studentNO ;
private String loginPwd ;
private String
studentName ;
private String sex ;
private String phone ;
private String address ;
private Date borndate ;
private String email ;
private String identityCard ;
//映射多对一的或者是一对一关系
private Grade grade ;
- 实现数据的映射:
StudentDaoImpl:
public class StudentDaoImpl extends JDBCUtils implements StudentDao {
@Override
public List<Student> list() throws SQLException {
final String SQL = "SELECT * FROM student s,grade g WHERE s.gradeId = g.gradeId";
Connection connection = this.getConnection();
PreparedStatement ps = connection.prepareStatement(SQL);
ResultSet rs = ps.executeQuery();
List<Student> students = new ArrayList<>();
while(rs.next()){
//建立学生信息
Student student = new Student();
student.setStudentNO(rs.getString("studentNO"));
student.setStudentName(rs.getString("studentName"));
student.setSex(rs.getString("sex"));
student.setGradeId(rs.getInt("gradeId"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setBorndate(rs.getDate("borndate"));
student.setEmail(rs.getString("email"));
student.setIdentityCard(rs.getString("identityCard"));
//建立年级信息
Grade grade = new Grade();
grade.setGradeName(rs.getString("gradeName"));
grade.setGradeDesc(rs.getString("gradeDesc"));
//建立学生与年级之间的映射关系
student.setGrade(grade);
students.add(student);
}
this.release(rs,ps,connection);
return students;
}
/**
* 通过学生表中的gradeId查询Grade对象,之后建立两者之间的关系
*/
@Override
public List<Student> list() throws SQLException {
final String SQL = "SELECT * FROM student" ;
Connection connection = this.getConnection();
PreparedStatement ps = connection.prepareStatement(SQL) ;
ResultSet rs = ps.executeQuery();
List<Student> students = new ArrayList<>() ;
while(rs.next()) {
//步骤1:需要建立学生信息
Student student = new Student() ;
student.setIdentityCard(rs.getString("IdentityCard"));
student.setStudentName(rs.getString("StudentName"));
student.setStudentNO(rs.getInt("StudentNO"));
student.setLoginPwd(rs.getString("LoginPwd"));
student.setAddress(rs.getString("Address"));
student.setPhone(rs.getString("Phone"));
student.setEmail(rs.getString("Email"));
student.setSex(rs.getString("sex"));
student.setBorndate(rs.getDate("Borndate"));
//步骤2:建立年级信息
GradeDao gradeDao = new GradeDaoImpl() ;
Grade grade = gradeDao.findById(rs.getInt("gradeId")) ;
//步骤3:建立学生与年级之间的映射关系
student.setGrade(grade);
students.add(student);
}
this.release(rs,ps,connection);
return students;
}
}
StudentServiceImpl:
public class StudentServiceImpl implements StudentService {
@Override
public List<Student> list() {
StudentDao studentDao = new StudentDaoImpl();
List<Student> list = null;
try {
list = studentDao.list();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return list;
}
}
ListController:
package com.csi.controller;
import com.csi.domain.Student;
import com.csi.service.StudentService;
import com.csi.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ListController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
StudentService studentService = new StudentServiceImpl();
List<Student> list = studentService.list();
req.setAttribute("list",list);
req.getRequestDispatcher("/list.jsp").forward(req,resp);
}
}
web.xml:
<servlet>
<servletname>ListController</servlet-name>
<servletclass>com.csi.controller.ListController</servlet-class>
</servlet>
<servlet-mapping>
<servletname>ListController</servlet-name>
<urlpattern>/ListController</url-pattern>
</servlet-mapping>
jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table width="100%" align="center">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>性别</td>
<td>年级</td>
<td>联系方式</td>
<td>操作</td>
</tr>
<c:forEach items="${list}" var="student">
<tr>
<td>${student.studentNO}</td>
<td>${student.studentName}</td>
<td>${student.sex}</td>
<td>${student.grade.gradeName}</td>
<td>${student.phone}</td>
<td>
<a href="DeleteController?id=${student.studentNO}">删除</a>
<a href="ShowListController?id=${student.studentNO}">查看详情</a>
<a href="ChangeListController?id=${student.studentNO}">修改</a>
</td>
</tr>
</c:forEach>
</table>
<a href="/newstudent.jsp">点此新增</a>
</body>
</html>