Springboot + Mybatis-plus的CRUD操作

目录

一步到位springboot目录
gitee:https://gitee.com/chaitou/leilema.git

前言

Mybatis-plus、日志、监控、响应状态码、异常、校验都集成好了,也就是说,如果不考虑优化的话,现在这套框架也上是有模有样了,接下去就可以无休止的写CRUD了…开不开心…
开不开心

Mybatis-plus的使用

一、xml自定义sql

自定义动态sql算是mybatis的灵魂了,简单的通过productInfo来演示一下,通过productName进行模糊查询

  1. mapper.xml
    <select id="getByLikeName" resultType="com.bugpool.leilema.product.entity.ProductInfo"
            parameterType="java.lang.String">
        select * from product_info where product_name like concat(concat('%',#{productName}),'%')
    </select>
  1. mapper
public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
    List<ProductInfo> getByLikeName(String productName);
}
  1. service
public interface ProductInfoService extends IService<ProductInfo> {
    List getByLikeName(String productName);
}

@Service
public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, ProductInfo> implements ProductInfoService {

    @Autowired
    ProductInfoMapper productInfoMapper;

    @Override
    public List getByLikeName(String productName) {
        return productInfoMapper.getByLikeName(productName);
    }

}

  1. controller
    @PostMapping("/findByLikeName")
    public List findByLikeName(String productName) {
        List<ProductInfo> list = productInfoService.getByLikeName(productName);
        return list;
    }

结果

{
  "code": 1000,
  "msg": "请求成功",
  "data": [
    {
      "productId": 1,
      "productName": "泡脚",
      "productPrice": 100.00,
      "productDescription": "中药泡脚加按摩",
      "productStatus": 0,
      ...
    }
  ]
}

二、mapper自定义sql

如果不涉及动态sql,我们也可以用简便的写法,效果是一样的

public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
    @Select("select * from product_info where product_name like concat(concat('%',#{productName}),'%') ")
    List<ProductInfo> getByLikeName(String productName);
}

三、lambda表达式查询

Mybatis-plus支持lambda表达式类型的查询,可以链式调用的一直.下去

    @PostMapping("/findByLikeName")
    public List findByLikeName(String productName) {
        // lambda query写法
        List<ProductInfo> list = productInfoService.lambdaQuery().like(ProductInfo::getProductName, productName).list();
        return list;
    }

lambda表达式查询几乎无所不能,跟写sql差不多

List<ProductInfo> list = productInfoService.lambdaQuery().like(ProductInfo::getProductName, productName)
	.eq(ProductInfo::getProductStatus, ProductStatusEnums.UP.getCode())
	.gt(ProductInfo::getProductPrice, 100)
	.orderByDesc(ProductInfo::getProductPrice)
	.list();

四、分页查询

分页查询首先需要先引入分页插件

@EnableTransactionManagement
@MapperScan("com.bugpool.leilema.*.mapper")
@Configuration
public class MybatisPlusConfiguration {
    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

之后就可以直接用了

    @PostMapping("/page")
    public IPage findPage(Page page, @Validated ProductInfoQueryVo vo) {
        // 将vo => po,进行page查询
        productInfoService.page(page, new QueryWrapper<ProductInfo>(BeanConvertUtils.convertTo(vo, ProductInfo::new)));
        // page.getRecords()此时为po类型,转换为vo
        page.setRecords(BeanConvertUtils.convertListTo(page.getRecords(), ProductInfoQueryVo::new));
        return page;
    }

完整代码

controller

@RestController
@RequestMapping("/product/product-info")
public class ProductInfoController {

   @Autowired
   ProductInfoService productInfoService;

   @PostMapping("/findById")
   public ProductInfoQueryVo findById(Integer id) {
       return BeanConvertUtils.convertTo(productInfoService.getById(id), ProductInfoQueryVo::new);
   }

   @PostMapping("/page")
   public IPage findPage(Page page, @Validated ProductInfoQueryVo vo) {
       // 将vo => po,进行page查询
       productInfoService.page(page, new QueryWrapper<ProductInfo>(BeanConvertUtils.convertTo(vo, ProductInfo::new)));
       // page.getRecords()此时为po类型,转换为vo
       page.setRecords(BeanConvertUtils.convertListTo(page.getRecords(), ProductInfoQueryVo::new));
       return page;
   }

   @PostMapping("/findByLikeName")
   public List findByLikeName(String productName) {
       // lambda query写法
       // List<ProductInfo> list = productInfoService.lambdaQuery().like(ProductInfo::getProductName, productName).list();

       // 为了演示自定义sql
       List<ProductInfo> list = productInfoService.getByLikeName(productName);
       return list;
   }

   @PostMapping("/add")
   public boolean add(ProductInfoAddVo vo) {
       return productInfoService.save(BeanConvertUtils.convertTo(vo, ProductInfo::new));
   }

   @PostMapping("/deleteById")
   public boolean deleteById(Integer id) {
       return productInfoService.removeById(id);
   }

   @PostMapping("/updateById")
   public boolean updateById(@Valid ProductInfoAddVo vo) {
       return productInfoService.updateById(BeanConvertUtils.convertTo(vo, ProductInfo::new));
   }
}

service

扫描二维码关注公众号,回复: 11132605 查看本文章
public interface ProductInfoService extends IService<ProductInfo> {
    List getByLikeName(String productName);
}

@Service
public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, ProductInfo> implements ProductInfoService {

    @Autowired
    ProductInfoMapper productInfoMapper;

    @Override
    public List getByLikeName(String productName) {
        return productInfoMapper.getByLikeName(productName);
    }

}

mapper

public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
    @Select("select * from product_info where product_name like concat(concat('%',#{productName}),'%') ")
    List<ProductInfo> getByLikeName(String productName);
}

enums

@Getter
public enum ProductStatusEnums {
    UP(0, "上架"),
    DOWN(1, "下架");

    private int code;
    private String msg;

    ProductStatusEnums(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

vo
这里多提示一下,其实@Validate@Valid的二次封装,也就式说,@Validate功能更强大。@Validate提供了分组的功能,如果利用分组功能,可以做到一个vo但是拥有多个校验情况,就不用写这么多vo了,有兴趣的自己研究一下吧

@Data
public class ProductInfoAddVo {
    // 主键
    private Integer productId;

    // 商品名称
    @NotBlank(message = "商品名称不允许为空")
    private String productName;

    // 商品价格
    @Min(value = 0, message = "商品价格不允许为负数")
    @NotNull(message = "商品价格不允许没空")
    private BigDecimal productPrice;

    // 描述
    private String productDescription;

    // 上架状态
    private Integer productStatus;
}

@Data
public class ProductInfoQueryVo {

    // 主键
    private Integer productId;

    // 商品名称
    private String productName;

    // 商品价格
    @Min(value = 0, message = "商品价格不允许为负数")
    private BigDecimal productPrice;

    // 描述
    private String productDescription;

    // 上架状态
    private Integer productStatus;
}

@Data
public class ProductInfoUpdateVo {
    // 主键
    @NotNull(message = "更新主键不允许为空")
    private Integer productId;

    // 商品名称
    private String productName;

    // 商品价格
    @Min(value = 0, message = "商品价格不允许为负数")
    private BigDecimal productPrice;

    // 描述
    private String productDescription;

    // 上架状态
    private Integer productStatus;
}

总结

更多的操作请直接查看Mybatis-plus官方文档
下节我们完善一下

发布了58 篇原创文章 · 获赞 281 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/chaitoudaren/article/details/105622073