资讯专栏INFORMATION COLUMN

MyBatis 级联

genedna / 2491人阅读

摘要:数据库关系模型中有一对一一对多关系首先建立如下表继续用最经典的学生管理系统建表模型图如图所示学生表为中心学生证表和其为一对一关系学生表和课程表为一对多一对一关系因为上图中学生和学生关系为一对一关系由于是数据库的一对一关系那么对应的中也应该是

数据库关系模型中有一对一,一对多,关系,
首先建立如下表 继续用最经典的学生管理系统

建表

模型图如图所示

学生表为中心
学生证表和其为一对一关系
学生表和课程表为一对多

一对一关系

因为上图中,学生和学生关系为一对一关系.
由于是数据库的一对一关系,那么对应的bean中,也应该是一对一关系
举栗子的表为学生表和学生证表
其中学生证表的中的学生编号的外键为学生表的主键
那么在学生表的POJO对象中,应该有学生证表的POJO的映射.即

package com.ming.MyBatis.POJO;

/**
 * @author ming
 */
public class Student {
    private int uid;
    private String studentName;
    private String gender;
    private String studentIdNumber;
    private String remarks;
    private StudentCard studentCard;

    public void setStudentCard(StudentCard studentCard) {
        this.studentCard = studentCard;
    }

    public StudentCard getStudentCard() {
        return studentCard;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setStudentIdNumber(String studentIdNumber) {
        this.studentIdNumber = studentIdNumber;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public int getUid() {
        return uid;
    }

    public String getStudentName() {
        return studentName;
    }

    public String getGender() {
        return gender;
    }

    public String getStudentIdNumber() {
        return studentIdNumber;
    }

    public String getRemarks() {
        return remarks;
    }
}

对于card的POJO如下所示

package com.ming.MyBatis.POJO;


import java.util.Date;

/**
 * @author ming
 */
public class StudentCard {
    private int uid;
    private String studentNumber;
    private String birthplace;
    private Date dateOfIssue;
    private Date endDate;
    private String remarks;

    public void setUid(int uid) {
        this.uid = uid;
    }

    public void setStudentNumber(String studentNumber) {
        this.studentNumber = studentNumber;
    }

    public void setBirthplace(String birthplace) {
        this.birthplace = birthplace;
    }

    public void setDateOfIssue(Date dateOfIssue) {
        this.dateOfIssue = dateOfIssue;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

    public int getUid() {
        return uid;
    }

    public String getStudentNumber() {
        return studentNumber;
    }

    public String getBirthplace() {
        return birthplace;
    }

    public Date getDateOfIssue() {
        return dateOfIssue;
    }

    public Date getEndDate() {
        return endDate;
    }

    public String getRemarks() {
        return remarks;
    }
}

先增加StudentCard的配置


        
        
        
        
        
        
    

    

再增加Student的映射

    
        
        
        
        
        
        
        
    
    
    

可以看到当查询到studentCard的时候,将会调用com.ming.MyBatis.RoleMapper.findStudentSelfCardByStudentId sql语句的执行

对于数据展示层来说

<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="com.ming.Util.SqlSessionFactoryUtil" %>
<%@ page import="com.ming.MyBatis.RoleMapper" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="com.ming.MyBatis.POJO.Student" %>


Hello World!

<% long startTime = System.currentTimeMillis(); //获取开始时间 SqlSession sqlSession = null; List students = null; for(int i = 0; i < 10; i++) { try { sqlSession = SqlSessionFactoryUtil.openSqlSesion(); RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); students = roleMapper.getStudent(1); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } } } long endTime = System.currentTimeMillis(); //获取结束时间 %> <% Iterator iterator = students.iterator(); while(iterator.hasNext()){ %> <%=((Student)iterator.next()).getStudentCard().getEndDate()%> <% } %>
一对多

这个和上方同理,跳过

鉴别器

根据学生信息去关联男性或者女性的健康指标

两个类只需要继承同一个类,使用case语句即可.
跳过

性能问题

在使用级联的时候,会造成多条sql语句的执行,此时,使用延迟加载

一开始不使用sql语句,只有当使用了sql才去发送数据

在setting这里设置,可以降低sql语句的执行问题

    
        
    

一般情况下是层级加载,取消层级加载,使用aggressiveLazyLoading值设置为false即可

另一种

写原生sql 这个很简单,跳过

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74158.html

相关文章

  • Mybatis N+1问题解析

    摘要:问题解析因为热爱,所以拼搏。如何解决问题本身给出解决方案,就是延迟加载。延迟加载延迟加载会解决上述的问题,也就是在个级联表的情况下,只加载需求的数据库表数据。在特定的关联中,使用属性覆盖该内容的功能。 Mybatis N+1问题解析 因为热爱,所以拼搏。 --RuiDer 前导必备 Mybatis 数据库 级联 N+1问题?? N+1问题来源于数据库中常见的...

    qqlcbb 评论0 收藏0
  • 递归查询级联信息

    摘要:需求背景在很多场合,我们需要对表中的数据对递归查询。结果查询结果将会以对象返回,若有多条父依赖,将显示在的嵌套中。虽然在查询时,一次性获得了级联结构,后续解析仍然复杂。故长度最短为如果入栈次数太多,表明可能出现环形依赖。 1. 需求背景 在很多场合,我们需要对表中的数据对递归查询。如以下情况: 1. 菜单分类中,我们往往需要由一级菜单获得对应的子菜单。 id name pid ...

    pekonchan 评论0 收藏0
  • IntelliJ IDEA 18 周岁,吐血推进珍藏已久的必装插件

    摘要:代码规约扫描插件以今年年初发布的阿里巴巴开发规约为标准,作为的插件形式存在,检测代码中存在不规范得位置然后给予提示。 IntelliJ IDEA是目前最好最强最智能的Java IDE,前几天,他刚刚年满18岁。 showImg(https://segmentfault.com/img/remote/1460000017974611); 本文,给大家推荐几款我私藏已久的,自己经常使用的...

    赵春朋 评论0 收藏0
  • Hibernate【inverse和cascade属性】知识要点

    摘要:属性属性表示控制权是否转移控制权已转移当前一方没有控制权控制权没有转移当前一方有控制权属性,是在维护关联关系的时候起作用的。表的外键并没有数据结论如果设置控制反转即然后通过部门方维护关联关系。 Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移【当前一方没有控制权】 false:控制权没有转移【当前一方有控制权】 Inverse属性,是在维护关联...

    abson 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<