3
graph TD
    A[前台发出请求] -->|根据url匹配到c层对应方法| B(Controller)
    B --> C(调用服务层对应方法)

所需依赖:

    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>

那么服务层中的方法从哪里来呢(比如最简单的save、delete等)
未命名文件(5).png
其中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<test> 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<Test> {
  List<Test> getTestsByName(String name);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.recorde.server.mapper.TestMapper">
    <!-- 通用查询映射结果 -->
    <!-- 即把实体中字段与数据库中字段进行对应 -->
    <resultMap id="BaseResultMap" type="com.recorde.server.model.Test">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id
        , name
    </sql>
    <select id="getTestsByName" resultType="com.recorde.server.model.Test">
        select *
        from test
        where name like concat('%', #{name}::text, '%')
    </select>
</mapper>

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

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

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

图片.png

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

图片.png
首先我们要明确的就是什么是左关联:
很明显如上代码所示,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

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

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

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

图片.png

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

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

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

    <resultMap id="BaseResultMap" type="com.recorde.server.model.Test">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="fatherTestId" property="fatherTestId"/>
        <collection property="sonTests" javaType="ArrayList" ofType="com.recorde.server.model.SonTest"
                    select="selectSons" column="id">
            <result column="id" property="id"/>
            <result column="testId" property="testId"/>
            <result column="name" property="name"/>
        </collection>
    </resultMap>
    <select id="selectSons" resultType="com.recorde.server.model.SonTest" parameterType="string">
        select *
        from 
            "sonTest" a,
            "test" b
        where a."testId"=b."id"
            and b."id"=#{id}
    </select>

其中collection就可以实现查询并且返还list<sonTest>的功能。
其中的select属性就可以与<select>通过id进行绑定,并且将column作为输入进行查询并且通过property与Test进行绑定从而加入信息到Test实体中。
运行效果:
图片.png
图片.png


李明
441 声望19 粉丝