在前两篇文章中,我们介绍了操作Mongo数据库的类型Curd和Finder,下面要理解的是框架内mongoDB操作的条件类型——MongoDBQueryCondition。
MongoDBQueryCondition是一个接口,规定了一些实现类需求方法,这个类有唯一的实现类MongoDBQueryConditionImpl,在实现类中,包含几个关键属性,分别是:
- String tableName
- Object condition
- Document conditionBson
- Int pageSize
- Int currentPage
- Document orderBy
- Class<?> clazz
tableName用于存放指定条件的表名,condition是一个用于实现类的内部类使用的属性,conditionBson用于存放用于内部类使用的Mongo节点类型,pageSize和currentPage大家应该不陌生,这两个属性用于存放分页查询的条件,orderBy用于存放排序的条件,clazz是一个用于内部类使用的类类型属性。在该实现类中,给出了pageSize,currentPage,tableName,clazz,condition,orderBy这些属性的get方法,用户可以通过get方法查询到当前查询条件对象的各个属性的状态。
下面讲解该类最重要的内部类成分,在这之前还有一点需要提一下的是,MongoDBQueryCondition接口中有一个静态方法Condition,该方法参数为一个函数,用户可以使用lambda轻松编写查询条件,该方法中创建了接口实现类的内部类Buidler,通过链式调用Builder内部的方法来添加,方法本身并不返回builder对象,因为内部通过java8的Consumer类的accept()忽略了进行传入参数函数并执行函数后获得的返回值,框架为该方法指定返回一个MongoDBQueryCondition对象。
内部类在上边已经提过,叫做Builder,在类中,它创建了一个它的外部类MongoDBQueryConditionImpl实例,内部有一个方法getCondition()会将该实例返回,上文说的MongoDBQueryCondition对象就是通过该方法获得。
类中的Table方法参数为Object对象,它将该对象的类名作为表名,并且用过该对象的类构造器获取该类的类类型作为类型属性,以确定条件中表的属性参数,它有一个重载方法,传递两个参数,分别是String类型的表名字和Class类类型,用户可以通过该重载方法添加不同于类名的表名的查询条件(如类名为A,但数据库表名为B)。
Page方法参数为两个int类型的参数,第一个参数表示当前页数,第二个参数表示取出数目,需要注意的是框架的分页已经实现完毕,不需要进行其他的计算,如果需要取出第3页数据,每页展示10条数据,那么参数应该传为(3,10),而不是(20,10)。
Condition方法参数为一个泛型类型,在使用TitanFramework之前,您的数据结构也许使用了DBObject而非Document的形式进行存储,Titan内部没有提供该形式的存储方式,但提供了读取该形式数据的方法,若在调用该方法之前没有调用Table方法,默认会使用该类名作为表名条件,查询表中符合条件的DBObject对象。
Condition有一个重载方法,传递两个参数,一个是String类型的key,表示查询条件key关键字,一个是Object类型的value,表示查询条件的value关键字,这个重载方法和上面的方法不同的地方在于这里使用了Document的形式读取数据,并且没有默认的表名称判断,需要用户显式调用Table指定查询的表名,框架会根据条件去查找表中符合"key":"value"的数据集合。如果value的类型为java.util.List,那么会判断为用户需要查询一键多值的情况,类似于$in查询条件。用户可以使用多个Condition来完成最终的符合条件查询。
OrderBy是一个排序方法,有两个参数类型,传递key和value,这里不再判断任何条件,用户可以根据业务需求和上面的方法组合成复杂的嵌套排序筛选出最终结果。