在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:DAF4J开源软件地址:https://gitee.com/wkgcass/DAF4J开源软件介绍:#Data Access Facade for Java (DAF4J)这是一个针对数据访问的统一接口,提供简便的,带类型检查的数据访问DSL
###使用方式1: 在 <dependencies> <dependency> <groupId>net.cassite</groupId> <artifactId>daf4j-api</artifactId> <version>0.1.1-RELEASE</version> </dependency></dependencies> ###使用预览 Java | Stream风格 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风格 query from user where user.age > 18 & user.name <> "cass" & role.name === "admin" param (orderBy(user.id.desc) top 10) list// 功能与上相同 ###开发这个类库的原因 DAF4J用于简化数据访问。 我认为数据层之所以依赖于业务的根源,是查询/修改条件无法完整的从业务中分离出去。 即使是类似 我想,既然 设计了一番后便开始了开发。 ##使用方式
使用需要引入 本例以 我针对 @Entityclass 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的功能,还需要获取一个 Query query=new Query(new JPQLDataAccess(entityManager)); 接着就可以开始使用了: User user=new User(); // 列出所有年龄大于18岁的用户query .from(user) .where(user.age.$gt(18)).list(); // 以List<Map<String,Object>>的形式列出用户id和用户名// Map中的键包括 User.id 和 user_name// 结果根据年龄降序排序query .from(user) .where(user.age.$gt(18)) .param( new QueryParameter().orderBy(user.age.desc()) ).select( new Focus() .focus(user.id) // 别名为类型简称.字段名 .focus(user.name, "user_name")); // 计算所有用户年龄平均值query .from(user) .where(null).avg(user.age);// 将所有用户的年龄+1query .from(user) .where(null).update( user.age.as(user.age.add(1)));// 删除所有用户query .from(user) .where(null).remove(); 上述查询风格是sql风格,有时候并不操作关系型数据库,或者不喜欢类sql的语法,所以此处还提供了stream风格的查询语句 // 列出所有年龄大于18岁的用户query .from(user).stream() .filter(user.age.$gt(18)).list(); // 以List<Map<String,Object>>的形式列出用户id和用户名// Map中的键包括 User.id 和 user_name// 结果根据年龄降序排序query .from(user).stream() .filter(user.age.$gt(18)) .sorted(user.age.desc()) .map( new Focus() .focus(user.id) .focus(user.name, "user_name") ).list();// 计算所有用户年龄平均值query .from(user).stream() .mapToInt(user.age).average(); 以上查询都是带类型检查的。 ##已有的DataAccess实现现在开发了针对 针对
依赖于
当然,日志输出还需要额外的日志系统,比如slf4j-simple/log4j+slf4j-log4j等,JPA实现也需要引入依赖。 您可以自行添加依赖或者使用maven <dependencies> <dependency> <groupId>net.cassite</groupId> <artifactId>daf4j-ds-jpa</artifactId> <version>0.1.1-RELEASE</version> </dependency></dependencies> ###JPQLDataAccess/JPQLDataSource 关系型数据库可以进行join,group by,having,然而daf4j-api中并没有这些元素。这起源于我曾经针对SQL简化的思考。
也就是说,大部分情况下,group by和having可以推导出来。 而使用JPA时,join关系已经在实体中定义好了。即使写JPQL时也只会这么写 select u from User u join u.roles r ... 完全可以自动生成。 不过此处还有一些使用规则。 例如User(用户)和Role(角色),如果需要查询用户,也需要以角色为依据。比如说:查询出所有角色为 User user=new User();Role role=new Role();user.getRoles().add(role); query .from(user) .stream() .filter(role.name.$eq("admin")).list(); 换句话说,你需要指定join的字段。 如果是多对一关系,则需要通过setter填入。 ####ResourceDataAccess在0.1.1版本中,api提供了一个新的DataAccess实现。对于所有的“资源”进行抽象。 使用 API中自带本地文件源 Query query=new Query(new ResourceDataAccess(new LocalFileSource));Resource r = new Resource();query .from(r) .where(r.location.$like("/Volumes/PROJECTS/openSource/DAF4J")).list();
若事务开启,则会在commit和rollback时把使用过的InputStream关闭。 ##Scala特殊用法这里不作过多叙述,如下代码一目了然: import entity._query from entity where age > 18 & id <> 1 param (orderBy(name.desc) top 1) list()query from entity where age > 18 & id <> 1 param (orderBy(name.desc) top 1) select id ~(name, "a")query from entity stream() filter age > 18 & id <> 1 sorted name.desc limit 5 list()query from entity stream() filter age > 18 & id <> 1 sorted name.desc limit 5 map id ~(name, "a") list() ##DataSource
详情参考文档以及JPQLDataSource实现 |
请发表评论