Eloquent ORM for Java
数据模型是将数据库操作集中声明的对象, 理解为表
反向生成代码
重写getProxyDataSource
下面的例子使用spring
注入后返回
ProxyDataSource
相关请看注册bean
package temp.model.base;
import gaarason.database.connections.ProxyDataSource;
import gaarason.database.eloquent.Model;
import javax.annotation.Resource;
abstract public class BaseModel<T> extends Model<T> {
@Resource(name = "proxyDataSource")
protected ProxyDataSource dataSource;
@Override
public ProxyDataSource getProxyDataSource(){
return dataSource;
}
}
子类只需要继承父类即可
package temp.model;
import temp.model.base.BaseModel;
import temp.pojo.Student;
import org.springframework.stereotype.Component;
@Component
public class StudentModel extends BaseModel<Student> {
}
所有事件在ORM
时触发, 事件可以继承自父类
Eloquent 模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。
retrieved
事件会在从数据库中获取已存在模型时触发。
当一个新模型被首次保存的时候,creating
和 created
事件会被触发。
如果一个模型已经在数据库中存在并调用 save
方法,updating
和updated
事件会被触发。
无论是创建还是更新,saving
和saved
事件都会被触发。
deleting
, deleted
, restoring
, restored
则分别在删除以及恢复时触发。
ing
结尾的事件, 均可以阻止事件的进行
借用上面的model
, 则一个事件的定义可以是以下形式
package temp.model;
import temp.model.base.BaseModel;
import temp.pojo.Student;
import org.springframework.stereotype.Component;
@Component
public class StudentModel extends BaseModel<Student> {
@Override
public void retrieved(Record<Entity> entityRecord){
System.out.println("已经从数据库中查询到数据");
}
@Override
public boolean updating(Record<Entity> record){
if(record.getEntity().getId() == 9){
System.out.println("正要修改id为9的数据, 但是拒绝");
return false;
}
return true;
}
}
在父类或者底层限制数据查询的有效范围
package temp.model;
import temp.model.base.BaseModel;
import temp.pojo.Student;
import org.springframework.stereotype.Component;
@Component
public class StudentModel extends BaseModel<Student> {
/**
* 全局查询作用域
* @param builder 查询构造器
* @return 查询构造器
*/
protected Builder<T> apply(Builder<T> builder) {
// return builder->where("type", "2");
return builder;
}
}
- 软删除相关实现, 重写
gaarason.database.eloquent.SoftDeleting
的相关方法 - 开启软删除, 重写
softDeleting
方法结果为true
package temp.model;
import temp.model.base.BaseModel;
import temp.pojo.Student;
import org.springframework.stereotype.Component;
@Component
public class StudentModel extends BaseModel<Student> {
/**
* 是否启用软删除
*/
protected boolean softDeleting() {
return false;
}
/**
* 删除(软/硬删除)
* @param builder 查询构造器
* @return 删除的行数
*/
public int delete(Builder<T> builder) {
return softDeleting() ? softDelete(builder) : builder.forceDelete();
}
/**
* 恢复软删除
* @param builder 查询构造器
* @return 删除的行数
*/
public int restore(Builder<T> builder) {
return softDeleteRestore(builder);
}
/**
* 软删除查询作用域(反)
* @param builder 查询构造器
*/
protected void scopeSoftDeleteOnlyTrashed(Builder<T> builder) {
builder.where("is_deleted", "1");
}
/**
* 软删除查询作用域(反)
* @param builder 查询构造器
*/
protected void scopeSoftDeleteWithTrashed(Builder<T> builder) {
}
/**
* 软删除查询作用域
* @param builder 查询构造器
*/
protected void scopeSoftDelete(Builder<T> builder) {
builder.where("is_deleted", "0");
}
/**
* 软删除实现
* @param builder 查询构造器
* @return 删除的行数
*/
protected int softDelete(Builder<T> builder) {
return builder.data("is_deleted", "1").update();
}
/**
* 恢复软删除实现
* @param builder 查询构造器
* @return 恢复的行数
*/
protected int softDeleteRestore(Builder<T> builder) {
return builder.data("is_deleted", "0").update();
}
}