<!--juan_zhai-->
<dependency>
<groupId>com.db4o</groupId>
<artifactId>com.db4o</artifactId>
<version>7.7.67</version>
</dependency>
<dependency>
<groupId>com.db4o</groupId>
<artifactId>com.db4o.nativequery</artifactId>
<version>7.7.67</version>
</dependency>
package org.rx.repository.db4o;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.UUID; @Data
public abstract class DataObject implements Serializable {
private UUID id;
private Date createTime, modifyTime;
private boolean isDeleted;
}
package org.rx.repository.db4o;

import org.rx.core.dto.common.PagedResponse;
import org.rx.core.dto.common.PagingRequest; import java.util.List;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate; public interface IRepository<T extends DataObject> {
T save(T model); T delete(UUID id); T single(UUID id); T single(Predicate<T> condition); long count(Predicate<T> condition); List<T> list(Predicate<T> condition); <TK> List<T> list(Predicate<T> condition, Function<T, TK> keySelector); <TK> List<T> listDescending(Predicate<T> condition, Function<T, TK> keySelector); <TK> PagedResponse<T> page(Predicate<T> condition, Function<T, TK> keySelector, PagingRequest pagingParam); <TK> PagedResponse<T> pageDescending(Predicate<T> condition, Function<T, TK> keySelector, PagingRequest pagingParam);
}
package org.rx.repository.db4o.impl;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.Configuration;
import lombok.SneakyThrows;
import org.rx.api.dto.common.PagedResponse;
import org.rx.api.dto.common.PagingRequest;
import org.rx.beans.BeanMapper;
import org.rx.beans.DateTime;
import org.rx.common.App;
import org.rx.common.InvalidOperationException;
import org.rx.common.NQuery;
import org.rx.repository.db4o.IRepository;
import org.rx.repository.db4o.DataObject;
import org.springframework.stereotype.Component; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate; import static org.rx.common.Contract.require; @Component
public class Db4oRepository<T extends DataObject> implements IRepository<T> {
private String dbPath;
private Configuration config; @SneakyThrows
public Db4oRepository() {
dbPath = App.readSetting("app.repository.dbFile");
if (dbPath == null) {
throw new InvalidOperationException("app.repository.dbFile is empty");
}
String dir = dbPath;
int i = dir.lastIndexOf("/");
if (i != -1) {
dir = dir.substring(0, i);
}
App.createDirectory(dir); config = Db4o.newConfiguration();
} protected <R> R invoke(Function<ObjectContainer, R> func) {
return NQuery.of(invoke((Function<ObjectContainer, R>[]) new Function[]{func})).firstOrDefault();
} protected synchronized <R> List<R> invoke(Function<ObjectContainer, R>... funcList) {
require(funcList); List<R> result = new ArrayList<>();
// ObjectContainer db = Db4o.openFile(config, dbPath);
ObjectContainer db = App.getOrStore("Db4oRepository-threadDb", k -> Db4o.openFile(config, dbPath));
try {
for (Function<ObjectContainer, R> function : funcList) {
result.add(function.apply(db));
}
db.commit();
} catch (Exception e) {
db.rollback();
throw e;
}
// finally {
// db.close();
// }
return result;
} public T save(T model) {
require(model);
if (!(model instanceof DataObject)) {
throw new IllegalArgumentException("model is not a DataObject");
} return invoke(db -> {
T dataObj = single(p -> p.getId().equals(model.getId()));
if (dataObj != null) {
dataObj = BeanMapper.getInstance().map(model, dataObj, BeanMapper.Flags.NonCheckMatch | BeanMapper.Flags.SkipNull);
} else {
dataObj = model;
}
if (dataObj.getId() == null) {
dataObj.setId(UUID.randomUUID());
}
if (dataObj.getCreateTime() == null) {
dataObj.setCreateTime(DateTime.now());
}
dataObj.setModifyTime(DateTime.now());
db.store(dataObj);
return dataObj;
});
} @Override
public T delete(UUID id) {
T model = single(id);
if (model == null) {
return null;
}
model.setDeleted(true);
return save(model);
} @Override
public T single(UUID id) {
return single(p -> p.getId().equals(id));
} @Override
public T single(Predicate<T> condition) {
return NQuery.of(list(condition)).firstOrDefault();
} @Override
public long count(Predicate<T> condition) {
return executeReader(condition, null, false).count();
} @Override
public List<T> list(Predicate<T> condition) {
return list(condition, null);
} @Override
public <TK> List<T> list(Predicate<T> condition, Function<T, TK> keySelector) {
return executeReader(condition, keySelector, false).toList();
} @Override
public <TK> List<T> listDescending(Predicate<T> condition, Function<T, TK> keySelector) {
return executeReader(condition, keySelector, true).toList();
} @Override
public <TK> PagedResponse<T> page(Predicate<T> condition, Function<T, TK> keySelector, PagingRequest pagingParam) {
require(pagingParam); NQuery<T> nQuery = executeReader(condition, keySelector, false);
return pagingParam.page(nQuery);
} @Override
public <TK> PagedResponse<T> pageDescending(Predicate<T> condition, Function<T, TK> keySelector, PagingRequest pagingParam) {
require(pagingParam); NQuery<T> nQuery = executeReader(condition, keySelector, true);
return pagingParam.page(nQuery);
} private <TK> NQuery<T> executeReader(Predicate<T> condition, Function<T, TK> keySelector, boolean isDescending) {
require(condition); com.db4o.query.Predicate<T> predicate = new com.db4o.query.Predicate<T>() {
public boolean match(T candidate) {
return !candidate.isDeleted() && condition.test(candidate);
}
};
return invoke(db -> {
ObjectSet<T> objectSet;
if (keySelector == null) {
objectSet = db.query(predicate);
} else {
Comparator<T> comparator = getComparator(keySelector);
if (isDescending) {
comparator = comparator.reversed();
}
objectSet = db.query(predicate, comparator);
}
return NQuery.of(objectSet);
});
} private <TK> Comparator<T> getComparator(Function<T, TK> keySelector) {
if (keySelector == null) {
return (Comparator) Comparator.naturalOrder();
} return NQuery.getComparator(keySelector);
}
}

java com.db4o 类的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. 基础知识(05) -- Java中的类

    Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...

  3. java中Inetaddress类

    InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...

  4. Java集合---Array类源码解析

    Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...

  5. 浅析Java.lang.ProcessBuilder类

    最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述      P ...

  6. 浅析Java.lang.Process类

    一.概述      Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序).      Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...

  7. 浅析Java.lang.Runtime类

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  8. java单例类/

    java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...

  9. JAVA中的类和接口

    1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

随机推荐

  1. [CSP-S模拟测试]:Read(数学)

    题目描述 热爱看书的你有$N$本书,第$i$本书的种类为$A[i]$.你希望每天能够看一本书,但是不希望连续两天看种类相同的书.为了达成这个条件,你需要选择一些书不看,作为一个好学生,你希望不看的书尽 ...

  2. Linux 下查看用户组信息

    1.id 通过id 可以直接查看到当前登陆用户的uid, group id , group name 等等.. 2.groups

  3. Python中的浮点数原理与运算分析

    Python中的浮点数原理与运算分析 本文实例讲述了Python中的浮点数原理与运算.分享给大家供大家参考,具体如下: 先看一个违反直觉的例子:     >>> s = 0. > ...

  4. Nginx允许跨域访问的配置问题

    网站项目动静分离,静态资源服务器A 业务服务器B  B中静态资源由A加载 出现如下问题: @font-face { font-family: 'iconfont'; src: url('../font ...

  5. Lock的使用

    Lock是一个Java类,synchronized是一个Java关键字,两者有本质的不同 Lock需要手动释放锁,synchronized是自动释放锁 Lock适合大量同步的代码同步,synchron ...

  6. ABAP字符串处理

    字符串中包含单引号:单引号前面再加一个单引号 例:jest~stat = 'E0002' jest~stat = 'E0003' OR jest~stat = 'E0004' IF z_stat IS ...

  7. luoguP1540 机器翻译 题解(NOIP2010)

    P1540 机器翻译  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  8. 【ARC076F】 Exhausted

    hall定理大概是匈牙利的理论基础吧 hall定理的内容:二分图\(G\)的的左部点点集为\(\rm X\),右部点点集为\(\rm Y\),设\(|\rm X|\leq |Y|\),则二分图\(G\ ...

  9. 一次spring boot web服务响应缓慢的排查

    使用spring boot搭建了一个web服务,部署在docker容器中.使用中出现了一个性能问题:多次接口请求中,偶尔会出现一次响应非常慢的情况.正常情况下接口的响应时间在10-20ms,偶尔会出现 ...

  10. sublime中使用插件anaconda而在代码中出现方框

    这个标志是说不符合PEP8标准,比如使用了Tab做缩进:一行过长等问题. 可以在可以在 Sublime > Preferences > Package Settings > Anac ...