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

205 篇文章 0 订阅
47 篇文章 0 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值