概览

零配置,Dorado的JPA环境直接使用。
基于JPA实现的多数据源智能适配的语言集成查询、修改和删除,以及智能高效的跨多个实体类查询和外键ID转名称。

查询所有数据

    Jpa.linq(User.class).list();
    /*或者*/
    Jpa.findAll(User.class);

按固定条件查询数据

    Jpa
      .linq(User.class)
      .equals("age", 18)
      .ge("salary", 5000)
      .or()
        isTrue("married")
        .equals("deptId", "001")
      .end()
      .list();
      /******************************************************************
       * 近似于:select * from user where arg = 18 and salay >= 5000 and (married=1 or deptid = '001')   
       ******************************************************************/  

按动态条件查询数据

    Jpa
        .linq(User.class)
        .addIf(xxx)
            .quals("age", 18)
        .endIf()
        .select("id", "name")
        .list();

查询部分实体属性

    Jpa
        .linq(User.class)
        .select("id", "name")
        .list();

查询所有数据

    Jpa.linq(User.class).list();
    /*或者*/
    Jpa.findAll(User.class);

分页查询数据

    Jpa.linq(User.class).paging(page);

过滤栏查询数据

    Jpa.linq(User.class).where(criteria).paging(page);

查询一条数据

    User user = Jpa.linq(User.class).equals("id", "001").findOne();
    /*或者*/
    User user = Jpa.getOne(User.class, "001");

查询数据条数

    Long count = Jpa.linq(User.class).count();

判断数据存在

    boolean isExists = Jpa.linq(User.class).exists();

标准持久化数据

    Jpa.persist(user);

标准批量持久化数据

    Jpa.persist(users);

批量智能保存数据(根据EntityState执行对应的persist、merge和remove)

    Jpa.persist(users);

标准更新数据

    Jpa.merge(user);

标准批量更新数据

    Jpa.merge(users);

标准删除数据

    Jpa.remove(user);

标准批量删除数据

    Jpa.remove(users);

条件批量更新数据

    Jpa
        .linu(User.class)
        .le("age", 18)
        .set("salary", 0)
        .update();

条件批量删除数据

    Jpa
        .lind(User.class)
        .le("age", 18)
        .delete();

什么是Dorado JPA?

首先,它是一个Dorado标准Addon。其次,它集成JPA。根据Dorado相关技术特点自然优雅的与JPA结合起来。

特点:

  • 智能适配多数据源
  • 极简设计
  • 方法链式调用
  • 结构化API设计

智能适配多数据源

当你对实体类进行增删改查的时候,不需要关心实体类是属于哪一个数据源,这些对用户是完全透明,Dorado JPA内部会智能帮我们判断。

极简设计

数据密集性系统,往往90%以上的代码是数据库操作有关。所以简化API是极为重要。首先,所以的API入口只有一个,且通过一个名字极短的工具类提供-Jpa。看如下例子(数据的增删改):
以前的话

    @DataResolver
    @Transactional
    public void oldSave(List<User> users) {
        EntityManager em = ......
        for (User user : users) {
            EntityState state = EntityUtils.getState(user);
            if (EntityState.NEW.equals(state)) {
                em.persist(user);
            } else if (EntityState.MODIFIED.equals(state)) {
                em.merge(user);
            } else if (EntityState.DELETED.equals(state)) {
                em.merge(user);
                em.remove(user);
            }
        }
    }

现在的话

    @DataResolver
    @Transactional
    public void save(List<User> users) {
        Jpa.save(users);
    }

方法链式调用

为结构化查询体功能条件。代码更连贯,增强可读性。
如下(分页+过滤栏+部分字段查询+动态条件+固定条件+排序):

    @DataResolver
    @Transactional(readOnly = true)
    public void load(Page<User> page, Criteria criteria, String deptId) {
        Jpa
            .linq(User.class)
            .select("id", "name", "age")
            .where(criteria)
            .addIf(deptId)
                .equal("deptId", deptId)
            .endIf()
            .gt("age", 18)
            .or()
                .isTrue("married")
                .and()
                    .ge("salary", 5000)
                    .le("salary", 2000)
                .end()
            .end()
            .desc("createAt", "name")
            .paging(page);
        /**********************************************************************************************************************************************
         * 当deptId为空时,近似于:select id, name, age from user where arg > 18 and (married=1 or salary >= 5000 and salay <= 2000 order by createat desc, name desc)   
         * 当deptId不为空时,近似于:select id, name, age from user where deptid = xxx arg > 18 and (married=1 or salary >= 5000 and salay <= 2000 order by createat desc, name desc)
         ********************************************************************************************************************************************/
    }

结构化API设计

当我们查询条件很复杂的时候,基于JPA Criteria API 构造条件,简直是场灾难。API不直观,完全没有可读性。而结构化的API能很大程度改善这个问题,因为它的整体代码结构与SQL相仿,单比SQL更优雅,条件的代码书写像语法树一样。如下(递归条件定义):

    ...
    ...
    .equal ...
    .ge ...
    .or()
        .equal ...
        .ge ...
        .and()
            .equal ...
            .ge ...
    ...
    ...
Back to top