3.配置一个简单的springcloud项目
1.先创建一个父项目
1.父项目的作品是指定子项目相同依赖的版本,和springboot的版本仲裁功能类似
创建一个maven工程,删除掉里面的src等目录,只留下一个pom文件
pom文件解析:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.springcloud</groupId>
<artifactId>springcloud</artifactId>
<!--说明当前项目是父类型项目:因为项目的打包类型有:pom、jar、war-->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--同一管理jar包的版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!--子模块继承之后,提供作用:所并本本+子modlue,不用写groupID和version-->
<!--重点1:dependencyManagement里面的依赖只是设置了子类项目依赖的版本,并不会在父类项目中下载-->
<dependencyManagement>
<dependencies>
<!--springboot2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloud Hoxton.Sr1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
结论:
重点1:<packaging>pom</packaging>表明当前项目是父项目
重点2:父项目中的只是表明依赖版本,并不会下载!当子类项目引入时才会下载!
<dependencyManagement>
<dependencies>
。。。
<dependencies>
<dependencyManagement>
公共代码
公共代码里包含了各个子类模块使用的工共代码:如共同的实体类,工共的工具类等等!
服务提供端代码:
提供了对数据库表的各项操作:
项目结构如下:
注意体会到什么是面向接口编程!
1.控制层(controller)
@RestController
@Slf4j
public class UserController {
重点1:此处引入的依赖是service的接口,并不是接口的实现类,并且servcie的接口并没有加上注解!其实现类加上了@service注解!后面会说..
@Autowired
private UserService userService;
@GetMapping("/producer/queryUserById/{id}")
public CommResult queryUserById(@PathVariable("id") int id){
User user=userService.queryUserByid(id);
if (user!=null){
log.info("id:"+id+" 查询用户成功!");
重点2:此处返回的是CommResult,并传入user,因为CommResult有个属性是泛型,可以传入任何类型的参数!高!实在是高!
return new CommResult(200,"成功",user);
}else {
log.info("id:"+id+" 查询用户失败!");
return new CommResult(444,"查询失败!id:"+id);
}
}
}
2.service层
2.1接口:重点1:接口上没有加任何的注解
public interface UserService {
User queryUserByid(int id);
int saveUser(User user);
}
2.2接口实现类:
重点1:在接口实现类上加上了@service注解
@Service
public class UserServiceImp implements UserService {
重点2:dao层接口的依赖注入
@Autowired
private UserMapper userMapper;
@Override
public User queryUserByid(int id) {
User user = userMapper.queryUserByid(id);
return user;
}
}
4.dao层:
重点:此处有两种方式,因为采用的是mybatis访问数据库
1.在接口上使用@mapper注解去标注当前接口为mybatis的绑定接口(和mapper.xml)
2.在springboot的启动类上加上@mapperscan(dao层接口包名)去批量加入
加上这两个注解后,可以在接口方法上使用标签@select/@insert/@update/@delete
public interface UserMapper {
User queryUserByid(@Param("id") int id);
int saveUser(User user);
}
6.绑定的mapper.xml:绑定了dao层接口,并绑定了其中的方法
<mapper namespace="cn.com.springcloud.producer.dao.UserMapper">
重点1:数据库查询出的字段和实体类字段不对应,使用该标签一一对应,具体参考mybatis笔记!
<resultMap id="queryUserById_toUser" type="com.cn.entities.User">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="pwd" column="pwd"/>
</resultMap>
<select id="queryUserByid" resultMap="queryUserById_toUser">
select * from public."user" where id=#{id}
</select>
<insert id="saveUser" parameterType="com.cn.entities.User" useGeneratedKeys="true" keyProperty="id">
insert into public."user"(name, pwd) values (#{name},#{pwd})
</insert>
</mapper>
7.springboot启动类代码
@SpringBootApplication
重点1:使用@mappersacn批量导入mybatis的dao层接口
@MapperScan(value = "cn.com.springcloud.producer.dao")
public class ProducerUserApiApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerUserApiApplication.class, args);
}
}
8.springboot的配置文件代码:
server:
port: 8081
spring:
application:
name: springcloud练习:服务提供端
datasource:
#数据源基本配置
username: root
password: Ustcinfo@2020
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://133.64.181.208:18921/wmd_test?currentSchema=public
type: com.alibaba.druid.pool.DruidDataSource
重点1:
mybatis-plus:
指定mybatis的mapper.xml文件位置
mapper-locations: classpath*:/mapper/**/*.xml
使用别名,扫描别名类的包,不太好用,配置了这个,在mapper.xml中使用别名会爆红,虽然不影响运行,但是没有提醒等功能,也不好看。暂时不推荐使用!
type-aliases-package: com.cn.entities
服务调用方法代码
服务调用方调用提供放代码,返回结果!
重点1:导入共同依赖common,这样就可以使用公共类CommResult和User类
重点2:采用的是RestTemplate进行远程调用并返回,所以需要配置RestTemplate并加载到容器中!
1.自己的配置类
@Configuration
public class MyConfig {
重点1:在自己的配置类中加入RestTemplate
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
2.控制层代码:
@RestController
@Slf4j
public class UserController {
private final static String PRODUCER_PATH="http://localhost:8081/producer/";
@Autowired
private RestTemplate restTemplate;
@PostMapping("/customer/saveUser")
public CommResult saveUser(User user){
log.info("客户端:插入的用户信息->"+user);
重点1:使用restTemplate的各种方法(支持rest形式)去进行调用和返回
CommResult result = restTemplate.postForObject(PRODUCER_PATH + "saveUser", user, CommResult.class);
return result;
}
}