EntityD 语言的 ORM 框架

联合创作 · 2023-09-30 01:50

Entity 是 D 语言( DLang )数据库操作 ORM 框架,设计参照 javax JPA 实现,具有很好的扩展性和规范性,数据库驱动依赖 HuntLabs 开发的 database for dlang


特性



  1. 实现了完整的 CriteriaQuery 支持


  2. Repository 也有部分封装


  3. 完全对象化查询,不用考虑底层数据库驱动


  4. 实现 EQL(Entity Query Language)实现对象化 SQL 查询语言



支持的数据库



  • PostgreSQL 9.0+


  • MySQL 5.1+



使用示例


import hunt.entity;

@Table("users")
class User : Entity
{
@PrimaryKey
@AutoIncrement
int id;

string name;
double money;
string email;
bool status;
}

void main()
{
DatabaseOption options = new DatabaseOption("mysql://root:123456@localhost:3306/huntblog?charset=utf-8");
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", options);
EntityManager em = entityManagerFactory.createEntityManager();

// begin transaction
em.getTransaction().begin();

// define your database existing row id in here
int id = 10;

auto user = em.find!User(id);
log("User name is: ", user.name);

// commit transaction
em.getTransaction().commit();

em.close();
entityManagerFactory.close();
}

Insert row


    auto user = new User();
user.name = "Brian";
user.email = "brian@huntlabs.cn";
user.money = 99.9;

// insert user
em.persist(user);
log("User id is: ", user.id);

Delete row


    int n = em.remove!User(id);
log("The number of users deleted is: ", n);

Update row


    auto user = em.find!User(id);
log("User name is: ", user.name);
user.name = "zoujiaqing";
em.merge!User(user);
log("The number of users updated is: ", n);

Use CriteriaQuery to find


    // create CriteriaBuilder object from em
CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery!User criteriaQuery = builder.createQuery!User;
Root!User root = criteriaQuery.from();
Predicate p1 = builder.equal(root.User.id, id);
TypedQuery!User typedQuery = em.createQuery(criteriaQuery.select(root).where(p1));

auto user = typedQuery.getSingleResult();

log("User name is: ", user.name);

Use CriteriaQuery to Multi-condition find


    // create CriteriaBuilder object from em
CriteriaBuilder builder = em.getCriteriaBuilder();

CriteriaQuery!User criteriaQuery = builder.createQuery!User;
Root!User root = criteriaQuery.from();

Predicate p1 = builder.lt(root.User.id, 1000); // User id is less than 1000.
Predicate p2 = builder.gt(root.User.money, 0); // User money is greater than 0.
Predicate p3 = builder.like(root.User.name, "z%"); // User name prefix is z.

TypedQuery!User typedQuery = em.createQuery(criteriaQuery.select(root).where(builder.and(p1, p2), p3));
User[] users = typedQuery.getResultList();

log("The number of users found is: ", users.length);

EQL 使用


// Example for sample SELECT
auto query = em.createQuery!(User)("SELECT u FROM User u");

foreach(user; query.getResultList())
{
logDebug(user.name);
}

 

浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报