mybatis多对一映射关系

        有时候在对数据库操作的时候,需要用到表之间的关系。多对一,一对多。一对一,多对多。今天我们来使用mybatis实现多对一。

首先创建两张表depe(部门表),emp(员工表)

CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL AUTO_INCREMENT,
  `deptname` varchar(255) NOT NULL,
  `loc` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) 
CREATE TABLE `emp` (
  `empno` int(11) NOT NULL AUTO_INCREMENT,
  `empname` varchar(30) NOT NULL,
  `job` varchar(50) NOT NULL,
  `mgr` int(11) NOT NULL,
  `hiredate` datetime DEFAULT NULL,
  `sal` int(11) DEFAULT NULL,
  `comm` int(11) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `fk_dept` (`deptno`),
  CONSTRAINT `fk_dept` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`)
) 

表之间的关系

mybatis多对一映射关系_第1张图片

然后在IDEA中使用mybatis插件自动生成pojo层和dao层以及对应的mapper文件,可以参考mybatis-generator插件的使用 。自动生成后的效果。

mybatis多对一映射关系_第2张图片

分析:在emp(员工)和dept(部门)这两个表中,多个员工可以对应一个部门,一个部门可以对应多个员工。所以员工表对部门表,就像对于多对一。

多对一的实现:在多的一方添加一的一方的对象

Emp实体类,只截取了属性。

    private Integer empno;
    private String empname;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Integer sal;
    private Integer comm;
//    private Integer deptno;
    private Dept dept;//一的一方的对象

可以看到,我把Emp自动生成的deptno(部门编号)给去掉了,因为Dept中也有个deptno,去掉是为了避免冲突。或者在Emp类中将deptno改成别的,mapper文件也需要和你修改后的一一对应。如果你两张表的主键和外键不同名,只需加一的一方的属性。我的重名了,所以选择直接去掉了。

Dept实体类不用做任何修改

修改EmpMapper.xml文件,实现多对一

  
        
        
        
        
        
        
        
        
        
            
            
            
        
    

在mapper文件中我也把自带的deptno属性给去掉了,与Emp对应。association标签中property属性值为Emp中多的一方(Dept)的对象名,javaType属性值为多的一方类的完整限定名。

修改部分增删该查的语句,一对多的目的就是操作两张表。

两表查询

  

添加数据

    
        insert into emp
        
            
                empno,
            
            
                empname,
            
            
                job,
            
            
                mgr,
            
            
                hiredate,
            
            
                sal,
            
            
                comm,
            
            
                deptno,
            
        
        
            
                #{empno,jdbcType=INTEGER},
            
            
                #{empname,jdbcType=VARCHAR},
            
            
                #{job,jdbcType=VARCHAR},
            
            
                #{mgr,jdbcType=INTEGER},
            
            
                #{hiredate,jdbcType=TIMESTAMP},
            
            
                #{sal,jdbcType=INTEGER},
            
            
                #{comm,jdbcType=INTEGER},
            
            
                #{dept.deptno,jdbcType=INTEGER},
            
        
    

修改

    
        update emp
        
            
                empname = #{empname,jdbcType=VARCHAR},
            
            
                job = #{job,jdbcType=VARCHAR},
            
            
                mgr = #{mgr,jdbcType=INTEGER},
            
            
                hiredate = #{hiredate,jdbcType=TIMESTAMP},
            
            
                sal = #{sal,jdbcType=INTEGER},
            
            
                comm = #{comm,jdbcType=INTEGER},
            
            
                deptno = #{dept.deptno,jdbcType=INTEGER},
            
        
        where empno = #{empno,jdbcType=INTEGER}
    

批量删除

在dao层添加 int daleteAll(Integer array[]);实现批量删除

 
    
        delete from emp
        where empno in
        
            #{id}
        
    

以上只列出了部分修改 。在添加多对一后,mapper文件中之间传入depeno都要改成dept.deptno,语句中出现的deptno不需要修改,原因还是因为实现多对一后,我的Dept类中没有deptno属性,只能用一的一方(Dept)中的deptno代替,所以要使用dept.deptno。

 

      每日鸡汤:“不要让别人告诉你,你不能做什么。 只要有梦想,就要去追求。 那些做不到的人总要告诉你,你也不行。 想要

什么就得去努力,去追求。 ——《当幸福来敲门》“

 

Over!

你可能感兴趣的:(JavaEE)