【2022/08/17】对象关系映射

对象关系映射

  1. 概念:
    对象关系映射 (Object Relational Mapping,简称 ORM,或 O/RM,或 O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。 从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
  2. 建立对象关系映射

一对多:
在一的一方,建立多的的一方的集合,由于考虑到集合中的对象必须是唯一的,所以通常会采用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 ;
  1. 实现数据的映射:
    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>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值