精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
理解本文就能理解锐英源软件开发培训的特色:先学会骑车,再造轮子。用开源工具进行快速开发,有了大项目经验,再写出局部模块。
我们创建一个商品表tb_goods,表结构如下所示:
CREATE TABLE `tb_goods` (
`goods_id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) COMMENT '商品名',
`intro` varchar(500) COMMENT '介绍',
`price` decimal(10,2) COMMENT '价格',
`num` int COMMENT '数量',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品管理';
常规开发流程下,我们需要在后端项目中增加关于该表增删改查的相关操作,但是人人代码生成器能够直接帮我们生成这些基础代码,接下来我们依次来学习一下生成的代码,看看究竟帮我们简化了哪些操作。
首先我们来看一下与我们创建的商品表相对应的商品类相关代码
@Data
@TableName("tb_goods")
public class GoodsEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId
private Long goodsId;
/**
* 商品名
*/
private String name;
/**
* 介绍
*/
private String intro;
/**
* 价格
*/
private BigDecimal price;
/**
* 数量
*/
private Integer num;
}
我们发现实体类中主键和我们数据库中定义的主键名字是不对应的,因此需要加上@TableId注释,并且我们实体类名与我们的表名也不一样,于是也需要用@TableName去绑定。
同时我们发现这个类头添加了@Data注释,该注释可以给我们的类自动提供getter和setter、hashCode等方法。
接下来我们从持久层、服务层、应用层依次来学习,首先看持久层
@Mapper
public interface GoodsDao extends BaseMapper<GoodsEntity> {
}
按理来说,持久层应该提供一些操作数据库的基本方法,但这个持久层里什么也没有,这是怎么回事,别急,我们发现它继承了一个类,我们通过跳转来查看一下这个类
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
原来这个类基本已经提供了所有操作数据库的基本方法,并且这些方法都是泛型的,我们的持久层直接继承一下就可以拿来用了。
接下来我们来看服务层,先看接口部分
public interface GoodsService extends IService<GoodsEntity> {
PageUtils queryPage(Map<String, Object> params);
}
与持久层相似,我们的应用层接口类也是直接继承了一个公用接口类,这个类基本上提供了我们需要用到的相关服务层操作方法,但不同于持久层,在服务层中我们还是要自己实现一个查询页数的方法
然后我们要在应用层实现类中实现这个方法
@Service("goodsService")
public class GoodsServiceImpl extends ServiceImpl<GoodsDao, GoodsEntity> implements GoodsService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
IPage<GoodsEntity> page = this.page(
new Query<GoodsEntity>().getPage(params),
new QueryWrapper<GoodsEntity>()
);
return new PageUtils(page);
}
}
最后就是我们的应用层,直接与前端进行交互的部分
@RestController
@RequestMapping("generator/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
/**
* 列表
*/
@RequestMapping("/list")
@RequiresPermissions("generator:goods:list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = goodsService.queryPage(params);
return R.ok().put("page", page);
}
/**
* 信息
*/
@RequestMapping("/info/{goodsId}")
@RequiresPermissions("generator:goods:info")
public R info(@PathVariable("goodsId") Long goodsId){
GoodsEntity goods = goodsService.getById(goodsId);
return R.ok().put("goods", goods);
}
/**
* 保存
*/
@RequestMapping("/save")
@RequiresPermissions("generator:goods:save")
public R save(@RequestBody GoodsEntity goods){
goodsService.save(goods);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@RequiresPermissions("generator:goods:update")
public R update(@RequestBody GoodsEntity goods){
goodsService.updateById(goods);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
@RequiresPermissions("generator:goods:delete")
public R delete(@RequestBody Long[] goodsIds){
goodsService.removeByIds(Arrays.asList(goodsIds));
return R.ok();
}
}