orm框架

huangluyu 8ad1817255 完善多数据源获取 9 months ago
.idea d149ec2c3b 新增多数据源支持 9 months ago
src 8ad1817255 完善多数据源获取 9 months ago
.gitignore f8c670eb32 Initial commit 10 months ago
BdmOrm.iml a0d53863df 完善了部分Xml读取 10 months ago
LICENSE da6ed6c7bd 添加一些介绍,完善了License文件 10 months ago
README.md 4cfa91f34b 添加了部分文档 10 months ago

README.md

BDM ORM

一个功能简单的小型 SQL 生成器 by 大仙

功能介绍

  1. 链式 SQL 拼接

    传统的 SQL 拼接,无论是 SQL 还是 HQL,都需要大量的字符串合并操作,代码较为凌乱,逻辑散落各处,很难看清楚完整的逻辑内涵。链式查询的意义在于,使用一条语句完成所有的 SQL 拼接操作,比起传统的 SQL 字符串拼接来说,链式查询的查询逻辑看上去更加完整,一目了然。

  2. 导出 SQL

    提供了一系列 API 用于导出SQL,与其他 ORM 框架结合。

  3. Model字段限制(开发中)

    通过注解,从逻辑层面进行对数据表的指定字段进行一系列的限制。包括,限制读取,限制修改,限制长度等。

开始一个查询

  1. 设置 Model 类,在注解中配置其数据库、数据表及字段,并继承自 BaseModel,且 package 中需要包含 model 或者 models。如 Person 类所示:

    package com.huangluyu.test.model;
        
    import com.huangluyu.bdmorm.annotation.model.PrimaryKey;
    import com.huangluyu.bdmorm.annotation.model.TableField;
    import com.huangluyu.bdmorm.annotation.model.TableName;
    import com.huangluyu.bdmorm.base.BaseConstructor;
    import com.huangluyu.bdmorm.base.BaseModel;
        
    @TableName("person")
    @PrimaryKey("id")
    @TableField({"id", "name", "age"})
    public class Person extends BaseModel {
        
    }
    
  2. 在业务代码中执行链式查询。如:

    public class Demo {
        public static void main(String[] args) {
            Person person = (Person) Table.init(Person.class)
                    .leftJoin("person_info pi", "person.id", "pi.id")
                    .where(Where.init("person.name", "=", "xiaoMing")
                    .orWhere("person.id", "=", "1"))
                    .andWhere("pi.password", "!=", null)
                    .getOne();
        }
    }
    

    你会得到一个返回值组成的的 HashMap。

  3. 支持链式子查询。如:

    public class Demo {
        public static void main(String[] args) {
            List<BaseModel> sql = Table.select("person.*")
                    .from(Table.select("name", "id")
                           .from(Person.class), "person")
                    .leftJoin(PersonInfo.class, "person.id", "pi.id", "pi")
                    .where(Where.init("person.name", "=", "xiaoMing")
                           .orWhere("person.id", "=", "1"))
                    .andWhere("pi.password", "!=", null)
                    .andWhere("person.id", "=",
                           Table.select("id")
                                   .from("person")
                                   .where("person.id", "=", "1"))
                    .get();
        }
    }
        
    

    你会得到下列查询 SQL 产生的结果(MySQL)。

    SELECT
        person.*
    FROM (
        SELECT
            name, id
        FROM person
        WHERE null.id != '666'
    ) person
    LEFT JOIN person_info pi ON person.id = pi.id
    WHERE (
        person.name = 'xiaoMing'
        AND person.id = '1'
    )
    AND pi.password IS NOT NULL
    AND person.id = (
        SELECT
            id
        FROM person
        WHERE person.id = '1'
    )
    

使用简介

开始构建

使用 Table.from() 或者 Table.select("*").from() 开始一段查询,可以将select语句放到from语句的后面,如Table.from().select(),或者将from放到任何位置,但必须要通过from来指定查询来源,更多的信息将在下面进行介绍。

public class Demo {
    public static void main(String[] args) {
        BaseConstructor constructor = null;
        constructor = Table.from(Person.class);
        constructor = Table.select("*").from(Person.class);
    }
}

该方法会返回一个 BaseConstructor 的对象,该对象是链式查询的基础。该接口的默认实现类为DefaultConstructor

使用 select 构建查询内容

BaseConstructorselect(String... fields) 方法接收一个可变长度的参数,每一项为需要读取的字段。

可以对其增加别名,如:

public class Demo {
    public static void main(String[] args) {
        BaseConstructor constructor = Table.from(Person.class)
            .select("person.id p_id");
    }
}

其中person为表名,id为字段名,p_id为别名。别名与字段名用单个空格进行分格,勿需使用 AS 进行标识。如果字段没有指定相应的 Table,将会默认按照 JOIN 的顺序默认指定第一个符合的Table,故下例等价于上例:

public class Demo {
    public static void main(String[] args) {
        BaseConstructor constructor = Table.from(Person.class)
            .select("id p_id");
    }
}

如果未指定 select的字段,将默认以select("*")来执行,

使用 from 指定查询来源

BaseConstructorfrom方法有三种传参形式:

  1. BaseModel子类的Class

    public class Demo {
        public static void main(String[] args) {
            BaseConstructor constructor = Table.from(Person.class);
        }
    }
    
  2. BaseModel子类的Class所注册的表名:

    public class Demo {
        public static void main(String[] args) {
            BaseConstructor constructor = Table.from("person");
        }
    }
    
  3. 另一个BaseConstructor对象,该方法为子查询提供支持:

    public class Demo {
        public static void main(String[] args) {
            BaseConstructor constructor = Table.from(Table.from(Person.class));
        }
    }
    

    与其他方法不同的是,每一个BaseConstructor构建器必须调用from方法来指定目标,而其他方法均有默认值。

使用 where 构建查询条件

使用 orderBy 构建排序条件

使用 join 与其他表进行关联

导出 SQL

BaseConstructor 中提供了 getSql()getValueList() 方法来获取 SQL 及其参数列表。参数列表是一个由 Object 组成的 LinkedList。使用 getSqlWithValue() 将获得可供执行的 SQL 语句。