关联关系映射

发布于:2023-01-16 ⋅ 阅读:(231) ⋅ 点赞:(0)

目录

本次目标:

一、一对多关联关系

二、多对多关联关系


本次目标:

  1. 一对多关联关系
  2. 多对多关联关系

一、一对多关联关系

首先先用逆向生成工具生成t_hibernate_ordert_hibernate_order_item 这两张表对应的model与mapper

 t_hibernate_order:

t_hibernate_order_item :

知道表之后我们直接生成相对应的对象:

先把这几个地方改一下:(如果不懂的如何生成通用的增删改查可以看看这里,里面有些哦)

 还有下面的那个表名也要改一下:

 generatorConfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!--指定数据库jdbc驱动jar包的位置-->
    <classPathEntry location="D:\\maven\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.ps.ssm.model"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.ps.ssm.mapper"
                         targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.ps.ssm.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
        <!--enableCountByExample="false" enableDeleteByExample="false"-->
        <!--enableSelectByExample="false" enableUpdateByExample="false">-->
        <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
        <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
        <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
        <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->


        <table schema="" tableName="t_hibernate_order" domainObjectName="Order"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>
        <table schema="" tableName="t_hibernate_order_item " domainObjectName="Item"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>

    </context>
</generatorConfiguration>

生成后:

OrderBiz:

package com.ps.ssm.biz;

import com.ps.ssm.model.Book;
import com.ps.ssm.model.BookVo;
import com.ps.ssm.model.Order;
import com.ps.ssm.model.vo.OrderVo;
import com.ps.ssm.util.PageBean;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface OrderBiz {
    int deleteByPrimaryKey(Integer orderId);

    int insert(Order record);

    int insertSelective(Order record);

    Order selectByPrimaryKey(Integer orderId);

    OrderVo queryOrderVoByOrderId(Integer orderId);

    int updateByPrimaryKeySelective(Order record);

    int updateByPrimaryKey(Order record);
}

ItemBiz

package com.ps.ssm.biz;

import com.ps.ssm.model.Item;
import com.ps.ssm.model.vo.ItemVo;
import org.apache.ibatis.annotations.Param;

public interface ItemBiz {
    int deleteByPrimaryKey(Integer ItemId);

    int insert(Item record);

    int insertSelective(Item record);

    Item selectByPrimaryKey(Integer ItemId);

    ItemVo queryItemVoByItemId(Integer ItemId);

    int updateByPrimaryKeySelective(Item record);

    int updateByPrimaryKey(Item record);
}

OrderBizImpl

package com.ps.ssm.biz.impl;

import com.ps.ssm.biz.OrderBiz;
import com.ps.ssm.mapper.OrderMapper;
import com.ps.ssm.model.Order;
import com.ps.ssm.model.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper orderMapper;
    @Override
    public int deleteByPrimaryKey(Integer orderId) {
        return 0;
    }

    @Override
    public int insert(Order record) {
        return 0;
    }

    @Override
    public int insertSelective(Order record) {
        return 0;
    }

    @Override
    public Order selectByPrimaryKey(Integer orderId) {
        return null;
    }

    @Override
    public OrderVo queryOrderVoByOrderId(Integer orderId) {
        return orderMapper.queryOrderVoByOrderId(orderId);
    }

    @Override
    public int updateByPrimaryKeySelective(Order record) {
        return 0;
    }

    @Override
    public int updateByPrimaryKey(Order record) {
        return 0;
    }
}

ItemBizImpl:

package com.ps.ssm.biz.impl;

import com.ps.ssm.biz.ItemBiz;
import com.ps.ssm.mapper.ItemMapper;
import com.ps.ssm.model.Item;
import com.ps.ssm.model.vo.ItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ItemBizImpl implements ItemBiz {
    @Autowired
    private ItemMapper ItemMapper;
    @Override
    public int deleteByPrimaryKey(Integer ItemId) {
        return 0;
    }

    @Override
    public int insert(Item record) {
        return 0;
    }

    @Override
    public int insertSelective(Item record) {
        return 0;
    }

    @Override
    public Item selectByPrimaryKey(Integer ItemId) {
        return null;
    }

    @Override
    public ItemVo queryOrderItemVoByOrderItemId(Integer ItemId) {
        return ItemMapper.queryOrderItemVoByItemId(ItemId);
    }

    @Override
    public int updateByPrimaryKeySelective(Item record) {
        return 0;
    }

    @Override
    public int updateByPrimaryKey(Item record) {
        return 0;
    }
}

OrderVo : 

package com.ps.vo;
 
import com.ps.model.Order;
import com.ps.model.OrderItem;
 
import java.util.ArrayList;
import java.util.List;
 
public class OrderVo extends Order {
    private List<OrderItem> orderItems = new ArrayList<>();
 
    public List<OrderItem> getOrderItems() {
        return orderItems;
    }
 
    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }
 
 
    @Override
    public String toString() {
        return "OrderVo{" +
                "orderItems=" + orderItems +
                '}';
    }
}

ItemVo :


package com.ps.vo;
 
import com.ps.model.Order;
import com.ps.model.OrderItem;
 
public class ItemVo extends OrderItem {
    private Order order;
 
    public Order getOrder() {
        return order;
    }
 
    public void setOrder(Order order) {
        this.order = order;
    }
 
 
    @Override
    public String toString() {
        return "OrderItemVo{" +
                "order=" + order +
                '}';
    }
}

两个表之间的关系:

             1、一个订单有多个订单详情表

             2、一个订单详情只有一个订单

二、多对多关联关系

比如一本书籍有多个类别,多个类别对多本书 

多对多相当于两个一对多

<resultMap id="HbookVoMap" type="com.ps.model.vo.HbookVo">
    <result property="bookId" column="book_id"></result>
    <result property="bookName" column="book_name"></result>
    <collection property="categories" ofType="com.ps.model.Category">
      <result property="categoryId" column="category_id"></result>
      <result property="categoryName" column="category_name"></result>
    </collection>
  </resultMap>
 
  <resultMap id="CategoryVoMap" type="com.ps.model.vo.CategoryVo">
    <result property="categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"></result>
    <collection property="hbooks" ofType="com.ps.model.Hbook">
      <result property="bookId" column="book_id"></result>
      <result property="bookName" column="book_name"></result>
    </collection>
  </resultMap>
 
 <select id="queryByBookId" resultMap="HbookVoMap" parameterType="java.lang.Integer">
select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
     where b.book_id = bc.bid and bc.cid = c.category_id and b.book_id = #{bookId}
 </select>
 
 
  <select id="queryByCid" resultMap="CategoryVoMap" parameterType="java.lang.Integer">
select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
     where b.book_id = bc.bid and bc.cid = c.category_id and c.category_id=#{cid}
   </select>

 HbookCategoryBizImpl

package com.ps.biz.impl;
 
import com.ps.biz.HbookCategoryBiz;
import com.ps.mapper.HbookCategoryMapper;
import com.ps.model.HbookCategory;
import com.ps.model.vo.CategoryVo;
import com.ps.model.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 * @author 彭于晏
 * @create  2022-08-15 23:30
 */
@Service
public class HbookCategoryBizImpl implements HbookCategoryBiz {
    @Autowired
    private HbookCategoryMapper hbookCategoryMapper;
 
  
 
    @Override
    public CategoryVo queryByCid(Integer cid) {
        return hbookCategoryMapper.queryByCid(cid);
    }
 
    @Override
    public HbookVo queryByBookId(Integer bookId) {
        return hbookCategoryMapper.queryByBookId(bookId);
    }
}

HbookCategoryBizImplTest:

package com.ps.biz.impl;
 
import com.ps.biz.HbookCategoryBiz;
import com.ps.model.vo.CategoryVo;
import com.ps.model.vo.HbookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
/**
 * @author 彭于晏
 * @create  2022-08-15 0:33
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
public class HbookCategoryBizImplTest {
    @Autowired
    private HbookCategoryBiz hbookCategoryBiz;
 
    @Test
    public void queryByCid() {
        CategoryVo categoryVo = hbookCategoryBiz.queryByCid(8);
        System.out.println(categoryVo);
        categoryVo.getHbooks().forEach(System.out::println);
    }
 
    @Test
    public void queryByBookId() {
        HbookVo hbookVo = hbookCategoryBiz.queryByBookId(8);
        System.out.println(hbookVo);
        hbookVo.getCategories().forEach(System.out::println);
    }
}

queryByBookId结果:

queryByCid效果: 

 

好啦!今天的分享就到这里,我们下次再见!

 


网站公告

今日签到

点亮在社区的每一天
去签到