• SSH多表操作入门


    这个系统写到这里,所涉及到的都是单表的操作,增删改查,现在功能需要完善,涉及到多表操作,开始是毫无头绪,书上的代码也没有现成的可以借鉴,想来就从最简单的开始。问题出现了很多,不过最后在龙哥的提示下还是实现了,现在把完整过程列出来。

    目的很简单:班级表中的一个班级删除或更新后,学生表中对应的学生记录被删除或学生对应的班级信息得到更新。

    1.数据表

    第一个是班级表(本来想叫class,在程序中与关键字冲突,改为c后,也一直报错,最后改为ce)

    ce

    第二个是学生表

    se

    这里ce表中cname为主键,se表中sid为主键,cname为外键。

    然后在se表中进行外键关联(这里要注意的是,表建立以后要把表的类型类型改为InnoDB,否则它会提示不支持外键操作):

    下面的框框默认为无动作,这里要改成层叠,即级联操作(应该是),如不修改,则当你修改cname表中的数据时会提示无法修改,出错。

    上面的步骤完成后,当你修改或删除ce表中的cname时,se表中的cname也会更新或者对应的记录被删除。这个时候说明数据库已经成功建立。

    2.SSH框架代码

    把PO、DAO、Service、Action、applicationContext.xml、struts.xml、jsp的代码都写好,这里主要是PO层,其他都跟之前一致,只是在CeDAO中加一个“根据名称删除班级”的方法。

    Ce.java

     1 package po;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.GeneratedValue;
     6 import javax.persistence.GenerationType;
     7 import javax.persistence.Id;
     8 import javax.persistence.Table;
     9 
    10 @Entity
    11 @Table(name = "ce")
    12 public class Ce {
    13         @Id @Column(name="cname")
    14         @GeneratedValue(strategy = GenerationType.AUTO)
    15         private String cname;
    16 
    17         public String getCname() {
    18             return cname;
    19         }
    20         public void setCname(String cname) {
    21             this.cname = cname;
    22         }
    23 }

    Se.java

     1 package po;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.GeneratedValue;
     6 import javax.persistence.GenerationType;
     7 import javax.persistence.Id;
     8 import javax.persistence.JoinColumn;
     9 import javax.persistence.ManyToOne;
    10 import javax.persistence.Table;
    11 
    12 import org.hibernate.annotations.Cascade;
    13 import org.hibernate.annotations.CascadeType;
    14 
    15 @Entity
    16 @Table(name = "se")
    17 public class Se {
    18     @Id @Column(name="sid")
    19     @GeneratedValue(strategy = GenerationType.AUTO)
    20     private String sid;
    21 
    22     @Column(name="sname")
    23     private String sname;
    24 
    25     @ManyToOne(targetEntity=Ce.class)
    26     @JoinColumn(name="cname")
    27     @Cascade(CascadeType.ALL)
    28     private Ce ce;
    29     
    30     public String getSid() {
    31         return sid;
    32     }
    33 
    34     public void setSid(String sid) {
    35         this.sid = sid;
    36     }
    37 
    38     public String getSname() {
    39         return sname;
    40     }
    41 
    42     public void setSname(String sname) {
    43         this.sname = sname;
    44     }
    45 
    46     public Ce getCe() {
    47         return ce;
    48     }
    49 
    50     public void setCe(Ce ce) {
    51         this.ce = ce;
    52     }
    53 }

    这里要注意两点:

    1. 3个注解缺一不可,特别是级联操作的第三个

    2. jsp中对于se表第三个属性的显示

     

    其他代码部分省略。。。

    结果(视频放不了。。。):

     

     大功告成!

     本文系原创,转载请注明出处,谢谢。

  • 相关阅读:
    Vue 中动态添加class(使用v-bind:class)
    Vue 过滤器的使用
    Huxley 是一个用于Web应用 UI 测试的工具
    showmessage函数里
    [Php] PHPExcel读取Excel文件(或来自客户端上传的)并返回二维数组
    async-validator -- git地址
    Antd Upload组件上传文件至php后端, php拿到对应的文件名(二: vue实现)
    Antd Upload组件上传文件至php后端, php拿到对应的文件名
    对数据库中一个timestamp类型字段时间上作加减
    小学生作文怎么辅导?
  • 原文地址:https://www.cnblogs.com/qintang/p/8511213.html
Copyright © 2020-2023  润新知