Java API开发入门指引
Java开发与前端开发极其类似,Java的通用构建工具maven对应前端npm;依赖管理pom.xml对应package.json;当然也有脚手架Sping Initializr等等。
Web接口操作数据库大致经历如下步骤:
Controller定义接口格式,参数校验
Service做复杂的业务逻辑编写
DAO(Data Aceess Object)数据持久化
Repository是实现操作数据库具体逻辑。
DataBase持久化数据的数据库。
所以要写一个接口,按如上方式编写相应组件即可。在此之前,我们还要再安装Java JDK、构建工具maven、数据库mySql,以及Sping Initializr弄一个脚手架。
1 JDK安装
略
2 MySQL安装
这里采用Docker镜像的方式在服务器上安装MySQL。利用容器技术提供的非常便捷的装卸操作,快速安装程序。
进入前端服务器
ssh root@192.168.**.**
password:******
搜索并下载mysql镜像
#搜
docker search mysql
#下载
dokcer pull mysql
#查下载结果
docker images
#运行 映射将容器的3306端口程序映射到服务器的3306端口上,初始化密码
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=****** mysql
#查容器
docker ps -a
#进容器 验证安装结果
docker exec -it mysql bash
#创建mysql数据库
mysql -h 127.0.0.1 -u root -p
CREATE DATABASE XX;
use XX;
3 安装maven
3.1 安装
官网下载Maven下载
官网下载太慢,我是找的网盘资源。
链接:https://pan.baidu.com/s/1vTzkQEoUKEui0szjeVba3g
提取码:tb80
解压到D盘即可。
3.2 配置环境变量
打开“此电脑”的“属性”,在系统环境变量里添加MAVEN_HOME、追加path环境变量。
参考https://www.cnblogs.com/pengpengdeyuan/p/14217772.html
MAVEN_HOME
D:\apache-maven-3.6.3
Path
%MAVEN_HOME%\bin
结束后用命令mvn -version测试是否安装成功。
3.3 配置仓库路径
设置本地依赖仓库路径。默认是c盘,改到D盘。mvn管理依赖是有中央库和本地库概念,类似于npm源与node_modules一样。
打开D:\apache-maven-3.6.3\conf的setting.xml
修改localRepository标记
<localRepository>D:\Repository</localRepository>
4 下载脚手架
Sping Initializr弄一个脚手架。
左侧命名随意,我是java17,所以勾选该依赖,其它都是默认。
右侧添加三个依赖。第一个依赖含接口开发的各类注解,第二个对接数据库的抽象函数包,第三个是数据库驱动依赖。
# 使用@Controler等各类注解
Spring Web
# 抽象了很多数据库curd操作函数,免写sql代码
Spring Data JPA
# MySQL依赖包,缺它无法对接该数据库
MySQL Driver
Generate下载,得到demo压缩包。
用VSCode打开解压后的代码,pom.xml为根目录,DemoApplication为程序入口文件。
5 开发接口
DemoApplication同级创建三个目录:controller、service、dao。本例子编写创建设备、查设备列表两个接口,演示接口开发过程。
5.1 添加数据库配置
找到resources目录下的application.properties,写入配置。
# 连接MySQL配置
spring.datasource.url=jdbc:mysql://192.168.**.**:3306/XX
spring.datasource.username=root
spring.datasource.password=*****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 自动同步Object对象到数据库表中,这个配置可以定义Entry类,自动去数据库建表
spring.jpa.hibernate.ddl-auto=update
# 控制台打印sql语句
spring.jpa.show-sql=true
5.2 创建DTO实体对象
DTO:data to object,对应数据库表的字段。只要声明变量,可利用IDE自动生成getter、setter。
package com.example.demo.dao;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity /* 标注为DTO实体 */
@Table(name = "T_DEVICE") /* 与数据库对应的表建立联系 */
public class Device {
public Device() {
}
@Id /* 标注为primary key */
@GeneratedValue /* 自动生成,可配置内置的生成策略,也可以引用自定义生成策略 */
private Integer id;
private String name;
private String model;
/* getter setter 略 */
}
5.3 创建Repository
这个对象集成JPA,内置了数据库基本操作函数,简单的增删改查完全可以不用写任何代码,编译阶段框架会扫描JPA,然后会自动补齐操作数据库的细节。
开发者只需要定义接口,定义函数即可。
import org.springframework.stereotype.Repository;
@Repository()
public interface DeviceRepository extends JpaRepository<Device, Long>{
List<Device> findAll(); /* 该函数可以不用声明,JpaRepository已有*/
}
5.4 Service调用数据库
package com.example.demo.service;
import java.util.List;
import com.example.demo.dao.Device;
import com.example.demo.dao.DeviceRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service /* 添加注解,框架编译时会扫描该注解,自动装配依赖 */
public class DeviceService {
@Autowired /* 注意,如果没标注@Service|@Component该声明会装配不上实例 */
DeviceRepository deviceRepository;
public List<Device> getDevices() {
return deviceRepository.findAll();
}
public void createDevice(Device device) {
deviceRepository.save(device); /* 简单的增删改查已在JPA声明 */
}
}
5.5 Controller定义接口
package com.example.demo.controller;
import java.util.List;
import com.example.demo.dao.Device;
import com.example.demo.service.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController() /* 标注组件类型,编译阶段自动装配依赖的实例 */
@RequestMapping("xx") /* 接口前缀 */
public class DeviceController {
@Autowired
DeviceService deviceService;
/* GET请求, /xx/devices路径 查所有设备*/
@RequestMapping(value = "devices", method = RequestMethod.GET)
public List<Device> getDevices() {
return deviceService.getDevices();
}
/* POST请求, /xx/device路径 创建设备 */
@RequestMapping(value = "device", method = RequestMethod.POST)
public ResponseEntity<Device> postDevice(@RequestBody Device device) {
deviceService.createDevice(device);
return ResponseEntity.ok(device);
}
}
运行DemoApplication.main启动程序,默认端口8080。
6 制作镜像
java镜像有多种制作方式,比如利用maven-docker插件,或者利用tomcat为基础镜像等。
这里使用最原始的运行jar方式制作一个镜像包。
原理:java -jar xxx.jar可以执行jar文件。我们打出jar包,然后将jar命令制作到镜像里,创建容器时自动执行该命令,也就达到了启动该应用程序的目的。
6.1 打jar包
根目录命令行执行打包命令,得到demo 0.0.1-SNAPSHOT.jar
mvn package
进入target目录,本地命令行执行
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8080
访问8080端口,看接口是否能正常调用。
6.2 jar上传到服务器上
传到home目录下
scp ./demo-0.0.1-SNAPSHOT.jar root@192.168.**.**:/home
6.3 创建Dockerfile文件
制作镜像需要依赖该文件,我们的文件内只需以java JDK为基础镜像,jar拷贝进镜像里就可以运行'-jar'了。
我工程<java.version>17</java.version>,对应openJDK最新版。
FROM openjdk:latest
ADD demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
创建一个webapp目录,将jar包与Dockerfile文件放在里面,执行下列命令,得到镜像
docker build -t javaweb .
查看镜像
docker images
运行
docker run -itd --name javaweb -p 8981:8080 javaweb
访问
查
Method:GET
Url:http://192.168.**.**:8981/xx/devices
增
Method:POST
Url:http://192.168.**.**:8981/xx/device
QueryBody: {name:string, model:string}

浙公网安备 33010602011771号