目录

1.使用轻量级的基于HuTool的web数据服务

2.实现web简单查询

3.实现鸿蒙前端以及浏览器查询数据库

3.1 数据库准备

3.2 在eclipse中实现web查询

3.2.1 加载Maven依赖

3.2.2 实现web查询

3.3 网址查询

3.4 在DevEco Stdio中实现前端查询(数据是发送给鸿蒙多设备)

3.4.1 核心功能

3.4.2 具体实现步骤

3.5 在HBuilder X中实现前端查询(数据是发送给浏览器)


1.使用轻量级的基于HuTool的web数据服务

步骤一:新建Maven项目,在pom.xml文件中导入hutool依赖

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.38</version>
</dependency>

步骤二:创建Server服务类

package com.hy.chapter2;

import java.nio.charset.Charset;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;

public class Server {

	public String loadHelloWorld() {
		return "欢迎使用轻量级的基于HuTool的web数据服务";
	}

	public static void main(String[] args) {

		HttpUtil.createServer(8650).addAction("/query", (request, response) -> {

			Server server = new Server();
			String result = server.loadHelloWorld();

			response.setCharset(Charset.forName("UTF-8"));

			response.write(result, ContentType.TEXT_PLAIN.toString());

		}).start();

	}

}

输出结果:

Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8650】

2.实现web简单查询

步骤一:加载Maven依赖

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.38</version>
</dependency>

步骤二:实现web查询

package com.hy.javawebdata.server;

import java.nio.charset.Charset;

import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.server.SimpleServer;

public class ServerData {
	
	SimpleServer simpleServer = null;
	
	public ServerData(int port) {
		simpleServer = HttpUtil.createServer(port);
		
		//启动这个服务
		simpleServer.start();
	}
	
	public void loadStuService() {
		simpleServer.addAction("/querystuall", (request,response)->{
			response.setCharset(Charset.forName("UTF-8"));
			response.write("你好,学生",ContentType.TEXT_PLAIN.toString());
		});
	}
	
	public void loadEmpService() {
		simpleServer.addAction("/queryempall", (request,response)->{
			response.setCharset(Charset.forName("UTF-8"));
			response.write("你好,员工",ContentType.TEXT_PLAIN.toString());
		});
	}
	

}
package com.hy.chapter3;

import com.hy.javawebdata.server.ServerData;

public class App {
	
	public static void main(String[] args) {
		ServerData serverData = new ServerData(8891);
		serverData.loadStuService();
		serverData.loadEmpService();
	}

}

运行结果:

Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8891】

网址显示成功:

3.实现鸿蒙前端以及浏览器查询数据库

3.1 数据库准备

CREATE TABLE t_emp(
	eid int PRIMARY KEY auto_increment, -- 员工的编号
	ename VARCHAR(20) NOT NULL, -- 员工的姓名
	epwd CHAR(8) NOT NULL, -- 员工的密码
	ebirthday datetime, -- 员工的出生年月,不设计年龄字段,会造成字段冗余
	esalary DOUBLE NOT NULL, -- 员工的工资
	eaddress VARCHAR(100) -- 员工的地址
)

-- 表设计的三范式
-- 第一:表中的字段不能再分割,是原子化。
-- 第二:表中的字段不能有传递性,不能通过一个字段计算出另外一个字段。
-- 第三:表中的字段参照唯一的主键

-- 预置数据
INSERT INTO t_emp(ename,epwd,ebirthday,esalary,eaddress)
values("赵五","11111","2000-05-28",90000.56,"南京");

INSERT INTO t_emp(ename,epwd,ebirthday,esalary,eaddress)
values("李六","22222","2004-06-15",88000.69,"盐城");

SELECT * FROM t_emp

SELECT count(ename) from t_emp WHERE ename = "李六" AND epwd = "22222"

3.2 在eclipse中实现web查询

3.2.1 加载Maven依赖

在pom.xml文件中导入依赖,按Ctrl+S保存并加载依赖

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.24</version>
</dependency>

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.38</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.83</version>
</dependency>

3.2.2 实现web查询

(1)这套代码是一个轻量级 Java Web 数据服务的完整实现,基于 Hutool 轻量级 HTTP 服务JDBC 数据库操作。

(2)核心功能是:启动 HTTP 服务(端口 8891),对外提供 /queryempall 接口,查询 MySQL 中 t_emp 表的员工数据,并以 JSON 格式返回给客户端(如浏览器、前端)。

(3)类在包中的分布如下:

(4)具体实现步骤:

步骤一:定义数据访问层:com.hy.javawebdata.dao ,负责 “与数据库交互”,封装 JDBC 操作,对外提供数据访问接口

① 创建接口 IDao,用于规范数据修改

package com.hy.javawebdata.dao;

public interface IDao {
    // 无参数的修改操作(如固定SQL的插入/更新)
    public int modifyDatas();
    // 带参数的修改操作(如动态SQL的插入/更新,参数用Object[]传递)
    public int modifyDatas(Object[] params);
}

② 创建抽象类 AbstractDao,用于封装通用数据库逻辑

package com.hy.javawebdata.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public abstract class AbstractDao {
    // 受保护的数据库连接对象(子类可直接使用)
    protected Connection conn;

    // 构造函数:初始化时自动连接数据库(JDBC 核心流程)
    public AbstractDao() {
        try {
            // 1. 加载 MySQL 8.0+ 驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2. 获取数据库连接(URL、用户名、密码硬编码,后续需优化)
            this.conn = DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/mysql2025", 
                "root", 
                "yourpassword"
            );
        } catch (ClassNotFoundException e) {
            e.printStackTrace(); // 驱动未找到(如jar包未导入)
        } catch (SQLException e) {
            e.printStackTrace(); // 连接失败(如URL错误、密码错误)
        }
    }

	public Object[][] queryDatas(String tableName) {

		Object[][] datas = null;

		// 步骤1:查询表的总记录数(确定二维数组的行数)
		String sql1 = "select count(*) from " + tableName;
		try {
			PreparedStatement pstmt1 = conn.prepareStatement(sql1);
			ResultSet rs = pstmt1.executeQuery();
			int row = 0;
			while (rs.next()) {
				row = rs.getInt(1); // 获取count(*)结果
			}

			// 步骤2:查询表的所有记录(获取数据)
			String sql2 = "select * from " + tableName;
			PreparedStatement pstmt2 = conn.prepareStatement(sql2);
			ResultSet rs1 = pstmt2.executeQuery();

			// 步骤3:通过元数据获取列数(确定二维数组的列数)
			ResultSetMetaData rsmd = rs1.getMetaData();
			int column = rsmd.getColumnCount();

			// 步骤4:初始化二维数组,填充数据
			datas = new Object[row][column];
			int rowIndex = 0;

			while (rs1.next()) {
				for (int i = 0; i < column; i++) {
					// JDBC列索引从1开始,二维数组从0开始
					datas[rowIndex][i] = rs1.getObject(i + 1);
				}
				rowIndex++;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			this.closeConn();
		}
		return datas;
	}

	// 设计关闭连接对象的方法,连接对象占用内存空间,操作一次数据库,关闭一下,保证内存安全。
	public void closeConn() {
		if (null != conn) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}

步骤二:定义JSON 规范层:com.hy.javawebdata.json

创建接口 IJSONData,用于定义 JSON 转换规范

package com.hy.javawebdata.json;

public interface IJSONData {
    // 方法:将二维数组转为JSON字符串(参数:数据库查询的二维数组,返回:JSON字符串)
    public String makeJsonData(Object[][] datas);
}

 步骤三:定义员工业务层:com.hy.javawebdata.emp ,该层是 “员工业务” 的具体实现,包含 “员工数据访问(EmpDao)”“接口绑定(EmpAction)”“JSON 转换(EmpJsonData)” 三个核心组件。

① 创建类EmpDao:员工数据访问实现类

package com.hy.javawebdata.emp;

import com.hy.javawebdata.dao.AbstractDao;
import com.hy.javawebdata.dao.IDao;

public class EmpDao extends AbstractDao implements IDao {
    // 实现IDao的无参数修改方法(当前未实现具体逻辑,返回0)
    @Override
    public int modifyDatas() {
        return 0;
    }

    // 实现IDao的带参数修改方法(当前未实现具体逻辑,返回0)
    @Override
    public int modifyDatas(Object[] params) {
        return 0;
    }
}

② 创建类EmpJsonData:员工数据 JSON 转换实现类

package com.hy.javawebdata.emp;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hy.javawebdata.json.IJSONData;

public class EmpJsonData implements IJSONData {
	// 实现IJSONData接口:将员工表的二维数组转为JSON字符串
	@Override
	public String makeJsonData(Object[][] datas) {
		JSONArray arrays = new JSONArray(); // FastJSON的JSON数组容器

		// 遍历二维数组的每一行(每一行对应一条员工记录)
		for (int i = 0; i < datas.length; i++) {
			JSONObject obj = new JSONObject(); // 每条记录对应一个JSON对象
			// 手动绑定“字段名-值”(字段名需与t_emps表的列名一致)
			obj.put("eid", datas[i][0]);
			obj.put("ename", datas[i][1]);
			obj.put("epwd", datas[i][2]);
			obj.put("ebirthday", datas[i][3]);
			obj.put("esalary", datas[i][4]);
			obj.put("eaddress", datas[i][5]);

			arrays.add(obj); // 将JSON对象加入JSON数组
		}
		return arrays.toString(); // 转为JSON字符串返回
	}
}

③ 创建类EmpAction:员工接口绑定类

package com.hy.javawebdata.emp;

import java.nio.charset.Charset;

import com.hy.javawebdata.dao.AbstractDao;
import com.hy.javawebdata.json.IJSONData;

import cn.hutool.http.ContentType;
import cn.hutool.http.server.SimpleServer;

public class EmpAction {
    private SimpleServer simpleServer; // Hutool的轻量级HTTP服务器实例

    // 构造函数:接收服务器实例,初始化接口绑定
    public EmpAction(SimpleServer simpleServer) {
        this.simpleServer = simpleServer;
        this.queryEmpService(); // 绑定/queryempall接口
    }

    // 绑定接口:/queryempall → 查询所有员工数据
    public void queryEmpService() {
        simpleServer.addAction("/queryempall", (request, response) -> {
            // 1. 设置响应编码:UTF-8,避免中文乱码
            response.setCharset(Charset.forName("UTF-8"));

            // 2. 调用数据库查询员工数据(t_emp表)
            AbstractDao dao = new EmpDao();
            Object[][] datas = dao.queryDatas("t_emp");

            // 3. 将二维数组转为JSON字符串
            IJSONData jsonConverter = new EmpJsonData();
            String jsonData = jsonConverter.makeJsonData(datas);

            // 4. 写入响应:返回JSON数据,指定响应类型为application/json
            response.write(jsonData, ContentType.JSON.toString());
        });
    }
}

步骤四:定义服务启动层:com.hy.javawebdata.server

创建类 ServerData,用于创建 HTTP 服务并初始化业务

package com.hy.javawebdata.server;

import com.hy.javawebdata.emp.EmpAction;

import cn.hutool.http.HttpUtil;
import cn.hutool.http.server.SimpleServer;

public class ServerData {
    SimpleServer simpleServer; // Hutool的HTTP服务器实例

    // 构造函数:指定端口,创建服务器并初始化
    public ServerData(int port) {
        // 1. 创建HTTP服务器(端口由外部传入,灵活配置)
        simpleServer = HttpUtil.createServer(port);
        // 2. 初始化业务动作(绑定接口)
        this.initAction();
        // 3. 启动服务器(阻塞线程,保持服务运行)
        simpleServer.start();
    }

    // 初始化业务动作:创建EmpAction,绑定员工接口
    public void initAction() {
        // 注:此处可优化为工厂模式,避免new关键字直接创建对象
        new EmpAction(simpleServer);
    }
}

步骤五:定义程序入口层:com.hy.chapter4

创建类 App,作为程序启动入口

package com.hy.chapter4;

import com.hy.javawebdata.server.ServerData;

public class App {
    public static void main(String[] args) {
        // 创建ServerData实例,指定端口8891,启动服务
        ServerData serverData = new ServerData(8891);
    }
}

运行结果:

Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8891】

3.3 网址查询

3.4 在DevEco Stdio中实现前端查询(数据是发送给鸿蒙多设备)

3.4.1 核心功能

在页面即将显示时,延迟 3 秒发起 HTTP 请求,调用后端接口,获取员工数据并打印日志。

3.4.2 具体实现步骤

步骤一:新建Ability项目,在module.json5文件中添加网络许可:

"requestPermissions": [
  {
    "name": 'ohos.permission.INTERNET'
  },
],

步骤二:在桌面按住Win+R键,在弹窗中输出cmd,打开命令提示符,输入ipconfig找到IPv4地址

步骤三:在DevEco Stdio的Ability项目中中创建Index.ets文件

import {http} from "@kit.NetworkKit"
@Entry
@Component
struct Index {

  aboutToAppear(): void {
    setTimeout(()=>{
      let httpRequest = http.createHttp();
      // 192.168.10.5 替换为自己的IPV4地址
      httpRequest.request("http://192.168.10.5:8891/queryempall",(errors,datas)=>{
        if(!errors){
          let resultDatas = datas.result;
          console.log("数据为:" + resultDatas);
        }
      })
    },3000)
  }

  build() {
    Column(){

    }.width("100%").height("100%").backgroundColor("#aabbcc")
  }
}

步骤四:运行成功后查看日志

3.5 在HBuilder X中实现前端查询(数据是发送给浏览器)

跨域查询失败,暂不学习

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐