精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
理解本文就能理解锐英源软件开发培训的特色:先学会骑车,再造轮子。用开源工具进行快速开发,有了大项目经验,再写出局部模块。
我们创建一个商品表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();
            }
  
            }