【编程】(2)-跨平台跨语言C#、Java、鸿蒙ArkTS三端通用ORM提供者接口

咏方舟-长江支流 2026-07-20

前言

在上篇文章中,我们定义了跨语言通用的实体接口 IEntity<TKey>,为三端数据访问奠定了基础。但仅有实体接口还不够——我们需要一个统一的数据访问入口,让控制器层(或服务层)能够通过同一个接口完成增删改查操作,而不关心底层是静态实体还是动态实体,也不关心具体是哪种数据库。

这就是 IOrmProvider<TKey> 的定位:一个跨语言通用的 ORM 门面接口,让使用者不用关心实现细节,对外暴露“设置实体 → 增删改查”的简洁契约。

三端设计完全一致,接口名、方法名、参数类型三端保持统一,移植时只改语法符号,不改业务逻辑。

C# 端

using UserBaoTech.Foundation.Data;
using UserBaoTech.Foundation.Entities;

namespace UserBaoTech.Foundation
{
    /// <summary>
    /// 作者:长流支流  2026-07-20
    /// ORM 提供者接口 —— 统一的数据访问门面入口
    /// 泛型 TKey 支持 string、int、Guid 或自定义复合主键
    /// C#、Java、鸿蒙 ArkTS 三端通用
    /// </summary>
    /// <typeparam name="TKey">主键类型</typeparam>
    public interface IOrmProvider<TKey>
    {
        /// <summary>
        /// 设置当前操作的实体
        /// </summary>
        /// <typeparam name="T">实体类型,必须实现 IEntity&lt;TKey&gt;</typeparam>
        /// <param name="entity">实体实例</param>
        void SetEntity<T>(T entity) where T : IEntity<TKey>;

        /// <summary>
        /// 插入当前实体
        /// </summary>
        /// <returns>插入后的主键值</returns>
        TKey Insert();

        /// <summary>
        /// 更新当前实体
        /// </summary>
        /// <returns>影响的行数</returns>
        int Update();

        /// <summary>
        /// 删除当前实体
        /// </summary>
        bool Delete();

        /// <summary>
        /// 根据主键查询实体
        /// </summary>
        /// <param name="id">主键值</param>
        IEntity<TKey> GetById(TKey id);

        /// <summary>
        /// 列表查询(分页/过滤/排序)
        /// </summary>
        /// <param name="query">查询参数</param>
        IDataList<IEntity<TKey>> GetList(IQueryParameters query);

        /// <summary>
        /// 获取总记录数
        /// </summary>
        int GetTotal(IQueryParameters query);
    }
}

Java 端

package com.userbaotech.foundation;

import com.userbaotech.foundation.data.IDataList;
import com.userbaotech.foundation.entities.IEntity;
import com.userbaotech.foundation.data.IQueryParameters;

/**
 * ORM 提供者接口 —— 统一的数据访问门面入口
 * 泛型 TKey 支持 String、Integer、Long 或自定义复合主键
 * C#、Java、鸿蒙 ArkTS 三端通用
 */
public interface IOrmProvider<TKey> {

    /**
     * 设置当前操作的实体
     */
    <T extends IEntity<TKey>> void setEntity(T entity);

    /**
     * 插入当前实体
     * @return 插入后的主键值
     */
    TKey insert();

    /**
     * 更新当前实体
     * @return 影响的行数
     */
    int update();

    /**
     * 删除当前实体
     */
    boolean delete();

    /**
     * 根据主键查询实体
     */
    IEntity<TKey> getById(TKey id);

    /**
     * 列表查询(分页/过滤/排序)
     */
    IDataList<IEntity<TKey>> getList(IQueryParameters query);

    /**
     * 获取总记录数
     */
    int getTotal(IQueryParameters query);
}

鸿蒙 ArkTS 端

import { IDataList } from './IDataList';
import { IEntity } from './IEntity';
import { IQueryParameters } from './IQueryParameters';

/**
 * ORM 提供者接口 —— 统一的数据访问门面入口
 * 泛型 TKey 支持 string、number 或自定义复合主键
 * C#、Java、鸿蒙 ArkTS 三端通用
 */
export interface IOrmProvider<TKey> {
    /**
     * 设置当前操作的实体
     */
    setEntity<T extends IEntity<TKey>>(entity: T): void;

    /**
     * 插入当前实体
     * @returns 插入后的主键值
     */
    insert(): TKey;

    /**
     * 更新当前实体
     * @returns 影响的行数
     */
    update(): number;

    /**
     * 删除当前实体
     */
    delete(): boolean;

    /**
     * 根据主键查询实体
     */
    getById(id: TKey): IEntity<TKey>;

    /**
     * 列表查询(分页/过滤/排序)
     */
    getList(query: IQueryParameters): IDataList<IEntity<TKey>>;

    /**
     * 获取总记录数
     */
    getTotal(query: IQueryParameters): number;
}

设计要点

特性 说明
泛型主键 TKey 支持 stringintlongGuid 或自定义复合主键类型,与 IEntity<TKey> 完全对应
统一门面 一个接口涵盖增删改查 + 分页 + 总数,控制器层只需依赖这一个接口
设置即操作 SetEntity<T> 设置当前操作的实体,后续 Insert()Update()Delete() 均操作该实体
三端一致 接口名、方法名、参数类型三端完全相同,移植时只改语法
屏蔽实现 调用方不知道底层是静态实体还是动态实体(XmlMapEntity),也不知道是哪种数据库

IEntity<TKey> 的配合关系

接口 职责
IEntity<TKey> 定义“什么是实体”(有主键)
IOrmProvider<TKey> 定义“如何操作实体”(增删改查)
IQueryParameters 定义“如何查询实体”(分页/过滤/排序)
IDataList<T> 定义“如何返回列表”(跨语言通用列表)

这四个接口构成了用宝框架数据访问层的完整契约体系。

使用示例

C# 控制器调用:

[ApiController]
[Route("api/product")]
public class ProductController : ControllerBase
{
    private readonly IOrmProvider<string> _ormProvider;

    public ProductController(IOrmProvider<string> ormProvider)
    {
        _ormProvider = ormProvider;
    }

    [HttpGet("{id}")]
    public IActionResult GetById(string id)
    {
        var entity = _ormProvider.GetById(id) as Product;
        if (entity == null) return NotFound();
        return Ok(entity);
    }

    [HttpPost]
    public IActionResult Insert([FromBody] Product product)
    {
        _ormProvider.SetEntity(product);
        var id = _ormProvider.Insert();
        return Ok(new { id });
    }
}

Java Spring 控制器调用:

@RestController
@RequestMapping("/api/product")
public class ProductController {
    @Autowired
    private IOrmProvider<String> ormProvider;

    @GetMapping("/{id}")
    public ResponseEntity<Product> getById(@PathVariable String id) {
        Product entity = (Product) ormProvider.getById(id);
        if (entity == null) return ResponseEntity.notFound().build();
        return ResponseEntity.ok(entity);
    }

    @PostMapping
    public ResponseEntity<Map<String, String>> insert(@RequestBody Product product) {
        ormProvider.setEntity(product);
        String id = ormProvider.insert();
        return ResponseEntity.ok(Map.of("id", id));
    }
}

ArkTS 控制器调用(HarmonyOS):

@Controller("/api/product")
export class ProductController {
    private ormProvider: IOrmProvider<string>;

    constructor(ormProvider: IOrmProvider<string>) {
        this.ormProvider = ormProvider;
    }

    @Get("/{id}")
    getById(id: string): Product {
        return this.ormProvider.getById(id) as Product;
    }

    @Post
    insert(product: Product): { id: string } {
        this.ormProvider.setEntity(product);
        const id = this.ormProvider.insert();
        return { id };
    }
}

后续预告

三端通用接口系列持续更新:

敬请关注。


本文链接:https://blog.csdn.net/flygoldfish/article/details/163055868?spm=1001.2014.3001.5501 欢迎转载!


在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐