乐优商城项目总结day(7)
1.mapper-spring-boot-starter(通用mapper)的使用
1.1.实体类
实体类上加上javax.persistence
包下@Table
注解用来指定表名,表的主键字段使用javax.persistence
包下@Id
注解,@KeySql
是通用mapper中用来指定主键自增长策略。
1.2.dao层
该类所在的包需要使用@MapperScan("所在包名")
声明,继承通用mapper中Mapper
接口并指定对应的pojo就能使用,同时还能继承其他Mapper
接口来进行增强,能够非常方便的对单表进行增删改查。
1.3.dao层的使用
Mapper
接口中自带的方法:
都是一些基于单表的增删改查。
select用法
Category category = new Category();
category.setParentId(pid);
List<Category> categoryList = categoryDao.select(category);
参数中传入对象,对象的属性与值即为查询的条件。
selectByExample用法
适用于单表的动态条件查询,用法例如:
public PageResult<Brand> queryBrandByPage(Integer page, Integer rows, String sortBy, Boolean desc, String key) {
// 分页
PageHelper.startPage(page, rows);
// 过滤
Example example = new Example(Brand.class);
if(StringUtils.isNotBlank(key)) {
example.createCriteria().orLike("name", "%" + key + "%")
.orEqualTo("letter", key.toUpperCase());
}
// 排序
if(StringUtils.isNotBlank(sortBy)) {
String orderByClause = sortBy + (desc ? " DESC" : " ASC");
example.setOrderByClause(orderByClause);
}
// 查询
List<Brand> brandList = brandDao.selectByExample(example);
if(CollectionUtils.isEmpty(brandList)) {
throw new LyException(ExceptionEnum.BRAND_NOT_FOUND);
}
// 解析分页结果
PageInfo<Brand> brandPageInfo = new PageInfo<>(brandList);
return new PageResult<>(brandPageInfo.getTotal(), brandList);
}
创建Example
对象需要传入对应实体类的class对象,通用mapper通过反射的机制可以拿到你传入类的表信息和表字段名称,并可通过createCriteria
设置条件,·setOrderByClause
进行字段排序,最后组装成相应sql。
分页用法
此外,使用通用mapper进行分页时可配合PageHelper
同时使用。PageHelper
大致的原理是在该线程的ThreadLocal
中保存对应的页数和分页数量,通过mybatis拦截器进行拦截,并在要执行的sql后面拼上limit函数以及ThreadLocal
中的保存的页数和分页数量。
查询出的List<T>
将会被拦截并组装成Page<T>
对象,其实质也是继承了ArrayList
。因为强转不够优雅,因此可以使用PageInfo
对象进行解析拿到分页详情。
来源:CSDN
作者:风&浩
链接:https://blog.csdn.net/NEBEEEEEEK2/article/details/90141748