orm框架

huangluyu 8ad1817255 完善多数据源获取 11 months ago
.idea d149ec2c3b 新增多数据源支持 11 months ago
src 8ad1817255 完善多数据源获取 11 months ago
.gitignore f8c670eb32 Initial commit 1 year ago
BdmOrm.iml a0d53863df 完善了部分Xml读取 11 months ago
LICENSE da6ed6c7bd 添加一些介绍,完善了License文件 1 year ago
README.md 4cfa91f34b 添加了部分文档 1 year 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 语句。