SpringBoot整合通用tk.mapper增删改查+PageHelper分页

举报
兴趣使然的草帽路飞 发表于 2021/06/09 00:16:39 2021/06/09
【摘要】 1. Pom.xml 依赖 <!--通用mapper起步依赖--> <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter --> <dependency> <groupId>tk.mybatis</groupId&...

1. Pom.xml 依赖

<!--通用mapper起步依赖-->
<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version>
</dependency>
<!--jpa相关依赖包,每个Pojo,都需要用到该包对应的注解-->
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> <scope>compile</scope>
</dependency>
<!--swagger文档-->
<!-- http://localhost:9011/swagger-ui.html -->
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version>
</dependency>
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version>
</dependency>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

通用Mapper 不需要在application.yaml 配置文件中配置mybatis 相关配置信息!

2. Brand品牌实体类

我这里做一个Brand对象相关的增删改!

/**
 * @Auther: csp1999
 * @Date: 2020/12/24/9:26
 * @Description: Brand 品牌实体类
 */
@ApiModel(description = "Brand", value = "Brand")
@Table(name = "tb_brand")
public class Brand implements Serializable { /** * 品牌id */ @ApiModelProperty(value = "品牌id", required = false) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; /** * 品牌名称 */ @ApiModelProperty(value = "品牌名称", required = false) @Column(name = "name") private String name; /** * 品牌图片地址 */ @ApiModelProperty(value = "品牌图片地址", required = false) @Column(name = "image") private String image; /** * 品牌的首字母 */ @ApiModelProperty(value = "品牌的首字母", required = false) @Column(name = "letter") private String letter; /** * 排序 */ @ApiModelProperty(value = "排序", required = false) @Column(name = "seq") private Integer seq; /* setter/getter 方法略 */
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

3. 实现通用Mapper接口

/**
 * @Auther: csp1999
 * @Date: 2020/12/24/17:15
 * @Description: 品牌Brand 相关 Mapper
 */
@Repository
public interface BrandMapper extends Mapper<Brand> {
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. Service接口

**
 * @Auther: csp1999
 * @Date: 2020/12/24/17:18
 * @Description: 品牌Brand 相关 Service 接口
 */
public interface BrandService { /** * 查询所有品牌信息 * * @return */ List<Brand> findAll(); /** * 根据品牌信息多条件搜索 * * @param brand * @return */ List<Brand> search(Brand brand); /** * 根据id查询品牌信息 * * @param id * @return */ Brand findById(Integer id); /** * 新增品牌 * * @param brand */ void addBrand(Brand brand); /** * 根据id修改品牌 * * @param brand */ void updateBrand(Brand brand); /** * 根据id 删除品牌 * * @param id */ void deleteBrand(Integer id);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

5. Service接口实现类调用

/**
 * @Auther: csp1999
 * @Date: 2020/12/24/17:18
 * @Description: 品牌Brand 相关 Service 实现类
 */
@Service
public class BrandServiceImpl implements BrandService { @Autowired private BrandMapper brandMapper; /** * 查询所有品牌信息 * * @return */ @Override public List<Brand> findAll() { return brandMapper.selectAll(); } /** * 根据品牌信息多条件搜索 * * @param brand * @return */ @Override public List<Brand> search(Brand brand) { // 自定义条件搜索对象 Example Example example = new Example(Brand.class); // 根据条件搜索对象 example 创建条件构造器 Example.Criteria criteria = example.createCriteria(); // brand 不为空时 if (brand != null) { // brand.name != null 根据品牌名称模糊搜索: // SELECT * FROM tb_brand WHERE name LIKE "%歪比巴卜%" if (!StringUtils.isEmpty(brand.getName())) { /* * 1.Brand对象的成员属性名 * 2.占位符参数,搜索的条件 */ criteria.andLike("name", "%" + brand.getName() + "%"); } // brand.letter != null 根据品牌首字母搜索 // SELECT * FROM tb_brand WHERE name LIKE "%歪比巴卜%" AND letter = 'W' if (!StringUtils.isEmpty(brand.getLetter())){ criteria.andEqualTo("letter",brand.getLetter()); } } // 执行根据自定义搜索对象查询 return brandMapper.selectByExample(example); } /** * 根据注解id查询品牌信息 * * @param id * @return */ @Override public Brand findById(Integer id) { return brandMapper.selectByPrimaryKey(id); } /** * 新增品牌 * * @param brand */ @Override public void addBrand(Brand brand) { /* * insertSelective 和 insert方法的区别: * * 前者会根据参数对象的属性是否为空来拼接sql 语句, * 即,如果为空的属性字段不会被拼接到sql语句的values中 * * 同理:updateSelective 和 update 也是这个区别关系! */ brandMapper.insertSelective(brand); } /** * 根据id修改品牌 * * @param brand */ @Override public void updateBrand(Brand brand) { // 根据主键更新属性不为null的值 brandMapper.updateByPrimaryKeySelective(brand); } /** * 根据id删除品牌 * * @param id */ @Override public void deleteBrand(Integer id) { brandMapper.deleteByPrimaryKey(id); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112

6. Controller调用

在前后端分离中,一般都是以JSON格式进行数据交互,所以先封装一个数据返回给前端的Result对象:

Result

/**
 * @Auther: csp1999
 * @Date: 2020/12/24/9:26
 * @Description: 封装返回结果的类,用于微服务返回结果给前端
 */
@ApiModel(description = "Result", value = "Result")
public class Result<T> { /** * 是否成功:true操作成功/false操作失败 */ @ApiModelProperty(value = "执行是否成功,true:成功,false:失败", required = true) private boolean flag; /** * 返回状态码 */ @ApiModelProperty(value = "返回状态码,20000:成功,20001:失败,20002:用户名或密码错误,20003:权限不足,20004:远程调用失败,20005:重复操作,20006:没有对应的数据", required = true) private Integer code; /** * 返回消息内容 */ @ApiModelProperty(value = "提示信息", required = true) private String message; /** * 返回数据 */ @ApiModelProperty(value = "逻辑数据", required = true) private T data; public Result(boolean flag, Integer code, String message, Object data) { this.flag = flag; this.code = code;// 状态码可以自己定义 this.message = message; this.data = (T) data; } public Result(boolean flag, Integer code, String message) { this.flag = flag; this.code = code;// 状态码可以自己定义 this.message = message; } public Result() { this.flag = true; this.code = StatusCode.OK;// 状态码可以自己定义 this.message = "操作成功!"; } /* setter/getter方法略 */
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

BrandController

/**
 * @Auther: csp1999
 * @Date: 2020/12/24/17:26
 * @Description: 品牌Brand 相关 Controller
 */
@RestController
@RequestMapping(value = "/brand")
@CrossOrigin // 跨域注解
public class BrandController { @Autowired private BrandService brandService; /** * 查询所有品牌信息 * * @return */ @GetMapping("/brandList") public Result<List<Brand>> findAll() { // 查询所有品牌信息 List<Brand> brandList = brandService.findAll(); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result<List<Brand>>(true, StatusCode.OK, "查询品牌集合成功!", brandList); } /** * 根据条件搜索品牌集合 * * @param brand * @return */ @PostMapping("/search") public Result<List<Brand>> search(@RequestBody Brand brand) { // 调用service 实现查询 List<Brand> brandList = brandService.search(brand); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result<List<Brand>>(true, StatusCode.OK, "根据条件搜索品牌集合成功!", brandList); } /** * 根据id查询品牌信息 * * @param id * @return */ @GetMapping("/{id}") public Result<Brand> findById(@PathVariable(value = "id") Integer id) { // 根据id查询brand Brand brand = brandService.findById(id); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result<Brand>(true, StatusCode.OK, "根据id:" + id + "查询品牌成功!", brand); } /** * 增加品牌数据 * * @param brand */ @PostMapping("/addBrand") public Result addBrand(@RequestBody Brand brand) { // 新增品牌 brandService.addBrand(brand); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result(true, StatusCode.OK, "品牌新增成功!"); } /** * 根据品牌id修改品牌数据 * * @param id * @param brand * @return */ @PutMapping("/updateBrand/{id}") public Result updateBrand(@PathVariable(value = "id") Integer id, @RequestBody Brand brand) { // 将id赋值给brand brand.setId(id); // 调用service实现类 brandService.updateBrand(brand); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result(true, StatusCode.OK, "id为:" + id + "的品牌修改成功!"); } /** * 根据id删除品牌 * * @param id * @return */ @DeleteMapping("/deleteBrand/{id}") public Result deleteBrand(@PathVariable(value = "id") Integer id) { // 调用service实现删除 brandService.deleteBrand(id); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result(true, StatusCode.OK, "id为:" + id + "的品牌删除成功!"); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109

7. 扩展: PageHelper 分页查询

分页查询

service 接口

/**
 * 分页查询品牌集合
 *
 * @param currentPage
 * @param pageSize
 * @return
 */
PageInfo<Brand> findAllByPage(Integer currentPage, Integer pageSize);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

service 接口实现类

/**
 * 分页查询品牌集合
 *
 * @param currentPage
 * @param pageSize
 * @return
 */
@Override
public PageInfo<Brand> findAllByPage(Integer currentPage, Integer pageSize) { /* * 分页实现相关参数:PageHelper.startPage(currentPage,pageSize); 之后紧跟Brand对象集合的查询 * 1.当前页 * 2.每页多少条记录 */ PageHelper.startPage(currentPage, pageSize); // 查询brandList集合 List<Brand> brandList = brandMapper.selectAll(); // 封装PageInfo 对象 PageInfo<Brand> pageInfo = new PageInfo<>(brandList); return pageInfo;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

controller

/**
 * 分页查询品牌集合
 *
 * @param currentPage 当前页
 * @param pageSize 每页总记录数
 * @return
 */
@GetMapping("/brandList/{currentPage}/{pageSize}")
public Result<PageInfo<Brand>> findAllByPage(@PathVariable(value = "currentPage") Integer currentPage, @PathVariable(value = "pageSize") Integer pageSize) { // 调用service实现分页查询 PageInfo<Brand> pageInfo = brandService.findAllByPage(currentPage, pageSize); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页查询品牌集合成功!", pageInfo);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

分页 + 多条件搜索

service 接口

/**
 * 分页 + 多条件搜索
 * @param brand
 * @param currentPage
 * @param pageSize
 * @return
 */
PageInfo<Brand> searchByPage(Brand brand,Integer currentPage, Integer pageSize);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

service 接口实现类

/**
 * 分页 + 多条件搜索
 *
 * @param brand
 * @param currentPage
 * @param pageSize
 * @return
 */
@Override
public PageInfo<Brand> searchByPage(Brand brand, Integer currentPage, Integer pageSize) { // 1.分页: PageHelper.startPage(currentPage, pageSize); // 2.搜索数据: Example brandExample = this.getBrandExample(brand); List<Brand> brandList = brandMapper.selectByExample(brandExample); // 3.封装返回PageInfo: PageInfo<Brand> pageInfo = new PageInfo<>(brandList); return pageInfo;
}

// 多条件品牌查询Example 构建的方法
private Example getBrandExample(Brand brand) { // 自定义条件搜索对象 Example Example example = new Example(Brand.class); // 根据条件搜索对象 example 创建条件构造器 Example.Criteria criteria = example.createCriteria(); // brand 不为空时 if (brand != null) { // brand.name != null 根据品牌名称模糊搜索: // SELECT * FROM tb_brand WHERE name LIKE "%歪比巴卜%" if (!StringUtils.isEmpty(brand.getName())) { /* * 1.Brand对象的成员属性名 * 2.占位符参数,搜索的条件 */ criteria.andLike("name", "%" + brand.getName() + "%"); } // brand.letter != null 根据品牌首字母搜索 // SELECT * FROM tb_brand WHERE name LIKE "%歪比巴卜%" AND letter = 'W' if (!StringUtils.isEmpty(brand.getLetter())) { criteria.andEqualTo("letter", brand.getLetter()); } } return example;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

controller

/**
 * 分页 + 多条件搜索品牌集合
 *
 * @param brand
 * @param currentPage
 * @param pageSize
 * @return
 */
@PostMapping("/search/{currentPage}/{pageSize}")
public Result<PageInfo<Brand>> findAllByPage(@RequestBody Brand brand, @PathVariable(value = "currentPage") Integer currentPage, @PathVariable(value = "pageSize") Integer pageSize) { // 调用service实现分页查询 PageInfo<Brand> pageInfo = brandService.searchByPage(brand, currentPage, pageSize); // 响应结果封装:true操作成功|StatusCode.OK状态码20000|提示信息|响应给前端的数据 return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页+多条件搜索品牌集合成功!", pageInfo);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如果文字对您有帮助!请点赞支持一下!

文章来源: csp1999.blog.csdn.net,作者:兴趣使然の草帽路飞,版权归原作者所有,如需转载,请联系作者。

原文链接:csp1999.blog.csdn.net/article/details/111674929

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。