Skip to content
This repository has been archived by the owner on Mar 6, 2020. It is now read-only.

Latest commit

 

History

History
218 lines (168 loc) · 5.41 KB

model.md

File metadata and controls

218 lines (168 loc) · 5.41 KB

database

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 事件会在从数据库中获取已存在模型时触发。
当一个新模型被首次保存的时候,creatingcreated 事件会被触发。 如果一个模型已经在数据库中存在并调用 save 方法,updatingupdated 事件会被触发。
无论是创建还是更新,savingsaved 事件都会被触发。 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();
    }
}