目录
一步到位springboot目录
gitee:https://gitee.com/chaitou/leilema.git
前言
Mybatis-plus
、日志、监控、响应状态码、异常、校验都集成好了,也就是说,如果不考虑优化的话,现在这套框架也上是有模有样了,接下去就可以无休止的写CRUD
了…开不开心…
Mybatis-plus的使用
一、xml自定义sql
自定义动态sql算是mybatis
的灵魂了,简单的通过productInfo
来演示一下,通过productName
进行模糊查询
- 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>
- mapper
public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
List<ProductInfo> getByLikeName(String productName);
}
- 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);
}
}
- 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
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
的官方文档
下节我们完善一下