整体架构:
服务提供方实现:
1. 创建一个Maven项目,
目录结构:
pom.xml文件内容如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.windy.mall.product</groupId> 6 <artifactId>ms-mall</artifactId> 7 <version>1.0.0-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <parent> 11 <groupId>org.springframework.boot</groupId> 12 <artifactId>spring-boot-starter-parent</artifactId> 13 <version>1.4.0.RELEASE</version> 14 </parent> 15 16 <name>ms-mall</name> 17 <url>http://maven.apache.org</url> 18 19 <properties> 20 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 21 <maven.compiler.source>1.8</maven.compiler.source> 22 <maven.compiler.target>1.8</maven.compiler.target> 23 </properties> 24 25 <dependencies> 26 <dependency> 27 <groupId>org.apache.curator</groupId> 28 <artifactId>curator-x-discovery-server</artifactId> 29 <version>2.11.0</version> 30 </dependency> 31 <dependency> 32 <groupId>org.mybatis</groupId> 33 <artifactId>mybatis</artifactId> 34 <version>3.4.1</version> 35 </dependency> 36 <dependency> 37 <groupId>mysql</groupId> 38 <artifactId>mysql-connector-java</artifactId> 39 </dependency> 40 <dependency> 41 <groupId>org.springframework.boot</groupId> 42 <artifactId>spring-boot-starter-jdbc</artifactId> 43 </dependency> 44 <dependency> 45 <groupId>org.springframework.boot</groupId> 46 <artifactId>spring-boot-starter-web</artifactId> 47 </dependency> 48 <dependency> 49 <groupId>org.mybatis.spring.boot</groupId> 50 <artifactId>mybatis-spring-boot-starter</artifactId> 51 <version>1.1.1</version> 52 </dependency> 53 </dependencies> 54 </project>
2. 创建数据库,sql如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 create database db_products default charset utf8; 2 3 create table products (pid int not null primary key auto_increment, pname varchar(200), type varchar(50), price double, createTime timestamp)
3. 创建resouces folder: src/main/resources,并创建application.properties文件
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
spring.datasource.url=jdbc:mysql:///db_products?useSSL=false spring.datasource.username=*** spring.datasource.password=***
4. 创建实体类package: bean,并创建实体类Product.java
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.windy.mall.product.bean; 2 3 import java.sql.Timestamp; 4 5 public class Product { 6 7 private Integer pid; 8 private String pname; 9 private String type; 10 private Double price; 11 private Timestamp createTime; 12 13 public Integer getPid() { 14 return pid; 15 } 16 public void setPid(Integer pid) { 17 this.pid = pid; 18 } 19 public String getPname() { 20 return pname; 21 } 22 public void setPname(String pname) { 23 this.pname = pname; 24 } 25 public String getType() { 26 return type; 27 } 28 public void setType(String type) { 29 this.type = type; 30 } 31 public Double getPrice() { 32 return price; 33 } 34 public void setPrice(Double price) { 35 this.price = price; 36 } 37 public Timestamp getCreateTime() { 38 return createTime; 39 } 40 public void setCreateTime(Timestamp createTime) { 41 this.createTime = createTime; 42 } 43 44 public String toString() { 45 return "Product [pid=" + pid + ", pname=" + pname + ", type=" + type + ", price=" + price + ", createTime=" 46 + createTime + "]"; 47 } 48 49 50 }
5. 创建Mapper package:mapper,并创建一个Mapper接口:ProductMapper(整合Mybatis,基于注解的形式)
Mybatis会帮助我们自动创建实现类, 我们只需要声明接口即可.
问题: 如何使用Mybatis的逆向工程,自动生成实体类,并且Mapper接口都是以注解的形式存在,而并非XML形式?
可以考虑先使用Mybatis的逆向工程,生成实体类和Mapper的XML文件,然后再根据需要转换使用基于注解的方式.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.windy.mall.product.mapper; 2 3 import java.util.List; 4 5 import org.apache.ibatis.annotations.Delete; 6 import org.apache.ibatis.annotations.Insert; 7 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Select; 9 import org.apache.ibatis.annotations.Update; 10 11 import com.windy.mall.product.bean.Product; 12 13 @Mapper 14 public interface ProductMapper { 15 16 @Insert("insert into products(pname,type,price)values(#{pname},#{type},#{price})") 17 public Integer add(Product product); 18 19 @Delete("delete from products where pid=#{arg1}") 20 public Integer deleteById(Integer id); 21 22 @Update("update products set pname=#{pname},type=#{type},price=#{price} where pid=#{pid} ") 23 public Integer update(Integer id); 24 25 @Select("select * from products where pid=#{arg1}") 26 public Product getById(Integer id); 27 28 @Select("select * from products order by pid desc") 29 public List<Product> queryByLists(); 30 31 }
6. 创建一个响应类Response,把所有返回结果信息,封装在这个类中.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.windy.mall.product.utils; 2 3 public class Response { 4 /* 5 * code: 标志状态码 6 * 200:表示成功 7 * 404: 表示资源不存在 8 * 500:表示失败 9 */ 10 11 private String code; 12 private String msg; 13 private Object data; 14 15 public Response() { 16 super(); 17 } 18 19 public Response(String code, String msg) { 20 super(); 21 this.code = code; 22 this.msg = msg; 23 } 24 25 public Response(String code, String msg, Object data) { 26 super(); 27 this.code = code; 28 this.msg = msg; 29 this.data = data; 30 } 31 32 public String getCode() { 33 return code; 34 } 35 36 public void setCode(String code) { 37 this.code = code; 38 } 39 40 public String getMsg() { 41 return msg; 42 } 43 44 public void setMsg(String msg) { 45 this.msg = msg; 46 } 47 48 public Object getData() { 49 return data; 50 } 51 52 public void setData(Object data) { 53 this.data = data; 54 } 55 56 }
7. 创建Controller类(由于只是简单的Demo,所以没有实现Service层)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.windy.mall.product.controller; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.web.bind.annotation.DeleteMapping; 5 import org.springframework.web.bind.annotation.GetMapping; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.PostMapping; 8 import org.springframework.web.bind.annotation.PutMapping; 9 import org.springframework.web.bind.annotation.RestController; 10 11 import com.windy.mall.product.bean.Product; 12 import com.windy.mall.product.mapper.ProductMapper; 13 import com.windy.mall.product.utils.Response; 14 15 @RestController 16 public class ProductController { 17 18 @Autowired 19 private ProductMapper productMapper; 20 21 @PostMapping("/ms/product/add") 22 public Object add(Product product){ 23 Integer res = productMapper.add(product); 24 if(res == null){ 25 return new Response("200", "Success!"); 26 } 27 28 return new Response("500","Fail!"); 29 } 30 31 @PutMapping("/ms/product/update") 32 public Object update(Product product ){ 33 return new Response("200", "Success!", productMapper.update(product)); 34 } 35 36 @GetMapping("/ms/product/{id}") 37 public Object get(@PathVariable("id") Integer id ){ 38 return new Response("200", "Success!", productMapper.getById(id)); 39 } 40 41 @GetMapping("/ms/products") 42 public Object list(){ 43 return new Response("200","Success!", productMapper.queryByLists()); 44 } 45 46 @DeleteMapping("/ms/product/{id}") 47 public Object delete(@PathVariable("id") Integer id ){ 48 Integer res = productMapper.deleteById(id); 49 return res==1? new Response("200","Success!") : new Response("500", "Fail!"); 50 51 } 52 53 }
8. 针对Mapper的单元测试(待补充)
9. 编写服务注册类ServiceRegister.java
调用方:
1. 创建一个新的Maven工程,pom.xml文件如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.windy.mall.web</groupId> 6 <artifactId>ms-mall-web</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>ms-mall-web</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 <maven.compiler.source>1.8</maven.compiler.source> 16 <maven.compiler.target>1.8</maven.compiler.target> 17 </properties> 18 19 <dependencies> 20 <dependency> 21 <groupId>org.apache.curator</groupId> 22 <artifactId>curator-x-discovery</artifactId> 23 <version>2.11.0</version> 24 </dependency> 25 <dependency> 26 <groupId>com.google.code.gson</groupId> 27 <artifactId>gson</artifactId> 28 <version>2.7</version> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework</groupId> 32 <artifactId>spring-context</artifactId> 33 <version>4.3.2.RELEASE</version> 34 </dependency> 35 <dependency> 36 <groupId>org.springframework</groupId> 37 <artifactId>spring-web</artifactId> 38 <version>4.3.2.RELEASE</version> 39 </dependency> 40 </dependencies> 41 </project>
2.