# DAF4J
**Repository Path**: taoyy/DAF4J
## Basic Information
- **Project Name**: DAF4J
- **Description**: Data Access Facade For Java,更简单的持久层结构,并为数据访问提供统一接口
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 5
- **Created**: 2015-11-11
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#Data Access Facade for Java (DAF4J)
这是一个针对数据访问的统一接口,提供简便的,带类型检查的数据访问
>运行于 Java 1.6 以及更高版本
>引入`daf4j-api.jar`和您需要的`DataAccess`实现即可
>DAF4j针对Scala提供了的简化操作
`update.md`中查看更新日志
###使用
方式1: 在`git@osc`上下载附件并引入包,以及根据说明引入依赖项(`daf4j-api.jar`本身不需要引入依赖,但`DataAccess`实现会需要,后文有详细说明)
方式2: 使用maven引入
```xml
net.cassite
daf4j-api
0.0.3-RELEASE
```
###使用预览
**Java** | Stream风格
```java
query
.from(user)
.stream()
.filter(user.age.$gt(18).and(user.name.$ne("cass")))
.filter(role.name.$eq("admin"))
.sorted(user.id.desc())
.limit(10)
.list();
// 查询年龄大于18,姓名不为'cass',角色等于'admin'的用户,根据用户id降序排列,并取前10条记录
```
**Scala** | SQL风格
```scala
query from user where user.age > 18 & user.name <> "cass" & role.name === "admin" param (orderBy(user.id.desc) top 10) list
// 功能与上相同
```
###开发这个类库的原因
DAF4J用于简化数据访问。
三层架构中数据层的结构会很大程度上依赖于业务逻辑。很多时候业务层仅仅做一些数据校验和数据类型的转换,剩下就是直接的调用数据层,而数据层有时候也会针对业务层方法写一些“专用”方法。
我认为数据层之所以依赖于业务的根源,是查询/修改**条件**无法完整的从业务中分离出去。
即使是类似`Spring Data JPA`或者`JPA Criteria`,对于条件的处理也略显笨重(`小于(字段, 值)`而不是`字段.小于(值)`,而且代码量略高)。
我想,既然`JPA`支持从方法注入值,那么为何不转变一下思路,把字段替换成封装好,支持各种条件和表达式的类型,而方法签名不变。这样既可以使用已有框架,又可以更轻松的调用数据。
设计了一番后便开始了开发。
##使用方式
>此处给出一个前瞻,详细使用方式随后给出
>在Wiki页提供一篇了教学,在一个简单的RBAC的模型的情景下使用DAF4J
使用需要引入`daf4j-api.jar`
本例以`daf4j-ds-jpa.jar`中的`JPQLDataAccess`实现为例
我们会书写一个实体类,现在把实现方式作微小的调整:
我针对`IDEA`写了一个getter和setter的生成器,来完成DAF4J的JavaBean生成,生成代码见仓库根目录`GetterGeneratorForIDEA.txt`和`SetterGeneratorForIDEA.txt`
```java
@Entity
class User{
public final XInt id = new XInt(this);
public final XString name = new XString(this);
public final XInt age = new XInt(this);
@Id
public Integer getId(){ return id.get(); }
public String getName(){ return name.get(); }
public Integer getAge(){ return age.get(); }
public void setId(Integer id){ DataUtils.set(this.id, id); }
public void setName(String name){ DataUtils.set(this.name, name); }
public void setAge(Integer age){ DataUtils.set(this.age, age); }
}
```
为了使用JPA的功能,还需要获取一个`EntityManager`,然后用它初始化`JPQLDataAccess`和`Query`
```java
Query query=new Query(new JPQLDataAccess(entityManager));
```
接着就可以开始使用了:
```java
User user=new User();
// 列出所有年龄大于18岁的用户
query
.from(user)
.where(user.age.$gt(18))
.list();
// 以List