GreenDao源码学习

网上GreenDao相关的资料不是特别多,除了官方文档几乎没有特别好的资料。自己整理了一份,以备不时之需。

从源码上来分,GreenDao大体可以分成两个项目,DaoCore和DaoGenerator。

DaoGenerator部分:

FreeMarker

DaoGenerator使用FreeMarker根据指定的schema生成代码。

为了能够更好的介绍DaoGenerator的代码,有必要先简单介绍一下FreeMarker的基本功能,

一个基本的FreeMarker工程一般有这三个步骤组成。

1.声明一个configration,用来处理生成代码的逻辑

Configuration   config =
new Configuration();

config.setClassForTemplateLoading(this.getClass(),
"/");

config.setObjectWrapper(new
DefaultObjectWrapper());

指定模版文件地址的方式有三种,

public void setClassForTemplateLoading(Class clazz, String pathPrefix);

public void setDirectoryForTemplateLoading(File dir) throws IOException;

public void setServletContextForTemplateLoading(Object servletContext, String path);

分别基于类路径、文件系统以及Servlet Context

2.生成ftl文件,用来作为生成代码的模版

Template temp = config.getTemplate("test.ftl”);

<html>

<head>

<title>Welcome!</title> </head>

<body>

<h1>Welcome ${user}!</h1>

<p>Our latest product:

<a href="${latestProduct.url}">${latestProduct.name}</a>!

</body>

</html>

这是一个简单的ftl模版的样子,其中${X}表示要用替换对象X进行替换。

3.通过config读取指定的ftl,生成template,进而结合模版,替换对象,输出流,生成最终的文件

Map root = this.getRoot();

Writer out = new OutputStreamWriter(System.out);

temp.process(root, out);

out.flush();

这里的替换对象可以是Map的,也可以是一个普通的bean。

DaoGenerator:

下面切入正题开始看DaoGenerator的代码吧

包路径de.greenrobot.daogenerator 下面有如下几个类:

ContentProvider,

DaoGenerator,

DaoUtil,

Entity,

Index,

Property,

PropertyOrderList,

PropertyType,

Query,

QueryParam,

Schema,

ToMany,

ToOne,

使用顺序:

Schema作为一次完整的活动,它指定了生成代码的包名,其内部一般会有多个Entity,一个Entity对应数据库一张表,Entity下的Property,每个Property对应数据库中一个列。DaoGenerator作为一个入口,通过他的generateAll()方法来触发代码生成。

一般使用的顺序是这样的,先new一个schema,指定好生成代码包路径,然后通过Schema.addEntity(“表名”)得到一个Entity,然后再通过Entity.addXXProperty(“列名”)将指定的property添加到Entity(XX表示列的类型,比如int,String,等等)。

关系指定好之后通过DaoGenerator.generateAll(schema,srcOutputPath),触发根据schema中的关系和参数在数据库中建表,并在指定位置生成相应的实体bean和DAOs。

顺着使用时候的思路,我们来看一下源码里有什么值得我们借鉴的地方吧:

1.在Property的构造部分,由于property参数较多,这里他采用了Builder模式[Gamma95,p97],不直接生成想要的对象,而是让使用者利用必要的参数调用构造器(或者工厂模式),得到一个builder对象,然后使用者在builder对象上调用类似setter的方法,来设置每个可选的相关参数。 最后使用者调用build方法生成不可变的对象。这个builder是他构建的类的静态成员类,下面是他的实现:

public class Property {

public static class PropertyBuilder {

private final Property property;

public PropertyBuilder(Schema schema, Entity entity, PropertyType propertyType, String propertyName) {

property = new Property(schema, entity, propertyType, propertyName);

}

public PropertyBuilder columnName(String columnName) {

property.columnName = columnName;

return this;

}

public PropertyBuilder columnType(String columnType) {

property.columnType = columnType;

return this;

}

.

.

.

.

.

public Property getProperty() { return property; }

}

.

.

}

使用起来是这个样子的:

public PropertyBuilder addProperty(PropertyType propertyType, String propertyName) {

if (!propertyNames.add(propertyName)) {

throw new RuntimeException("Property already defined: " + propertyName);

}

PropertyBuilder builder = new Property.PropertyBuilder(schema, this, propertyType, propertyName);

properties.add(builder.getProperty());

return builder;

}

public PropertyBuilder addIdProperty() {

PropertyBuilder builder = addLongProperty("id");

builder.columnName("_id").primaryKey();

return builder;

}

注意这里类似setter的方法(columnName,columnType,等等)返回的都是builder本身,这样就可以把调用链起来。

时间: 2024-10-08 02:48:27

GreenDao源码学习的相关文章

FireMonkey 源码学习(5)

(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec; HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

HSQLDB源码学习——数据库安装启动及JDBC连接

HSQLDB 是一个轻量级的纯Java开发的开放源代码的关系数据库系统.因为HSQLDB的轻量(占用空间小),使用简单,支持内存运行方式等特点,HSQLDB被广泛用于开发环境和某些中小型系统中. 在http://sourceforge.net/projects/hsqldb/files/下载了HSQLDB 1.8.0版本.把下载的zip文件解压缩至任意目录例如c:\hsqldb1.8便完成安装. hsqldb有四种运行模式: 一.内存(Memory-Only)模式:所有数据都在内存里操作.应用程

lodash源码学习(10)

_.delay(func, wait, [args]) 延迟wait毫秒之后调用该函数,添加的参数为函数调用时的参数 //delay.js var baseDelay = require('./_baseDelay'),//baseDelay方法 baseRest = require('./_baseRest'),//创建使用rest参数方法 toNumber = require('./toNumber');//转化为数字 /** * * @param {Function} func 需要延迟执

lodash源码学习(2)

继续学习lodash,依然是数组的方法 “Array” Methods _.indexOf(array, value, [fromIndex=0]) 获取value在数组 array所在的索引值 使用 SameValueZero方式比较(第一个全等===的元素). 如果 fromIndex 值是负数, 则从array末尾起算 该方法依赖于strictIndexOf和baseIndexOf方法,先看它们的源码 //_strictIndexOf.js /** * _.indexOf的专业版本,对元素

jQuery源码学习感想

还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码,那时我不明白他们为何要求那么高,现在才知道,原来没那么高,他问的都是jQuery最基本的框架架构,不过对于不知道的来说,再简单我也是不知道,那时写了一篇博文去吐槽了一下,那时候也是我自己真正激发自己的时候,那时候我说我一定要搞好自己的jQuery基础,没想到那么快就实现了,一个月的源码学习时间就结束

Redis源码学习-Lua脚本

Redis源码学习-Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开发环境搭建>. 要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会

tomcat源码学习(2)&#160;&#160;关于apache&#160;digest

好久不写博文,罪过罪过.因为最近公司比较忙加上琐事有点多,所以隔了好久才来更新博文. apache digest本来是struts2框架中来加载xml文件并实例化对象的一个jar包,后来使用的越来越多. 我们都知道tomcat的conf文件夹下有一个server.xml配置文件,我们经常会其中的来进行配置以来运行一个java web项目,也经常修改中的port属性以来实现修改tomcat监听的端口.其实每个标签基本上都对应着一个对象,那tomcat是如何将这些对象实例化到java 虚拟机的运行内