<!--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. 2018-2019-2 《Java程序设计》第10周学习总结

    20175319 2018-2019-2 <Java程序设计>第10周学习总结 教材学习内容总结 本周学习<Java程序设计>第十二章java多线程机制: - 进程与线程 程序 ...

  2. linux从head.s到start_kernelstart_kernel之---内核重定位后分析

    参考: https://biscuitos.github.io/blog/ARM-BOOT/ zImage 重定位之后实践 zImage 重定位之后,ARM 将 pc 指针指向了重定位 zImage ...

  3. selenium2-java 浏览器操作常用命令语法

    WebDriver driver = new ChromeDriver(); xpath定位:driver.findElement(By.xpath("//div[@id='register ...

  4. 同时连接gitlab和github

    ---恢复内容开始--- 原文地址:https://juejin.im/post/5ac0cf356fb9a028df22c246 1. 分别生成gitlab和github的ssh key 生成第一个 ...

  5. VUX中selector组件数据错误,value-map不能正常转换接口数据

    项目中有个地方需要用到下拉框,使用VUX的selector组件,使用value-map属性进行接口数据转换未成功,出来的还是原数据 看了又看也没写错呀,字段什么的都是复制上去的,去网上查了也没查到怎么 ...

  6. python的三种创建字典的方法

    #创建一个空字典 empty_dict = dict() print(empty_dict) #用**kwargs可变参数传入关键字创建字典 a = dict(one=,two=,three=) pr ...

  7. FZU 2060 The Sum of Sub-matrices(状态压缩DP)

    The Sum of Sub-matrices Description Seen draw a big 3*n matrix , whose entries Ai,j are all integer ...

  8. hdu 5435 A serious math problem

    A serious math problem Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...

  9. SQL数据库—<6-001> 常用系统存储过程大全 --摘录网

    -- 来源于网络 -- 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_logi ...

  10. 11.Container With Most Water (Array; Two-Pointers)

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...