我是靠谱客的博主 文艺蛋挞,最近开发中收集的这篇文章主要介绍SpringBoot整合通用tk.mapper增删改查+PageHelper分页,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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>

通用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 方法略 */
}

3. 实现通用Mapper接口

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

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);
}

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);
    }
}

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方法略 */
}

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 + "的品牌删除成功!");
    }
}

7. 扩展: PageHelper 分页查询

分页查询

service 接口

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

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;
}

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);
}

分页 + 多条件搜索

service 接口

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

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;
}

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);
}

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

最后

以上就是文艺蛋挞为你收集整理的SpringBoot整合通用tk.mapper增删改查+PageHelper分页的全部内容,希望文章能够帮你解决SpringBoot整合通用tk.mapper增删改查+PageHelper分页所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部