MySQL多表查询表结构设计01

例如 规格模块的设计

  1. 规格模块的表结构设计如下:
    规格表:
    在这里插入图片描述

实体类设计:

public class TbSpecification implements Serializable {
    private Long id;

    private String specName;

规格项表:
在这里插入图片描述
实体类设计:

public class TbSpecificationOption implements Serializable {
    private Long id;

    private String optionName;

    private Long specId;

    private Integer orders;
  **规格表 --> 规格项表,两张表是一对多的关联关系(注意:表结构中没有设置主外键关联,对于数据库的所有外键的每次插入、更新和删除后,进行完整性检查是一个耗费时间和资源的过程,它可能影响性能)。**
  1. 为了方便解决上述实体类的问题,可以新编写组合类,用于封装规格实体类和规格选项实体类,代码如下
 * 规格和规格项组合类
 */
public class Specification implements Serializable {// 规格
    private TbSpecification tbSpecification;
    // 多个规格项
    private List<TbSpecificationOption> tbSpecificationOptionList;
  • 保存数据:
  * 保存
     * @param specification
     */
    @Override
    public void save(Specification specification) {
        // 先保存规格
        TbSpecification tbSpecification = specification.getTbSpecification();
        tbSpecificationMapper.insert(tbSpecification);// 获取到规格生成的主键值,给规格项添加进去
        Long id = tbSpecification.getId();// 再保存规格项
        List<TbSpecificationOption> list = specification.getTbSpecificationOptionList();
        // 遍历,保存
        for (TbSpecificationOption tbSpecificationOption : list) {
            // 设置外键值
            tbSpecificationOption.setSpecId(id);
            // 保存
            tbSpecificationOptionMapper.insert(tbSpecificationOption);
        }
<selectKey keyProperty="id" resultType="long" keyColumn="id">
      select last_insert_id()
  </selectKey>
  mapper接口需要添加这一段,把id返回给对象
  • 通过主键查询
  * 逻辑:返回的是组合数据,先查规格,再查规格项
     */
    @Override
    public Specification findOne(Long id) {
        // 先查规格
        TbSpecification tbSpecification = tbSpecificationMapper.selectByPrimaryKey(id);
        // 再查规格项
        // 创建查询条件
        TbSpecificationOptionExample example = new TbSpecificationOptionExample();
        TbSpecificationOptionExample.Criteria criteria = example.createCriteria();
        // 按外键查询
        criteria.andSpecIdEqualTo(id);
        // 查询数据
        List<TbSpecificationOption> list = tbSpecificationOptionMapper.selectByExample(example);
        // 封装数据
        Specification specification = new Specification();
        specification.setTbSpecification(tbSpecification);
        specification.setTbSpecificationOptionList(list);return specification;
    }
  • 修改
 * 逻辑:修改规格数据,规格项:先删除,再添加
     */
    @Override
    public void update(Specification specification) {
        // 修改规格数据
        tbSpecificationMapper.updateByPrimaryKey(specification.getTbSpecification());// 删除规格项
        TbSpecificationOptionExample example = new TbSpecificationOptionExample();
        example.createCriteria().andSpecIdEqualTo(specification.getTbSpecification().getId());
        tbSpecificationOptionMapper.deleteByExample(example);// 添加规格项
        List<TbSpecificationOption> list = specification.getTbSpecificationOptionList();
        // 遍历,添加
        for (TbSpecificationOption tbSpecificationOption : list) {
            tbSpecificationOption.setSpecId(specification.getTbSpecification().getId());
            // 保存
            tbSpecificationOptionMapper.insert(tbSpecificationOption);
        }}
  • 批量删除
  * 逻辑:先删除规格,再删除规格项
     */
    @Override
    public void delete(Long[] ids) {
        // 遍历删除
        for (Long id : ids) {
            // 删除规格
            tbSpecificationMapper.deleteByPrimaryKey(id);// 再删除规格项
            TbSpecificationOptionExample example = new TbSpecificationOptionExample();
            example.createCriteria().andSpecIdEqualTo(id);
            tbSpecificationOptionMapper.deleteByExample(example);
        }
    }
  • 总结:不用在表的结构中添加主外键约束,通过代码维护。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值