java com.db4o 类
<!--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 类的更多相关文章
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- 基础知识(05) -- Java中的类
Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...
- java中Inetaddress类
InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...
- Java集合---Array类源码解析
Java集合---Array类源码解析 ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...
- 浅析Java.lang.ProcessBuilder类
最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述 P ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- 浅析Java.lang.Runtime类
一.概述 Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接. 一般不能实例化一个Runtime对象, ...
- java单例类/
java单例类 一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...
- JAVA中的类和接口
1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...
随机推荐
- 尽量用类型化的常量替代预处理器的 #DEFINE 方法
类型化常量 (TYPED CONSTANTS) #define ANIMATION_DURATION 0.3 这是一个预处理器指令,当编译器在代码中发现有 ANIMATION_DURATION 时,就 ...
- three dots in git
What are the differences between double-dot “..” and triple-dot “…” in Git commit ranges? Using Comm ...
- 重新认识new
前言 感谢大佬:https://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html www.cplusplus.com 因为这段时间在重 ...
- Java学习之Thread方法
一.sleep()方法:在同步中,释放CPU执行权,不释放同步锁,意味着程序停止 二.停止线程方法:原理:run执行完成 1.设置标记 class StopThread implements Runn ...
- js-xlsx sheet_to_json 读取小数位数变多
read as string . 例如:2.85 读取后变成 2.84999999999999999 这种. 以字符串形式读取. XLSX.utils.sheet_to_json(workbook.S ...
- 定制xfce4桌面==排除appfinder的綑绑
如下等同于安装 xfce4-meta,除了不安装 app-finder emerge -avq xfwm4 xfdesktop xfce4-session xfce4-settings xfce4-t ...
- void*和void类型
| 版权声明:本文为博主原创文章,未经博主允许不得转载. void的类型是无类型的数据,void*表示无类型的指针.其中void*可以指向任何数据类型的指针. void类型的用法: (1).voi ...
- 2019-8-31-C#-使用汇编
title author date CreateTime categories C# 使用汇编 lindexi 2019-08-31 16:55:58 +0800 2019-2-16 8:56:5 + ...
- setlocale - 设置当前的区域选项
总览 (SYNOPSIS) #include <locale.h> char *setlocale(int category, const char * locale); 描述 (DESC ...
- dotNET面试(一)
1.列举ASP.NET 页面之间传递值的几种方式. 1).使用QueryString, 如....?id=1; response. Redirect().... 2).使用Session变量 3).使 ...