【编程】(2)-跨平台跨语言C#、Java、鸿蒙ArkTS三端通用ORM提供者接口
·
【编程】(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<TKey></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 支持 string、int、long、Guid 或自定义复合主键类型,与 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 };
}
}
后续预告
三端通用接口系列持续更新:
- 第(1)篇:三端通用实体接口
IEntity<TKey>✅ - 第(2)篇:三端通用ORM提供者接口
IOrmProvider<TKey>✅ - 第(3)篇:三端通用数据字典接口
IDataDictionary - 第(4)篇:三端通用数据列表接口
IDataList - 第(5)篇:三端通用数据访问执行器
IDataAccessExecutor
敬请关注。
本文链接:https://blog.csdn.net/flygoldfish/article/details/163055868?spm=1001.2014.3001.5501 欢迎转载!
–
更多推荐


所有评论(0)