我基于
Thin
完成一个实现,
Thin
是一种基于
key-value
的持久层框架,简单易用,体现持久本质。在此不再详述。大家可以参考源代码:
http://sourceforge.net/projects/thinery/
public class ThinObject extends IObject {
protected static Logger log = Logger.getLogger(IObject.class);
static {
/**
* 这里建立了一种约定,一种对象的属性名与数据库中表字段名相互转换的约定。
*/
KVUtils.mappingRule = new AnnotationMappingRule();
}
/**
* 在配置文件中加载自定义的SQL,存放在此处以供该类的方法使用
*
*/
static Properties sqls = new Properties();
transient protected BeanTable beanTable;
/**
* 把该类的所有属性,全部转化成key-value用于存储
*
* @return
* @throws Exception
*/
protected Map<String, Object> toKeyValue() throws Exception {
return KVUtils.toKeyValue(this);
}
protected Field hasPrimary() {
Field[] fields = getClass().getDeclaredFields();
for (Field field : fields) {
Primary pry = field.getAnnotation(Primary.class);
if (pry != null) {
return field;
}
}
return null;
}
/**
* 该设计的持久方式采用的是'thin',<a
* href="http://sourceforge.net/projects/thinery/">thin</a>
* 是基于key-value的持久层框架,简单,易用,透析持久本质; 默认采用约定优先,注解在后的映射方式,还支持定义映射。
*
* @return
* @throws SQLException
*/
protected BeanTable getBeanTable() throws SQLException {
if (beanTable == null) {
BeanTableName btn = this.getClass().getAnnotation(
BeanTableName.class);
String tableName = btn.name();
String schema = btn.schema();
if ("".endsWith(schema)) {
beanTable = ThinContext.getThinContext()
.getBeanTable(tableName);
} else {
beanTable = ThinContext.getThinContext(schema).getBeanTable(
tableName);
}
}
return beanTable;
}
public ThinObject() {
if (!inited) {
try {
initSQLProperties();
} catch (Exception e) {
e.printStackTrace();
}
inited = true;
}
}
private void initSQLProperties() throws IOException {
InputStream inStream = this.getClass().getClassLoader()
.getResourceAsStream(this.getThisName() + "_sql.properties");
if (inStream != null) {
sqls.load(inStream);
}
}
@SuppressWarnings("unchecked")
protected List toBeans(List<Map<String, Object>> keyvalues)
throws Exception {
return KVUtils.toBeans(keyvalues, this.getClass());
}
/**
* 把对象自身持久的数据库的方法。子类可以根据类的情况,重写该方法。 如该类是一对一,一对多的,想把关联对象一起存储,就需要重写该方法
*
* @throws RuntimeException
*/
public void remember() throws RuntimeException {
try {
this.getBeanTable().addOrUpdate(toKeyValue());
this.setChanged();
this.notifyObservers();
} catch (Exception e) {
log.error("记忆出现异常!", e);
throw new RuntimeException(e);
}
}
/**
* 删除此对象对应的数据库记录。 恰如我们忘记一件事物
*/
public void forget() {
try {
this.getBeanTable().delete(toKeyValue());
this.setChanged();
this.notifyObservers();
} catch (Exception e) {
log.error("删除记录出现异常", e);
throw new RuntimeException(e);
}
}
public void updateMemory(String... updateFields) {
try {
Map<String, Object> keyvalues = new HashMap<String, Object>();
for (String name : updateFields) {
KVUtils.mappingRule.setDBColumn(this, this.getClass()
.getDeclaredField(name), keyvalues);
}
Field primaryField = hasPrimary();
if (primaryField != null
&& !keyvalues.containsKey(primaryField.getName())) {
KVUtils.mappingRule.setDBColumn(this, primaryField, keyvalues);
}
this.getBeanTable().update(keyvalues);
this.setChanged();
this.notifyObservers();
} catch (Exception e) {
log.error("更新存储出现异常", e);
throw new RuntimeException(e);
}
}
@SuppressWarnings("unchecked")
public List<Object> associate(Object... params) {
try {
Criterion[] criterions=toCriterion(params);
return this.toBeans(this.getBeanTable().get(criterions));
} catch (Exception e) {
log.error("查询记录出现异常", e);
throw new RuntimeException(e);
}
}
private Criterion[] toCriterion(Object... params) {
Criterion[] criterions = new Criterion[params.length];
for(int i=0;i<params.length;i++){
criterions[i] = (Criterion)params[i];
}
return criterions;
}
public void obtainMe() {
try {
Field field = this.hasPrimary();
Object value = PropertyUtils.getProperty(this, field.getName());
List<Map<String, Object>> keyvalues = this.getBeanTable().get(SQLCriterion.get(field.getName(), value));
if(!keyvalues.isEmpty()){
KVUtils.toBean(keyvalues.get(0), this);
}
} catch (Exception e) {
log.error("查询记录出现异常", e);
throw new RuntimeException(e);
}
}
}
分享到:
相关推荐
DDD的核心是将业务领域的概念、规则和流程转化为可执行的代码,从而实现业务逻辑和软件设计的高度融合。 DDD中的核心概念包括: 1. **领域模型**(Domain Model):领域模型是业务逻辑的抽象,它包含了业务实体、...
在编程领域,设计模式是解决常见问题的经过验证的、可重用的解决方案。...通过阅读《C#面向对象设计模式纵横谈》一书,你将能够深入了解这些模式的实现细节和应用场景,从而在实际开发中游刃有余。
本篇文档主要探讨了如何利用Android平台设计并实现一个智能导航系统,涉及的技术包括Android开发、Java编程以及Apache开源库的运用。 一、Android开发基础 Android系统是基于Linux内核的开源移动平台,它为开发者...
在当今科技飞速发展的背景下,智能...通过对《智能家居控制APP系统的设计与实现》一文的阅读和分析,我们可以对智能家居系统的相关技术有更深入的理解,同时也为未来相关领域的研究和开发工作提供了宝贵的参考和指导。
本篇论文主要探讨了基于云服务的智能控制器设计,特别以泡茶机为研究对象,介绍了智能化控制技术在家居领域中的应用。以下是对该文献的详细知识点介绍。 知识点一:智能家居技术的发展与趋势 智能家居的概念自上...
【基于ARM与遗传算法的智能小车设计与实现】该文章主要探讨了...这篇文章为读者提供了深入理解如何利用现代微处理器技术和智能算法设计高性能智能小车的实例,对于相关领域的研究者和技术开发者具有很高的参考价值。
《人工智能五子棋设计》这篇论文探讨了人工智能在机器博弈领域的应用,特别是在五子棋游戏中的实现。五子棋作为一种简单但策略丰富的游戏,对于测试和优化博弈算法具有理想的效果。本文将深入解析人工智能在五子棋...
总体来看,《基于无线传感器网络的智能报警系统设计与实现》这篇论文对智能报警系统的设计和实现过程进行了全面介绍。通过分析该系统的架构、硬件设计、以及技术应用,我们可以看到一个集成了多种先进技术的智能报警...
通过上述知识点的提炼,可以看出物联网与智能家居系统设计和实现是紧密相连的,物联网技术的发展推动了智能家居系统的发展,而智能家居系统则充分利用了物联网技术的优势,为人们提供更安全、便利和舒适的生活环境。...
综上所述,这篇毕业论文不仅展示了人工智能在游戏领域的应用,还强调了软件工程中的设计原则,包括模块化、可扩展性和用户中心设计。通过这一项目,读者不仅可以了解到人工智能在解决复杂问题上的潜力,也能理解如何...
Python 是一种非常流行的编程语言,广泛应用于数据科学、人工智能、Web 开发等领域。 在软件开发中,设计模式是一种非常重要的思想和方法论,它可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:...
总结而言,这篇论文深入探讨了如何利用人工智能和机器学习技术,结合SOA和Web Service,设计并实现一个能够预测用户需求、提供个性化信息服务的智能化信息服务平台。这一平台不仅解决了移动终端处理信息的局限性,也...
1. **面向对象编程(OOP)**:面向对象编程是一种程序设计方法,它将问题领域中的实体抽象为对象,并利用封装、继承和多态等机制来组织代码。Java是一种面向对象的编程语言,它自然支持OOP的基本概念。在五子棋的...
本篇内容主要聚焦于一个基于C++语言实现的图像处理软件的设计与实现过程,通过对源代码的解读和论文的分析,我们可以深入理解图像处理的基本原理以及C++在该领域的应用。 首先,图像处理的核心在于算法,包括图像的...
此外,面向对象编程还广泛应用于人工智能、游戏开发、桌面应用等领域。 学习Python面向对象编程,首先应该掌握Python的基本知识,如变量、数据类型、控制结构、函数等。其次,需要深入理解面向对象的基本概念,包括...
智能车软件系统的设计与仿真是一项涉及多个领域知识的高科技项目,其中包括图像处理、控制系统设计、传感器技术、电子通信以及计算软件的应用等。本篇文献主要介绍了基于Matlab软件和32位单片机MK60X256VLQ100的智能...
综上所述,文档提供的知识点涵盖了智能系统设计、人工智能、虚拟现实技术、VRML编程以及实验室建模等多个领域。这些知识不仅对于设计和开发煤气泄漏报警及智能排险系统有指导意义,还可以广泛应用于其他需要虚拟环境...
本篇文章将围绕“UML智能停车场设计图”这一主题,深入探讨如何运用统一建模语言(UML)来构建智能停车场的系统模型。 首先,UML是一种通用的、可视化建模语言,广泛应用于软件工程领域,用于描述、构建和文档化...
基于QT的PLC梯形图编辑系统设计与实现是一篇发表于2019年的专业文章,主要介绍了一种全新的梯形图编辑系统的设计与实现过程。该系统利用QT图形框架和面向对象的软件设计方法,成功地开发出一种具有高自由度网络拓扑...
在现代信息技术领域,智能鱼缸温度控制系统的设计与实现是一个典型的应用场景,它涉及嵌入式系统设计、温度控制理论和传感器技术等多个知识点。本篇文档描述了一个基于单片机的智能鱼缸温度控制系统的设计方案,强调...