Eloquent ORM for Java
- 注册配置 Configuration
- 数据映射 Mapping
- 数据模型 Model
- 查询结果集 Record
- 查询构造器 Query Builder
- 生成代码 Generate
- 关联关系 Relationship
- GraalVM
- 版本信息 Version
参照 a.b.c 方式, 例如 1.0.11 版本
主版本号 a :第一个数字,产品改动较大,一般无法向前兼容(要看具体项目)
子版本号 b :第二个数字,增加了新功能,一般情况下向前兼容, 可能存在小部分不兼容情况
修正版本号 c :第三个数字,修复 BUG,向前兼容
- 在
Builder
中, 集合类位操作的相关的方法,havingBitIn()
,havingBitNotIn()
,havingBitStrictIn()
,havingBitStrictNotIn()
由数据库逻辑实现, 改为数据库位操作实现
- 修复, 在
SpringBoot
中同时使用Mybatis
时,Mybatis
所持有的事务外的产生的的数据库链接, 无法正常释放的问题
- 修复, 在
SpringBoot
中使用事务注解时, 事务提交可能异常失败的问题 - 部分依赖升级
- 在
Builder
中, 增加了部分方法,whereNot()
,havingNot()
,havingAnyLike()
,havingAllLike()
,whereAnyLike()
,whereAllLike()
- 在
Builder
中, 移除了部分方法,havingKeywordsIgnoreNull()
,whereKeywordsIgnoreNull()
- 在
Builder
中, 更名了部分方法,whereLikeIgnoreNull()
->whereLike()
- 在
Builder
中, 增加了位操作的相关的方法,havingBit()
,havingBitNot()
,havingBitIn()
,havingBitNotIn()
,havingBitStrictIn()
,havingBitStrictNotIn()
- 在
Builder
中, 增加了位操作的相关的方法,whereBit()
,whereBitNot()
,whereBitIn()
,whereBitNotIn()
,whereBitStrictIn()
,whereBitStrictNotIn()
,dataBit()
,dataBitIncrease()
,dataBitDecrease()
- 在
@Column
中, 增加conversion
接口的通用位处理FieldConversion.Bit
- 在
Model
中, 修改了定义事件的相关的方法名 (原retrieved
,creating
,created
,updating
,updated
,saving
,saved
,deleting
,deleted
,restoring
,restored
) , 使之更不易混淆, 并在数据模型 Model中提示事件触发次序 - 在
Model
中, query 相关事件方法以eventQuery
为方法前缀, 包含eventQueryRetrieving
,eventQueryRetrieved
,eventQueryRetrieved
,eventQueryCreating
,eventQueryCreated
,eventQueryUpdating
,eventQueryUpdated
,eventQueryDeleting
,eventQueryDeleted
,eventQueryRestoring
,eventQueryRestored
- 在
Model
中, record 相关事件方法以recordQuery
为方法前缀, 包含eventRecordRetrieved
,eventRecordRetrieved
,eventRecordCreating
,eventRecordCreated
,eventRecordUpdating
,eventRecordUpdated
,eventRecordDeleting
,eventRecordDeleted
,eventRecordRestoring
,eventRecordRestored
- 在代码生成中, 增加对 javax 以及 jakarta 的兼容
- 支持 SpringBoot3 以及 java17
- 优化
- 在
@Column
中, 对fill
增加可选实现,FieldFill.CreatedTimeFill.class
/FieldFill.UpdatedTimeFill.class
分别在 ORM 的 insert/update 时, 对时间类型的字段进行当前时间的填充
- 增强在多个事务管理器, 同时存在时的兼容性
- 在
Builder
中, 增加count
对于非group
下的自定义select
的支持, 同步影响paginate
等分页等函数
- 支持多态关联关系 Relationship, 对于
@hasOneOrMany
,@belongsTo
,@belongsToMany
增加多态属性 - 支持关联集合查询, 在
Builder
中, 增加withCount()
,withMax()
,withMin()
,withAvg()
,withSum()
- 支持关联反向筛选, 在
Builder
中, 增加whereHas()
,whereNotHas()
- 支持自定义关联关系 Relationship, 增加
@Relation
用于标注自定义的关联关系 Relationship注解, 并指明其解析器
- 优化
@HasOneOrMany(),@BelongsTo(),@BelongsToMany()
的实现 - 关联关系 Relationship定义时, 对于复数关系, 在原本仅支持
List<F>
的基础上, 增加数据类型支持F[]
/ArrayList<F>
/LinkedHashSet<F>
/LinkedList<F>
/Set<F>
- 在
Builder
中, 增加setBuilder(builder)
/mergerBuilder(builder)
- 接口(
Record
/RecordList
/Builder
)实现序列化接口,以支持 RPC 传递
- 优化
FieldConversion.EnumInteger
/FieldConversion.EnumString
的实现 - 优化
代码生成
, 在生成的entity
上增加@Accessors(chain = true)
- 在
@Column
中, 增加conversion
接口的泛型约束, 并增加通用枚举处理FieldConversion.EnumInteger
/FieldConversion.EnumString
- 在
Builder
中, 修改使用entity
作为参数的操作, 在保持相同语义(获取/填充/序列化)的前提下, 不再修改(回填)传入的entity
- 在
Record
中, 保持使用ORM
风格的操作依然对所持有的entity
进行同步修改(回填)
- 在
Model
中, 增加原生异步执行nativeQueryListAsync
,nativeQueryAsync
,nativeQueryOrFailAsync
,nativeExecuteAsync
,nativeExecuteGetIdsAsync
,nativeExecuteGetIdsAsync
- 在
Builder
中, 增加异步闭包事务transactionAsync
- 修复
Generator
中, 当对于spring环境下生成的代码有误的问题
- 代码优化
- 在
@Column
中增加了json
的支持, 需要手动引入下相关的jackson
依赖
- 在
database-spring-boot-starter
中支持了graalVM的构建, 需要手动在配置类上增加对应的注解, 详见文档
- 实体代码生成时, 增加更多一种的风格作为选择
-
在
Record
中, 增加saveByPrimaryKey()
, 更改fillEntity()
返回值 -
查询结果集 Record(
RecordList
) 现在是LinkedList
的子类, 而非之前的的ArrayList
, 同时更改了pop()
/push(element)
的行为, 并移除了prepend(element)
-
在
Builder
中, 增加select(anyEntity)
,select(anyEntityClass)
更改where(entity)
为where(anyEntity)
,having(entity)
为having(anyEntity)
返回值 -
在
Builder
中, 增加whereFind(map)
,whereNotFind(map)
,whereNotLike(column, value)
,whereNotLike(anyEntity)
,whereNotLike(map)
,whereMayNotLike(column, value)
,whereMayNotLikeIgnoreNull(column, value)
,whereMayNotLike(anyEntity)
,whereMayNotLike(map)
,whereMayNotLikeIgnoreNull(map)
,whereBetweenRaw()
,whereNotBetweenRaw()
以及having与其对应的方法 -
在
Builder
中, 更改whereKeywordsIgnoreNull()
的行为, 重命名whereLike()
为whereLikeIgnoreNull()
, 移除 更改whereKeywords()
-
在
@Column
中, 更改strategy
/insertStrategy
/updateStrategy
/conditionStrategy
的类型为接口类型(FieldStrategy
)便于业务自定义实现 -
在
@Column
中, 增加conversion
属性便于业务自定义实现序列化与反序列化; -
在
Builder
中, 修改find(id)
/findOrFail(id)
/insert(entity)
/insert(list<entity>)
/insertGetId(entity)
/insertGetIdOrFail(entity)
/insertGetIds(list<entity>)
/update(entity)
等方法的参数类型为Object; -
在
Builder
中, 新增form(entity)
; -
现在
Container
不再是全局静态, 而是使用对象生命周期管理, 便于同个进程下多个容器之间进行隔离 -
现在
ModelShadow
不再是全局静态的, 而是使用Container
进行管理
- 小优化
- 对于包扫描配置, 在
springboot
下默认是@SpringBootApplication
所在的包
- 增加对于包扫描配置的支持, 如
System.setProperty("gaarason.database.scan.packages", "you.package1,you.package2")
或者在springboot下使用注解@GaarasonDatabaseScan("you.package1,you.package2")
- 在查询构造器 Query(
Builder
)中, 增加dealChunk(num, column, chunkFunctionalInterface)
支持是用索引条件的分块查询 - 在查询构造器 Query(
Builder
)中, 增加firstOrderBy(closure)
支持将闭包中的排序字段添加到首部
- 在查询构造器 Query(
Builder
)中, 使dealChunk()
当结果集为空时, 不再进行回调 - 在查询构造器 Query(
Builder
)中, 表达式风格的列名与属性名, 现在支持父类实体
- 在查询构造器 Query(
Builder
)中,将原生查询的绑定参数类型由Collection<String>
更改为Collection<?>
- 在模型(
Model
)中, 将事件方法log(String sql, Collection<String> parameterList)
更改为log(String sql, Collection<?> parameterList)
- 在模型(
GeneralModel
)中, 实现log.debug
- 底层实现"SoftCache", 以替代"sun.misc.SoftCache", 增加对于高版本jdk的兼容性
- 在查询构造器 Query(
Builder
)中增加对于表达式风格的列名与属性名的支持 - 在查询结果集 Record(
Record
)中增加对于表达式风格的列名与属性名的支持 - 在查询结果集 Record合(
RecordList
)中增加对于表达式风格的列名与属性名的支持
- 重写了底层的语法构造器(
Grammar
), 使其可以在任意语句下, 完成参数绑定. - 在查询构造器 Query(
Builder
)中增加toSql(sqlType, closure)
/whereRaw(sqlPart, parameters)
/havingRaw(sqlPart, parameters)
/orderByRaw(sqlPart)
- 在查询构造器 Query(
Builder
)中增加when(condition, closure)
/when(condition, closure, closure)
- 在查询构造器 Query(
Builder
)中增加whereKeywords(value, column...)
/whereKeywordsIgnoreNull(value, column...)
/havingKeywords(value, column...)
/havingKeywordsIgnoreNull(value, column...)
等方法 - 在查询构造器 Query(
Builder
)中增加whereMayLikeIgnoreNull(map)/whereMayLikeIgnoreNull(column, value)
/havingMayLikeIgnoreNull(map)/havingMayLikeIgnoreNull(column, value)
- 在查询构造器 Query(
Builder
)中增加andWhereIgnoreEmpty(closure)
/orWhereIgnoreEmpty(closure)
/andHavingIgnoreEmpty(closure)
/orHavingIgnoreEmpty(closure)
- 在查询构造器 Query(
Builder
)中增加whereMayLike
/havingMayLike
系列执行方法whereMayLike(column, value)
/whereMayLike(entity)
/whereMayLike(map)
/havingMayLike(column, value)
/havingMayLike(entity)
/havingMayLike(map)
- 在查询构造器 Query(
Builder
)中增加whereRaw(list)
/havingRaw(list)
- 增加
GaarasonAutoconfiguration
接口, 程序会自动通过包扫描, 完成加载对其子类加载, 并调用其init()
完成初始化 InstanceCreatorFunctionalInterface
接口中, 增加默认的getOrder()
方法. 用于支持, 在调用ContainerProvider.register()
进行优先级判断.
- 在查询构造器 Query(
Builder
)中增加whereLike
/havingLike
系列执行方法whereLike(column, value)
/whereLike(entity)
/whereLike(map)
/havingLike(column, value)
/havingLike(entity)
/havingLike(map)
- 修复查询构造器 Query(
Builder
)中使用where(entity)
/having(entity)
等方法时, 当实体entity
中@Column
中insertable=false
时, 不正确的行为.
- 更改了项目的模块分布, 主要是拆分出的
database-api
模块, 以供rpc的接口模块去做依赖, 以及database-query-*
模块, 以供拓展更多的数据库支持 - 更新了部分的依赖的版本
- 为了降低使用的门槛, 依然在
database-core
中维持了druid
依赖, 以及database-spring-boot-starter
中维持了database-query-*
与mysql-connector-java
等.
- 更改了
database-spring-boot-starter
中的配置逻辑, 通过配置中的(spring.datasource.type=**DataSource)现在可以使用任意的基本数据源了. 因此这项功能, 所以配置文件将仅支持spring data风格, 而非 druid 风格.
- 在Spring自动配置类(
GaarasonDatabaseConfiguration
)中, 对GaarasonDataSource
增加@Primary
- 在查询构造器 Query(
Builder
)中增加join
系列执行方法joinRaw(sqlPart)
/join(joinType, table, joinConditions)
/join(joinType, tempTable, alias, joinConditions)
ModelShadowProvider
中增加getByTableName(tableName)
EntityUtils
中增加entityAssignmentBySimpleMap(stringObjectMapList, entityClass)
- 修复查询结果集 Record(
Record
)中使用fillEntity(entity)
等方法时,由于实体entity
存在复杂继承时引发的错误
- 分页对象(
Paginate
)中增加Serializable
接口
- 在查询构造器 Query(
Builder
)中增加执行方法simplePaginateMapStyle(currentPage, perPage)
/paginateMapStyle(currentPage, perPage)
- 在查询构造器 Query(
Builder
)中增加执行方法insertMapStyle(entityMap)
/insertMapStyle(entityMapList)
/insertGetIdMapStyle(entityMap)
/insertGetIdOrFailMapStyle(entityMap)
/insertGetIdsMapStyle(entityMapList)
/updateMapStyle(entityMap)
- 在实体(
Entity
)中, 优化 @Primary 注解中指定主键生成器的策略, 更方便的自定义主键生成 - 优化
SpringBoot
中的自动配置类
- 在模型(
Model
)中, 移除findMany(K... ids)
- 升级包扫描依赖
- 增强对于
ContainerProvider
的使用.
- 在模型(
Model
)中增加方法create(entity)
- 在查询结果集 Record(
Record
)中增加方法isDirty()
/getDirty()
/getDirtyMap()
/isDirty(fieldName)
/isClean()
/isClean(fieldName)
/getOriginal()
/getOriginal(fieldName)
- 在查询结果集 Record(
RecordList
)中增加方法avg(fieldName)
/sum(fieldName)
/max(fieldName)
/min(fieldName)
/mode(fieldName)
/median(fieldName)
/chunk(closure, newSize)
/chunk(newSize)
/chunkToMap(newSize)
/contains(fieldName, value)
/contains(closure)
/count()
/countBy(closure)
/countBy(fieldName)
/every(closure)
/filter(closure)
/filter()
/filter(fieldName)
/reject(closure)
/first(closure)
/first()
/groupBy(closure)
/groupBy(fieldName)
- 在查询结果集 Record(
RecordList
)中增加方法implode(fieldName, delimiter)
/implode(closure, delimiter)
/keyBy(fieldName)
/keyBy(closure)
/last(closure)
/last()
/mapToGroups(closureKey, closureValue)
/mapWithKeys(closureKey, closureValue)
/pluck(fieldName)
/pluck(fieldNameForValue, fieldNameForKey)
/shift()
/pop()
/prepend(element)
/push(element)
/put(index, element)
/pull(index)
/random()
/random(count)
/reverse()
/sortBy(closure, ase)
/sortBy(closure)
/sortBy(fieldName)
- 在查询结果集 Record(
RecordList
)中增加方法sortByDesc(fieldName)
/sortByDesc(closure)
/splice(offset)
/splice(offset, taken)
/take(count)
/unique(closure)
/unique(fieldName)
- 整体改进,数据库字段值为null的兼容性,但依然建议数据库字段不使用null
- 在模型(
Model
)中增加方法findOrFail(Object id)
/find(Object id)
/findMany(Object... ids)
- 在模型(
Model
)中变更方法findMany(Collection<K> ids)
->findMany(Collection<Object> ids)
- 在查询构造器 Query(
Builder
)中增加方法whereIgnoreNull(column, symbol, value)
/whereIgnoreNull(column, value)
/whereIgnoreNull(map)
/whereInIgnoreEmpty(column, valueList)
/whereInIgnoreEmpty(column, valueArray)
/whereNotInIgnoreEmpty(column, valueList)
/whereNotInIgnoreEmpty(column, valueArray)
- 在查询构造器 Query(
Builder
)中增加方法havingIgnoreNull(column, symbol, value)
/havingIgnoreNull(column, value)
/havingIgnoreNull(map)
/havingInIgnoreEmpty(column, valueList)
/havingInIgnoreEmpty(column, valueArray)
/havingNotInIgnoreEmpty(column, valueList)
/havingNotInIgnoreEmpty(column, valueArray)
- 在查询构造器 Query(
Builder
)中增加方法dataIgnoreNull(column, value)
/dataIgnoreNull(map)
- 在模型(
Model
)中增加方法findOrNew(entity)
/findByPrimaryKeyOrNew(entity)
/findByPrimaryKeyOrCreate(entity)
/findOrNew(conditionEntity, complementEntity)
/updateByPrimaryKeyOrCreate(entity)
- 在查询结果集 Record(
Record
)中增加方法fillEntity(entity)
- 实体代码生成时对于数据库的时间日期等,使用LocalDateTime/LocalDate/LocalTime等java类型对应
- 在模型(
Model
)中增加方法findOrCreate(entity)
/findOrCreate(conditionEntity, complementEntity)
/updateOrCreate(conditionEntity, complementEntity)
- 在查询构造器 Query(
Builder
)中增加方法Builder<T, K> where(T entity)
/Builder<T, K> where(Map<String, Object> map)
/Builder<T, K> having(T entity)
/Builder<T, K> having(Map<String, Object> map)
-
在实体中增加对
java.sql.Date
/java.sql.Time
/java.sql.Timestamp
/BigDecimal
/Blob
/Clob
类型的支持, 其中Blob
/Clob
仅支持查询 -
将关联关系 Relationship
Bind
中部分方法, 中间表数据参数类型由Map<String, String>
变更到Map<String, Object>
-
将关联关系 Relationship
Bind
中部分方法, 手动指定目标表的主键, 参数类型由String
、Collection<String> ids
变更到Object
、Collection<Object> ids
int attach(Record<?, ?> targetRecord,Map<String, Object> relationDataMap);
int attach(RecordList<?, ?> targetRecords,Map<String, Object> relationDataMap);
int attach(Object id,Map<String, Object> relationDataMap);
int attach(Collection<Object> ids,Map<String, Object> relationDataMap);
int sync(Record<?, ?> targetRecord,Map<String, Object> relationDataMap);
int sync(RecordList<?, ?> targetRecords,Map<String, Object> relationDataMap);
int sync(Object id,Map<String, Object> relationDataMap);
int sync(Collection<Object> ids,Map<String, Object> relationDataMap);
int toggle(Record<?, ?> targetRecord,Map<String, Object> relationDataMap);
int toggle(RecordList<?, ?> targetRecords,Map<String, Object> relationDataMap);
int toggle(Object id,Map<String, Object> relationDataMap);
int toggle(Collection<Object> ids,Map<String, Object> relationDataMap);
- 将
Builder
中部分方法, 参数类型由String
变更为Object
Builder<T, K> where(String column,String symbol,Object value);
Builder<T, K> where(String column,Object value);
Builder<T, K> whereIn(String column,Object...valueArray);
Builder<T, K> whereNotIn(String column,Object...valueArray);
Builder<T, K> whereBetween(String column,Object min,Object max);
Builder<T, K> whereNotBetween(String column,Object min,Object max);
Builder<T, K> having(String column,String symbol,Object value);
Builder<T, K> having(String column,Object value);
Builder<T, K> havingIn(String column,Object...valueArray);
Builder<T, K> havingNotIn(String column,Object...valueArray);
Builder<T, K> havingBetween(String column,Object min,Object max);
Builder<T, K> havingNotBetween(String column,Object min,Object max);
Builder<T, K> data(String column,Object value);
Builder<T, K> data(Map<String, Object> map);
- 在实体中增加对java8的LocalDate/LocalDateTime/LocalTime类型的支持.
新增加
- 新提供关联关系 Relationship相关注解
@HasOneOrMany()
,@BelongsTo()
,@BelongsToMany()
- 新提供关联关系 Relationship相关执行
Record::with(String column, GenerateSqlPart builderClosure, RelationshipRecordWith recordClosure)
与RecordList::with()
与Builer::with()
方法签名类似, 接受3个参数
新增加
- 新提供关联关系 Relationship相关注解
@HasOneOrMany()
,@BelongsTo()
,@BelongsToMany()
- 新提供关联关系 Relationship相关执行
Record::with(String column, GenerateSqlPart builderClosure, RelationshipRecordWith recordClosure)
与RecordList::with()
与Builer::with()
方法签名类似, 接受3个参数
不兼容
gaarason.database.eloquent.Model<T>
升级为gaarason.database.eloquent.Model<T, K>
, 其中T为实体类, K为实体类中的主键类型(eg: Long)gaarason.database.query.Builder<T>
升级为gaarason.database.query.Builder<T, K>
gaarason.database.eloquent.Record<T>
升级为gaarason.database.eloquent.Record<T, K>
gaarason.database.eloquent.RecordList<T>
升级为gaarason.database.eloquent.RecordList<T, K>
gaarason.database.contract.model.Query<T> :: Record<T> findOrFail(String id)
升级为gaarason.database.contract.model.Query<T, K> :: Record<T, K> findOrFail(K id)
gaarason.database.contract.model.Query<T> :: Record<T> find(String id)
升级为gaarason.database.contract.model.Query<T, K> :: Record<T, K> find(K id)
gaarason.database.contract.builder.Transaction<T> :: boolean transaction(Runnable runnable, int maxAttempts)
升级为gaarason.database.contract.builder.Transaction<T> :: boolean transaction(Runnable runnable, int maxAttempts, boolean throwException)
有影响
- ORM新增,现在会赋值数据库自增主键到原对象
新增加
- 新提供
K insertGetId()
/K insertGetId(T entity)
/K insertGetIdOrFail()
/K insertGetIdOrFail(T entity)
/List<K> insertGetIds(List<T> entityList)