Entity - D 语言的 ORM 框架


Apache
跨平台
D语言

软件简介

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);
}