天天看点

ORM 源码分析,API 为什么这样设计

ORM源码分析,API为什么这样设计!

一文让你深入了解ORM

Database operation: Suid (select,update,insert,delete),

数据库的常用操作:查改增删(select,update,insert,delete).

以下简称SUID,有的使用CRUD,但SUID更能体现其与SQL的对应关系。

实例说明,使用的表:

users表(id (bigint), name(varchar), age(int), remark(varchar))

1.接口概述

Suid包含基本的SUID操作;

SuidRich是包括丰富的SUID操作,且SuidRich继承自Suid接口;

2.记录的条件限定

默认是将实体中不是null和不是空字符的字段转为条件(运算符号默认是=);

当默认情况不能满足时,主要使用IncludeType,Condition两个接口,定义复杂的条件。

IncludeType 声明包含或排除null,空字符。

Condition 中,常用的是Condition op(String field, Op op, Object value),

可以构造SQL对应的表达式,像:age>=20 ,

name!="李四"等;

Op可以使用多种运算符,包括in,like等; 表达式是:

字段名称 运算符 值

Condition的op方法,就是使用这种顺序;字段名称(Javabean里的属性名称)会使用配置的命名

规则转换成数据库表的列名。

Suid,SuidRich接口中的方法,参数类型是Condition,IncludeType的使用基本是一样的;

需要注意的是:

The methods setMultiply,setAdd,set just use in SQL Update 'set' part,

setMultiply,setAdd,set等方法仅用于SQL Update语句的set部分.

3. Suid,SuidRich接口分类

3.1

Suid 中,对应SUID有四个最简单的方法,分别对应实现的查改增删;

过滤条件(select,delete 对应SQL的where过滤条件)或者插入值(insert)就从实现中取值(默认只取非null,非空字符)。

而update比较特别,它是为了更新记录,所以需要声明更新的信息和作为过滤条件的信息;update方法中,默认是id作为过滤条件,

其它非null,非空字符作为update set需要设置的值。

List<T> select(T entity);  //返回实体的List;

其它三个,返回更新的行数:

int update(T entity);

int insert(T entity);

int delete(T entity);

当插入方法想返回插入记录的id时,使用:

long insertAndReturnId(T entity);

3.2

当默认条件只处理非null,非空字符字段,不能满足需求时,

可以在SuidRich中使用带IncludeType参数的方法。

如:

public <T> int insert(T entity,IncludeType includeType);

当要使用更复杂的过滤条件时,可以使用带Condition的方法;

select(T entity, Condition condition);

delete(T entity, Condition condition);

4.细说select

select的返回值分为4类:

a)

List<T> select(..), 

List<T> selectByIds(..),

b)

String selectJson(..),

c)

List<String[]> selectString(..),

d)

T selectById(..),

T selectOne(..),

T selectFirst(..),

相关的有:

int count(..), //统计数量

boolean exist(..), //判断是否存在

select有分页,声明只查询部分字段,排序,聚合函数

使用 Condition 也是可以构造出这些条件或需求;

为了方便使用,有些select类型,提供了直接使用的法,

分页:

List<T> select(T entity, int start, int size);

只查询部分字段:

List<T> select(T entity, String... selectFields);

排序:

List<T> selectOrderBy(T entity,String orderFields,OrderType[] orderTypes);

聚合函数(一次只查一个,查多个,可以使用Condition):

selectWithFun(T entity, FunctionType functionType, String fieldForFun)

5.delete相关的方法

int delete(T entity, Condition condition);

int delete(T entity,IncludeType includeType);

int deleteById(Class c, Long id);

6.insert相关的方法及批量插入

单个实现(单条记录)插入的方法有:

int insert(T entity);

long insertAndReturnId(T entity);

long insertAndReturnId(T entity,IncludeType includeType);

int save(T entity);// 有则更新,无则插入; 能确认是插入时,使用insert效率更高;

批量插入

int insert(T[] entity,int batchSize,String excludeFields);

int insert(List<T> entityList,int batchSize,String excludeFields);

数据可以使用数组或List方式给出;batchSize是指定一批处理的大小,excludeFields是

声明某些字段不需要插入到数据库(对整个批次都是有效的)。后面这两个参数,可以

只指定某一个,从而派生出相关的不同方法。

批处理,返回的受影响记录数,未必与记录数量一样,因为可能由于主键冲突,约束冲突时,

只插入了部分记录。

7.关于modify(update,insert,delete)的异常

当更改不成功时,框架处理了一些异常(像主键冲突,约束冲突),默认会返回0;

若希望所有异常都抛出,由上层捕获,可通过配置设置开关。

#是否捕获单条插入时的重复键异常  V1.11; 默认false 由框架处理; false process by Bee

#bee.osql.notCatchModifyDuplicateException=false

#是否不显示单条插入时的重复键异常  V1.11  默认显示

#bee.osql.notShowModifyDuplicateException=false

7.update

SQL UPDATE语句包括两大部分SET和WHERE,SuidRich采取指定其中一样,另一样尽量采用默认的实现方式.所以有关更新的方法分为两大种类:

update和updateBy.

update方法中,String updateFields参数(若有),可以指明要更新的字段,其余字段则有可能转为SQL UPDATE语句的WHERE部分(默认过

滤NULL和空字符串,可通过IncludeType显示设置).

updateBy方法中,String whereFields(若有),可以指明用于SQL中WHERE的字段.当指定了whereFields, 没在whereFields的字段,将默认

转换为SQL UPDATE语句的SET部分(默认过滤NULL和空字符串,可通过IncludeType显示设置).

同一个实体的某个属性的值,若用于WHERE部分了,再用于UPDATE SET部分就没有意义(因为此时它们的值是一样的),但可以用Condition的

set(String fieldName, Number num)等方法设置;Condition的方法set,setMultiply,setAdd,setWithField,是在处理WHERE字段前

已完成处理的,所以不受指定的WHERE条件字段的影响.

update和updateBy方法的Condition设置的字段都会被解析,不受IncludeType的限制,也不受updateFields参数和whereFields参数的影响.

Bee默认是不处理Javabean属性为空字符和null的属性的,即只处理除了这两种以外的属性,且它默认是被转为=的;

要是不能满足需求,只能使用Condition, 而Condition的条件是肯定会转换的(因为你显式声明了);

Condition.op会转到where部分;Condition.set及setMultiply,setAdd方法则可用于update的set部分.

setMultiply,setAdd,set等方法仅用于SQL Update语句的set部分.

op(String field, Op op, Object value)会转换到SQL的where部分(此方法不能用于SQL的update set).

ORM Bee Sharding 分库分表就是那么简单,对开发透明,不影响业务,简单易用,文件小,性能好;支持 Mongodb,支持 JDBC,还支持 Android 和 Harmony。

Bee,互联网新时代的 Java ORM 工具,更快、更简单、更自动,开发速度快,运行快,更智能

源码下载:

https://github.com/automvc/bee