案例环境
jdk1.8, mysql8.0, idea(工具),spring boot ,mybatis-plus详情看pom.xml
项目结构
结构解释项目由网关,公共依赖模块,和商品的优惠券,商品服务,订单服务,仓储服务和会员服务组成(案例测试使用shop-product,common),父工程为聚合工程不作为依赖管理
一、common模块(组件可在人人开源项目中获取renrne-fast),common是一个基础maven项目
pom.xml(common)
home
com.wangxiang
0.0.1-SNAPSHOT
4.0.0
common
8
8
org.projectlombok
lombok
1.18.20
com.baomidou
mybatis-plus-boot-starter
3.3.1
org.apache.httpcomponents
httpcore
4.4.13
commons-lang
commons-lang
2.6
commons-io
commons-io
2.5
mysql
mysql-connector-java
8.0.22
org.apache.shiro
shiro-core
1.4.0
compile
javax.servlet
javax.servlet-api
4.0.1
provided
org.springframework.boot
spring-boot-configuration-processor
2.1.18.RELEASE
com.alibaba
druid
1.1.13
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.1.RELEASE
pom
import
二、创建shop_product服务模块,该服务模块为springboot项目
创建步骤
1、选中父工程,new一个module
2、选中Spring boot模板,然后填写模块相关信息,然后next
注意:Server URL有两个镜像,spring和阿里的,国内使用阿里镜像比较友好
spring: https://start.spring.io/
阿里云:https://start.aliyun.com/
3、选择spring boot版本,(习惯使用稳定版2.1.18),然后选着两个基本服务
Spring Web (web应用,基础)
OpenFeign (远程调研功能,选)
然后Finish就可以创建了(如果有需求也可以选择其他服务哦)
基本结构已经创建完毕,接下来就是具体逻辑了
三、逻辑实现
按照MVC设计模式规范,具体按图
其中也使用了工厂模式
下面我会按照我的习惯来写
1、entity层,主要来完成一些对象实体类,在mybatis-plus框架开发中会使用到一些基础注解
主要有三个(根据数据表)
@Data (都到spring boot了相信大家对这个注解非常熟悉了)
@TableName("xxxx")这个注解是用来标明该实体类对应的数据表
@TableId 标注该字段为自增(具体看自己的数据库设计)
注意代码要实现持久化和反序列
案例代码(entity)
package com.wangxiang.shop.product.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 商品三级分类
*
* @author wangxiang
* @email [email protected]
* @date 2021-11-04 17:49:57
*/
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 分类id
*/
@TableId
private Long catId;
/**
* 分类名称
*/
private String name;
/**
* 父分类id
*/
private Long parentCid;
/**
* 层级
*/
private Integer catLevel;
/**
* 是否显示[0-不显示,1显示]
*/
private Integer showStatus;
/**
* 排序
*/
private Integer sort;
/**
* 图标地址
*/
private String icon;
/**
* 计量单位
*/
private String productUnit;
/**
* 商品数量
*/
private Integer productCount;
}
2、controller层(控制层,我的习惯是写完实体类,然后写controller,确定具体操作以后再去具体实现)
该层会用到三个基本注解和一些转换类的注解
@RestController 这是一个有@Controller注解衍生而来的注解,该注解内部有
@Controller @ResponseBody两个主要注解
@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
@ResponseBody的作用其实是将java对象转为json格式的数据。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。比如图一中,跳转到登录页面的路径就是localhost:端口号/product/category/list
@Autowired(自动装配)启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource(是CommonAnnotationBeanPostProcessor后置处理器处理的)或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
注意:
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
然后就是一些数据转换的注解和一些传递参数的注解
controller.java
package com.wangxiang.shop.product.controller;
import java.util.Arrays;
import java.util.Map;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.wangxiang.shop.product.entity.CategoryEntity;
import com.wangxiang.shop.product.service.CategoryService;
import com.wangxiang.common.utils.PageUtils;
import com.wangxiang.common.utils.R;
/**
* 商品三级分类
*
* @author wangxiang
* @email [email protected]
* @date 2021-11-04 17:49:57
*/
@RestController
@RequestMapping("product/category")
public class CategoryController {
@Autowired
private CategoryService categoryService;
/**
* 列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map params){
PageUtils page = categoryService.queryPage(params);
return R.ok().put("page", page);
}
/**
* 信息
*/
@RequestMapping("/info/{catId}")
public R info(@PathVariable("catId") Long catId){
CategoryEntity category = categoryService.getById(catId);
return R.ok().put("category", category);
}
/**
* 保存
*/
@RequestMapping("/save")
public R save(@RequestBody CategoryEntity category){
categoryService.save(category);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody CategoryEntity category){
categoryService.updateById(category);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] catIds){
categoryService.removeByIds(Arrays.asList(catIds));
return R.ok();
}
}
控制层写完就可以开始写dao层了,这一层在使用注解开发中为最简单的一层(使用),只有标记一个@Mapper注解并且继承BaseMapper(BaseMapper又继承了Mapper接口)接口。
dao层使用的是接口类型,并且不用添加实现类
@Mapper 从mybatis3.4.0开始加入了@Mapper注解,目的就是为了不再写mapper映射文件,mybatist-plus的宗旨为只mybatis增强而不做修
@Mapper注解是由Mybatis框架中定义的一个描述数据层接口的注解,注解往往起到的都是一个描述性作用,用于告诉sprigng框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。
dao层(接口类型)
package com.wangxiang.shop.product.dao;
import com.wangxiang.shop.product.entity.CategoryEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 商品三级分类
*
* @author wangxiang
* @email [email protected]
* @date 2021-11-04 17:49:57
*/
@Mapper
public interface CategoryDao extends BaseMapper {
}
接下来就是最重要的部分service层
该层由接口和接口的实现类两个部分组成
结构
service接口
IService的使用需要另外两个接口的配合:baseMapper
和ServiceImpl
package com.wangxiang.shop.product.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wangxiang.common.utils.PageUtils;
import com.wangxiang.shop.product.entity.CategoryEntity;
import java.util.Map;
/**
* 商品三级分类
*
* @author wangxiang
* @email [email protected]
* @date 2021-11-04 17:49:57
*/
public interface CategoryService extends IService {
PageUtils queryPage(Map params);
}
service接口的实现类
编写serviceImpl,ServiceImpl里面是各种的方法实现,好奇的可以点进源码看下,两个泛型需要注意的,第一个是继承basemapper的(AdminMapper),第二个是实体类(Admin)。
我们可以参考IService接口解释或者Mybatis-plus官网的方法解释来调用。
@Service("categoryService") dubbo提供者服务用于声明对外暴露服务,并且交由spring管理,该注解的解释为当Spring要创建CategoryServiceImpl的的实例时,bean的名字必须叫做"categoryService",主要作用于业务逻辑层
package com.wangxiang.shop.product.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wangxiang.common.utils.PageUtils;
import com.wangxiang.common.utils.Query;
import com.wangxiang.shop.product.dao.CategoryDao;
import com.wangxiang.shop.product.entity.CategoryEntity;
import com.wangxiang.shop.product.service.CategoryService;
@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl implements CategoryService {
@Override
public PageUtils queryPage(Map params) {
IPage page = this.page(
new Query().getPage(params),
new QueryWrapper()
);
return new PageUtils(page);
}
}
写完逻辑代码以后就可以配置数据源了,这里我使用号称最牛的连接池druid(德鲁伊)
具体配置
appcation.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://id地址:3306/shop_product?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
以上就基本完成了springboot+mybatis-plus的查询功能(crud其他功能也可类似操作)
查询操作,在浏览器(建议使用Chrome)中输入对应的ip+访问映射路径,返回的数据为json格式
开发环境使用本地测试,
完结撒花!!!!!!