Java API开发入门指引

Java开发与前端开发极其类似,Java的通用构建工具maven对应前端npm;依赖管理pom.xml对应package.json;当然也有脚手架Sping Initializr等等。

Web接口操作数据库大致经历如下步骤:

graph TB Web--http-->Controller Controller-->Service Service-->DAO Repository-.->DAO Repository--driver-->DB[(DataBase)]

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}
posted @ 2021-12-14 15:00  乐小天  阅读(657)  评论(0)    收藏  举报