<!--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. (转)运行jar应用程序引用其他jar包的四种方法 -- ClassLoader应用

    转:http://longdick.iteye.com/blog/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个j ...

  2. python的列表与shell的数组

    python:names=["a","b","c"] shell:names=(a b c)

  3. django-redis-cache缓存使用

    1. redis安装配置 (1)到redis目录 [root@localhost redis-2.8.17]# ls 00-RELEASENOTES CONTRIBUTING deps Makefil ...

  4. oo_project_1

    Project 1题目要求分析: 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-19 ...

  5. 数组中重复的数字(js实现)

    题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的 ...

  6. MybatisPlus自动填充公共字段的策略

    背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一.创建基础实体[BaseEntity],定义需要处理的公共字段(创建 ...

  7. jmeter beanshell 写入文件

    1.首先F:\test.txt文件为空

  8. java异常不匹配问题

    java的异常处理是为了提高程序健壮性的. 当发生异常的时候,我们把这个异常捕获到,或者throw出去.然后对这些异常的情况进行处理.并且异常发生之后的代码仍然会执行,这样就能提高程序的健壮性.如下 ...

  9. Codeforces 1132G(dfs序+线段树)

    题面 传送门 分析 对于每一个数a[i],找到它后面第一个大于它的数a[p],由p向i连边,最终我们就会得到一个森林,且p是i的父亲.为了方便操作,我们再增加一个虚拟节点n+1,把森林变成树. 由于序 ...

  10. python上播放mp3歌曲

    我想从python播放我的歌曲(mp3),你能给我一个最简单的命令吗? 这不正确: import wave w = wave.open("e:/LOCAL/Betrayer/Metalik ...