环境准备
idea,mysql,maven
1)构建项目
点击文件,新建项目
选择maven项目,下一步,输入项目名称和编辑包名等,点击完成idea会搭建项目的基本文件结构。
1)maven配置
首先在idea中配置java和maven地址
新建好项目后按下alt+ctrl+s进入设置遵循下图操作,主要目的是将maven目录都指向到自己的maven安装目录。
打开pom.xml,这是maven配置文件。groupId是当前项目所在的组名,artifactId是唯一标识,version是当前版本。
models是当前项目的所有子项目,每个子项目都用model标签包裹。
properties是各个依赖的版本。
dependencies是所有依赖,每个依赖用dependency包裹。
子项目可以继承父项目的依赖,在子项目中引入父项目中有的依赖即可
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
<spring.cloud.version>2021.0.4</spring.cloud.version>
<spring.boot.version>2.6.11</spring.boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
</dependencyManagement>
2)构建api工程
在父项目上右键点击new,model,next,输入项目名即可,我们这里创建的模块名叫api,作用是为其他项目提供数据库映射类。
1)maven配置
api工程只需要lombok一个依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2)接口设计
映射类只需要和数据库中的数据结构相同即可,注意尽量使用包装类以免默认值影响后续操作。
实现getset方法和构造方法。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Approvals {
private int id;
private int processId;
private int leave;
private int leavenow;
private String leaveName;
private int approver;
private String state;
}
使用了lombok不需要自己写构造方法和getset,@data的作用是替你写getset方法,剩下两个注解的作用是全参构造器和无参构造器。
3)构建生产者工程
生产者工程我们这里的名字为项目名_端口名。
1)maven配置
生产者除了基本依赖以外还需要api依赖。
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.hd_approval</groupId>-->
<!-- <artifactId>api</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.hd_approval</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
2)配置文件
application.yml
在src/main/resources下创建application.yml文件,配置基本信息,配置方式如下。
server:
port: 10086 # 端口号
spring:
application:
name: OfficeAutomation_hd_approval_10086 #项目名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 数据库连接池
driver-class-name: com.mysql.cj.jdbc.Driver # 驱动所在位置
url: jdbc:mysql://127.0.0.1:3306/office_automation?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 # 连接数据库yrl # 数据库名称
username: root # 用户名
password: 'hddd' # 密码
dbcp2:
min-idle: 5
initial-size: 5
max-total: 20
max-wait-millis: 200
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # 配置文件名称
type-aliases-package: com.oacloud.entity # 映射类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper文件所在位置及名称
mybatis.cfg.xml
mybatis.cfg.xml如下,其作用是开启二级缓存。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /><!-- 二级缓存开启 -->
</settings>
</configuration>
mapper
mapper如下,和下文的dao层配合使用,作用是写sql语句。
namespace的作用是实现哪一个dao接口。
id指实现接口中的方法名。
parameterType指参数名称。
resultType指返回值类型。
<?xml 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="com.oacloud.dao.ApprovalsLogsDao">
<select id="selectApprovalsLogs" parameterType="ApprovalsLogs" resultType="map">
select
id as id,
processid as processId,
leavenow as leavenow,
leave_name as leaveName,
approver as approver,
state as state
from approvals_log
where 1 = 1
<if test="approver != null">and approver = #{approver}</if>
<if test="processId != null">and processid = #{processId}</if>
</select>
<insert id="insert" parameterType="ApprovalsLogs">
insert into approvals_log(processid,leavenow, leave_name, approver, state, comments)
values (#{processId},#{leavenow},#{leaveName},#{approver},#{state},#{approvals})
</insert>
</mapper>
3)层设计
1)dao
dao层,持久化层,作用是将数据从内存保存到稳定的存储介质中实现持久化存储和从硬盘中取数据。
dao层因为有mapper配置文件的存在只需写好接口即可,剩下的交给springcloud实现。
注意namespace和id的名字应该分别和报名文件名和方法名对应。
package com.oacloud.dao;
import com.oacloud.entity.ApprovalsLogs;
import org.apache.ibatis.annotations.Mapper;
import java.util.ArrayList;
import java.util.Map;
@Mapper
public interface ApprovalsLogsDao {
ArrayList<Map<String,Object>> selectApprovalsLogs(ApprovalsLogs approvalsLogs);
int insert(ApprovalsLogs approvalsLogs);
}
@Mapper注解的作用是自动找到mapper中对应id的sql语句生成实现类。
mapper中的语句分为两种,查和增删改。其中查返回的是查询的结果,增删改返回的是影响的行数。
2)service
service层的作用是封装业务逻辑,在service中调用不同的dao完成某个操作。如果需要开启事务也是在这里进行。
service需要接口和实现类。
接口:
public interface ApprovalsLogsServices {
ArrayList<Map<String,Object>> findApprovals(ApprovalsLogs approvalsLogs);
int insert(ApprovalsLogs approvalsLogs);
}
实现类:
@Service
public class ApprovalsLogsServicesImpl implements ApprovalsLogsServices {
@Autowired
@SuppressWarnings("all")
private ApprovalsLogsDao approvalsLogsDao;
@Override
public ArrayList<Map<String, Object>> findApprovals(ApprovalsLogs approvalsLogs) {
// System.out.println(approvalsLogs);
return approvalsLogsDao.selectApprovalsLogs(approvalsLogs);
}
@Override
public int insert(ApprovalsLogs approvalsLogs) {
return approvalsLogsDao.insert(approvalsLogs);
}
}
@Service注解的作用:代表这里是服务层
@Autowride注解的作用:注入式变量赋值
@SuppressWarnings("all")注解的作用:压制警告,编辑器偶尔会有不识别注入写法的情况而报错。
3)controller
controllr层的作用是接收用户请求返回数据和路由分发。
@RestController
@RequestMapping("approvalslogs")
public class ApprovalsLogsController {
@Autowired
private ApprovalsLogsServices approvalsLogsServices;
@PostMapping("get")
Result<ArrayList<Map<String,Object>>> get(ApprovalsLogs approvalsLogs){
ArrayList<Map<String,Object>> a = approvalsLogsServices.findApprovals(approvalsLogs);
return Result.success(a);
}
@PostMapping("insert")
Result insert(ApprovalsLogs approvalsLogs){
int i = approvalsLogsServices.insert(approvalsLogs);
if (i == 0) return Result.error("插入失败");
else return Result.success();
}
}
@RestController注解表示这是一个使用了rest技术的controller类。
@RequestMapping("approvalslogs")的作用是通过这个网址找到当前类。
@PostMapping("get")的作用是通过post请求找到当前方法。
@GetMapping("get")的作用是通过get请求找到当前方法。
这个代码中的insert方法请求的网址应该是localhost:10086/approvalslogs/insert,触发方法后返回数据。
4)构建消费者工程
消费者工程的命名规则和生产者工程相同。
1)maven配置
也需要导入api工程
<dependencies>
<dependency>
<groupId>org.hd_approval</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2)配置文件
application.xml中无需配置数据库
server:
port: 86
spring:
application:
name: OfficeAutomation_hd_approval_86
3)详细设计
这里只有controller层,消费者工程的作用是做负载均衡。这里的controller层调用其他的controller层完成工作并返回数据给用户。
首先创建bean类
package com.oacloud.cfgbeans;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* 功能:
* 用于实现与提供者工程传递数据
*/
@Configuration //该类具备配置类的功能,最先加载
public class ConfigBeans {
@Bean//执行该方法返回对象实例
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@Configuration的作用是令此类具有配置类的功能,最先加载。
@bean的作用是返回该对象的实例。
controller的作用是调用其他的controller
package com.oacloud.controller;
import com.oacloud.entity.ApprovalsLogs;
import com.oacloud.entity.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Map;
@RestController
@RequestMapping("approvalslogs")
public class ApprovalsLogsController {
private static final String REST_URL_PREFIX = "http://127.0.0.1:10086/approvalslogs";
@Autowired
private RestTemplate restTemplate;
@PostMapping("get")
Result<ArrayList<Map<String,Object>>> get(@RequestBody ApprovalsLogs approvalsLogs){
String url = REST_URL_PREFIX + "/get";
return restTemplate.postForObject(url,approvalsLogs,Result.class);
}
@PostMapping("insert")
Result insert(@RequestBody ApprovalsLogs approvalsLogs){
String url = REST_URL_PREFIX + "/insert";
return restTemplate.postForObject(url,approvalsLogs,Result.class);
}
}
5)启动类
生产者工程和消费者工程都需要启动类,这里以消费者工程为例:
package com.oacloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Approval_Provider_86 {
public static void main(String[] args) {
SpringApplication.run(Approval_Provider_86.class, args);
}
}
@SpringBootApplication的作用是表明这是一个启动类