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`)
) 

表之间的关系

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

分析:在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文件,实现多对一

  <resultMap id="BaseResultMap" type="com.test.pojo.Emp">
        <id column="empno" jdbcType="INTEGER" property="empno"/>
        <result column="empname" jdbcType="VARCHAR" property="empname"/>
        <result column="job" jdbcType="VARCHAR" property="job"/>
        <result column="mgr" jdbcType="INTEGER" property="mgr"/>
        <result column="hiredate" jdbcType="TIMESTAMP" property="hiredate"/>
        <result column="sal" jdbcType="INTEGER" property="sal"/>
        <result column="comm" jdbcType="INTEGER" property="comm"/>
        <!--<result column="deptno" jdbcType="INTEGER" property="deptno"/>-->
        <association property="dept" javaType="com.test.pojo.Dept">
            <id column="deptno" jdbcType="INTEGER" property="deptno"/>
            <result column="deptname" jdbcType="VARCHAR" property="deptname"/>
            <result column="loc" jdbcType="VARCHAR" property="loc"/>
        </association>
    </resultMap>

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

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

两表查询

  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
      SELECT
        dept.deptno,
        dept.deptname,
        dept.loc,
        emp.empno,
        emp.empname,
        emp.job,
        emp.mgr,
        emp.hiredate,
        emp.sal,
        emp.comm
        FROM
        dept
        INNER JOIN emp ON emp.deptno = dept.deptno
        where emp.empno = #{empno,jdbcType=INTEGER}
    </select>

添加数据

    <insert id="insertSelective" parameterType="com.test.pojo.Emp">
        insert into emp
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="empno != null">
                empno,
            </if>
            <if test="empname != null">
                empname,
            </if>
            <if test="job != null">
                job,
            </if>
            <if test="mgr != null">
                mgr,
            </if>
            <if test="hiredate != null">
                hiredate,
            </if>
            <if test="sal != null">
                sal,
            </if>
            <if test="comm != null">
                comm,
            </if>
            <if test="dept.deptno != null">
                deptno,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="empno != null">
                #{empno,jdbcType=INTEGER},
            </if>
            <if test="empname != null">
                #{empname,jdbcType=VARCHAR},
            </if>
            <if test="job != null">
                #{job,jdbcType=VARCHAR},
            </if>
            <if test="mgr != null">
                #{mgr,jdbcType=INTEGER},
            </if>
            <if test="hiredate != null">
                #{hiredate,jdbcType=TIMESTAMP},
            </if>
            <if test="sal != null">
                #{sal,jdbcType=INTEGER},
            </if>
            <if test="comm != null">
                #{comm,jdbcType=INTEGER},
            </if>
            <if test="dept.deptno != null">
                #{dept.deptno,jdbcType=INTEGER},
            </if>
        </trim>
    </insert>

修改

    <update id="updateByPrimaryKeySelective" parameterType="com.test.pojo.Emp">
        update emp
        <set>
            <if test="empname != null">
                empname = #{empname,jdbcType=VARCHAR},
            </if>
            <if test="job != null">
                job = #{job,jdbcType=VARCHAR},
            </if>
            <if test="mgr != null">
                mgr = #{mgr,jdbcType=INTEGER},
            </if>
            <if test="hiredate != null">
                hiredate = #{hiredate,jdbcType=TIMESTAMP},
            </if>
            <if test="sal != null">
                sal = #{sal,jdbcType=INTEGER},
            </if>
            <if test="comm != null">
                comm = #{comm,jdbcType=INTEGER},
            </if>
            <if test="dept.deptno != null">
                deptno = #{dept.deptno,jdbcType=INTEGER},
            </if>
        </set>
        where empno = #{empno,jdbcType=INTEGER}
    </update>

批量删除

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

 <!--批量删除-->
    <delete id="daleteAll">
        delete from emp
        where empno in
        <foreach collection="array" open="(" close=")" separator="," item="id" >
            #{id}
        </foreach>
    </delete>

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

 

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

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

 

Over!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值