mybatis的基本使用(基本关联查询)

所需依赖:

    com.baomidou
    mybatis-plus-boot-starter
    3.3.1.tmp
graph TD
    A[前台发出请求] -->|根据url匹配到c层对应方法| B(Controller)
    B --> C(调用服务层对应方法)

那么服务层中的方法从哪里来呢(比如最简单的save、delete等)
mybatis的基本使用(基本关联查询)_第1张图片
其中Iservice中主要包含了常用的save、update、remove(delete)、page等方法。
并且他们的实现都依赖于ServiceImpl类并且利用BaseMapper辅助完成。
也就是说在mybatis中并不需要仓库层来辅助完成各项操作。

也就是说我们如果想要实现简单的增删改查只需要配置好上述关系并在C层中进行调用即可
例:对于test的增删改查

@RestController
@RequestMapping("/test")
public class testController {
  @Autowired
  private TestService testService;

  @PostMapping
  public RespBean addTest(@RequestBody test test){
    testService.save(test);
    return RespBean.success("添加成功。");
  }

  @GetMapping()
  public List getAllSettlement(){
    return testService.list();
  }

  @PutMapping()
  public RespBean updateUser(@RequestBody test test){
    if(testService.updateById(test)){
      RespBean.success("更新用户信息成功");
    }
    return RespBean.success("更新用户信息失败");
  }

  @DeleteMapping("/{id}")
  public RespBean deleteTest(@PathVariable String id) {
    testService.removeById(id);
    return RespBean.success("成功删除test");
  }

}

说完了最基本的需求,那么要怎么根据前台传来的参数进行查询或者分页呢?
这就需要配置Mapper.xml来构造查询条件并与之前定义的Mapper接口进行关联。

首先就是最基本的模糊查询:

public interface TestMapper extends BaseMapper {
  List getTestsByName(String name);
}



    
    
    
        
        
    

    
    
        id
        , name
    
    

其中的select项中的id就是负责和mapper中方法进行绑定从而针对此方法进行查询,标签内的内容就是sql语句直接进行查询。
ManyToOne 左关联查询:
数据准备:

public class FatherTest {
  private String id;
  private String name;

  @TableField(exist = false)
  @ApiModelProperty(value = "子test信息")
  private List tests;
}

mybatis的基本使用(基本关联查询)_第2张图片

public class Test {
  private String id;
  private String name;
  private String fatherTestId;
}

mybatis的基本使用(基本关联查询)_第3张图片
首先我们要明确的就是什么是左关联:
很明显如上代码所示,Test对FatherTest是manytoOne的关系,我们如果想要根据FatherTest中的字段(如fatherTest.name)寻找Test实体就需要进行关联查询。
而左关联就是关联查询一种方式,其sql语句如下:

SELECT * FROM table1 LEFT JOIN table2 ON table1.a=table2.b
表示将利用table1.a与table2.b绑定从而将table1和table2进行关联。
其中table1表示主表(左表)table2表示从表(右表)
左关联就表示主表元素全部保留,从表元素中如果没有对应元素则置为null。

比如对上述已有数据进行左关联:

SELECT
    *
FROM test AS a
         LEFT JOIN
     "fatherTest" AS b
     ON
         a."fatherTestId" = b.id

查询结果如下:
mybatis的基本使用(基本关联查询)_第4张图片
而我们如果进行右关联查询就只需要将LEFT改为RIGHT即可,得到的数据保留情况与之相反:
mybatis的基本使用(基本关联查询)_第5张图片
当然还有其他关联方式在此就不一一列举了。
如果我们想要根据父表数据查询子表只需要在此基础上加上where查询即可。
mybatis的基本使用(基本关联查询)_第6张图片

那么问题又来了,如果test也有子对象且为一对多关系那么在查询返回结果时要怎么连带其子对象返回呢?
数据准备:

public class SonTest {
  String id;
  String name;
  String testId;
}

mybatis的基本使用(基本关联查询)_第7张图片

@TableName("test")
public class Test {
  private String id;
  private String name;
  private String fatherTestId;
  @TableField(exist = false)
  @ApiModelProperty(value = "存储查询出的子test信息,并且不需存储在数据库中")
  private List sonTests;
}

mybatis的基本使用(基本关联查询)_第8张图片
如果我们不做任何改动返回结果中sonetests会为null,如下所示
图片.png
mybatis的基本使用(基本关联查询)_第9张图片
所以我们就需要对其返回结果进行规定,并且根据其返回结果的id与sonTestId相关联从而查询出test对应的sonTest并且将其加入到查询出的结果中。

所以我们就需要对resultMap进行设定,并且将其与相应的查询进行绑定。

    
        
        
        
        
            
            
            
        
    
    

其中collection就可以实现查询并且返还list的功能。
其中的select属性就可以与