开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 商品管理 - 根据 ID 查询 SPU 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/758/detail/13314
MyCat - 商品管理 - 根据 ID 查询 SPU
内容介绍
一、前期准备
二、开发功能
三、service 层的逻辑处理
四、 测试
一、前期准备
1.编写测试类:
搭建好接触的微服务后,进行测试,在进行相关的功能开发,首先我们在我们的 controller 建立一个 DemoController 类,这个测试类需要的代码如下:
package cn.itcast.goods.controller;
Import orgspringframework.webbind.annotation.RequestMapping;
import org.springframework.webbind.annotation.RestController;
@RestController
//作用一个注解
@RequestMapping ("/demo")
//这里的注解可以不写
public class DemoController{
@RequestMapping("/show")
//再做一个注解
@RequestMapping
public string show(){
//申明一个方法 show
return "OK";
}
}
2.启动项目服务:
编写好测试类后,启动我们的 goods 微服务,启动微服务前,先启动 Eureka
启动 Eureka 后,再启动 goods 微服务,在启动测试 Controller 类,看能不能正常访问。
工程启动后, Eureka 中看端口号为 8161,接下来在浏览器中上方网址栏写 Localthost:8161, 会出现如下界面;证明启动成功。(先不要取消页面)
3. 检查搭建是否成功:
启动刚才搭建的 goods 微服务,之后访问 Controller ,启动成功后观察端口号为9001,然后在刚才打开的浏览器页面,刷新,观察到 goods 的微服务已经注册到 Eureka。
然后在浏览器访问 Locallhost:9001/demo/show ,会观察到 OK 返回回来。如下图所示:
二、开发功能
1. 申明接口 SpuMapper :
搭建成功后,开发具体的功能,首先关闭两个微服务,首先开发根据 ID 查询商品 spu 信息的功能。
首先在 mapper 包里申明一个接口 SpuMapper ,然后选择 kind 为 interface。
代码如下:
package cn.itcast.goods.mapper;
import cn.itcast.model.Tbspu;
public interface SpuMapper {
public Tbspu findbyid();
//
步骤一:
首先定义一个方法 findbyid(),这里 Tbspu 这个实体类返回是 Tbspu ;
}
对于步骤一这个它的 Spu 是什么类型,需要找到数据库,选择保存的 localhost 连接,测试连接没有问题后,找到 v__shop 中的 tb _spu 的信息中的 ID 类型,如下图所示:
步骤二:在数据库中找到 ID 类型后,在 findbyid() 括号里写上 String spuid ;如:
public Tbspu findbyid(String spuid)
; 然后定义对应的映射文件。
2.mapper 接口基本定义:
在 resources下面申明一个包 cn.itcast.goods.mapper,然后再申明一个配置文件SpuMapper.xml, 配置文件的头信息是固定的,有模板,模板为:
<?xm1 version="1.0" encoding-"UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd
<mapper namespace="cn.iteast.goods.mapper.SpuMapper" >
</mapper>
同时申明一个ID:<select id "findById" parameterType "java.lang.string"></select>
//这里的 ID,名字 findById 跟接口 SpuMapper 中的方法名一样;类型为 java.lang.string ,返回值为 TbSpu.
TbSpu.的属性实际上是 categoryid. 采用的是驼峰命名,在数据中使用的是下划线,表示表结构中的字段与类当中的属性不能完全对应。针对这个问题,我们可以在申明一个 resultMap. Id 为 spuMap,类型为 cn.itcast.model.TbSpu 。代码如下:
<resultMap id "spuMap" type-"cn.iteast.model.Tbspu">
//申明一个 resultMap.
Id 为 spuMap,类型为 cn.itcast.model.TbSpu
</resuitMap>
<select id-"findById"
parameterType="java.lang.String" resultMap="spuMap">
//申明一个 resultMap. Id
</select>
在这个 resultMap 里面配置数据库字段与类中属性的对应关系,代码如下
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="gn" jdbcType-"VARCHAR" property="sn" />
<result column-"name" jdbatype-"VARCHAR" property-"name" />
<result column="caption" jdbcType="VARCHAR" property="caption" />
<result column="brand id" jdbcType="INTEGER" property="brandid" />
<result column "category1 id" jdbcType "INTEGER" property "category1Id" />
<resultcolumn="category2id"jdbcType="INTEGER" property="category2Id" />
<resultcolumn"category3id"jdbcType"INTEGER"property "category3Id" />
<result column "template id" jdbcType "INTEGER" property "templateid" />
<resultcolumn="freightid" jdbcType="INTEGER" property="freightid" />
<result column-"image" jdbeType="VARCHAR" property="image" />
<result column-"images" jdbcType "VARCHAR" property-"images" />
<result column="sale service" jdbcType="VARCHAR" property-"saleService" />
<resultcolumn="specitems" jdbcType="VARCHAR" property="specitems" />
<result column="para items" jdbeType "VARCHAR" property "paraitems" />
<result column="sale num" jdbeType="INTEGER" property="saleNum" />
<result column "comment num" jdbcType "INTEGER" property-"commentNum" />
<result column "is marketable" jdbcType-"CHAR" property "isMarketable" />
<resultcolumn="isenablespec"jdbcType="CHAR" property="isEnableSpec" />
<result column-"is delete" jdbcType="CHAR" property="isDelete" />
<result column-"status" jdbcType-"CHAR" property-"status" />
然后编写 select 语句:
select * from tb spu where id = #{spuid}
,到此为止,mapper 接口基本定义结束
三、service 层的逻辑处理
1. 建立一个spuService:
之后,开发 service 层的逻辑处理,首先,在 service 中建立一个 spuService, kind 为 interface 。然后在里面申明一个接口方法:public Tbspu findbyid(String id) 。然后再去定义一个包 impl ,然后在定义这个接口的实现类 spuServiceImpl ,实现其中的一个方法 findbyid 。
Findbyid 这个方法作用就是根据 ID 查询 Spu 信息。对于这个接口里面的方法的逻辑来说,需要调用 SpuMapper 中的 findbyid 方法,注入一个 private SpuMapper SpuMapper ,通过 @Autowired 进行注入。并且在上面进行一个注解 @service 。然后传递 ID 即可。代码如下:
import cn.itcast.model.Tbspu;
import com.netflixdiscoveryconverters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframeworkstereotype.Service;
@Service
//注解 @service
public class spuserviceImpl implements Spuservice {
@Autowired
//通过@Autowired 进行注入
private spuMapper spuMapper;
@Override
public tbspu findById(String id) {
//注入一个 private SpuMapper SpuMapper ,
return spuMapper.findById(id);
}
}
如果报错,将检查级别调低即可。
2. 申明一个 SpuController:
在 Controller 里申明一个 SpuController 。在里面申请一个注解 @RestController,然后把实体类转为 json 格式,然后再去做一个注解 @RequestMapper(“/spu”), 然后申明一个方法,
注意:返回值,所有的结果都封装在 Resuit 当中, Resuit 当中给一个泛型 TbSpu ,然后申明一个方法 findbyid ,同时里面需要接收一个 ID ,接收这个 ID ,然后上面使用一个注解 @GetMapping ,因为当前是查询,所以使用 Get 请求,所以限定请求方式为 Get 。
然后在注解的 @GetMapping 后面写入 id ,这个 id 通过 url 传递过来。然后在方法方法 findbyid 中写个注解 @PathVariable 来接收,来指定 id 。
接下来在这里面调用 Spuservice 中的 findbyid方法,需要注入 private spuservice spuservice; ,然后在这里面通过通过 @Autowired 进行注入,接下来调用 Spuservice 中的 findbyid 方法,然后就可以查询并返回一个 Spu 。
Spu 返回后,就 return new一个 Result ,在里面需要传递泛型 TbSpu ,然后在这里面我们需要传递的参数:
第一个:请求是否成功,
第二个:StatusCode.OK ,成功就是 OK 。
第三个:查询成功,
第四个:Date 数据 tbspu 。需求开发完毕。
3. 代码如下:
import org.springframework.webbind.annotation.RestController;
@RestController
//申请一个注解 @RestController
@RequestMapping("/spu")
public class spucontroller {
@Autowired
private spuservice spuservice;
@GetMapping("/(id}")
//上面使用一个注解 @GetMapping ,在注解的 @GetMapping 后面写入 id ,这个 id 通过 url 传递过来
public Result<Tbspu> findById(@PathVariable("id") String id){
//申明一个方法 findbyid ,同时里面需要接收一个 ID,接收这个 ID;
//在方法方法 findbyid 中写个注解 @PathVariable 来接收,来指定 id
Tbspu tbspu=spuService.findById(id);
returnnew Result<TbSpu>( flag:true,StatusCode.oK,message:"查询成功"tbspu);
//return new 一个 Result ,在里面需要传递泛型 TbSpu ,然后在这里面我们需要传递的参数:
第一个:请求是否成功,
第二个:StatusCode.OK ,成功就是 OK 。
第三个:查询成功,
第四个:Date 数据 tbspu 。
}
}
四、测试
接下来进行一个简单的测试,先启动 Eureka ,启动后,启动微服务,测试定义和需求能不能正常运行,Eureka 启动好,清掉日志。看 goods 微服务能不能正常启动,goods 微服务启动成功后,在浏览器访问 Locallhost:9001/spu/id 在数据库中找一个 spu ,然后传递;执行;
显示结果如下图所示:
这个结果代表我们的第一个根据 ID 查询 spu 成功。