`
yu120
  • 浏览: 81823 次
社区版块
存档分类
最新评论

③BuguMongo---DAO操作

阅读更多

三、DAO操作

对象-文档映射中那样,给实体类加上了注解,并且实现了BuguEntity接口,接下来就可以使用BuguDao类操作该实体了。

BuguDao构造函数

你需要编写自己的Dao,如FooDao,来操作Foo相关的数据。FooDao需要继承自BuguDao,并且,在FooDao的构造函数中,需要传递Foo.class,如下:

public class FooDao extends BuguDao<Foo>{
    public FooDao(){
        super(Foo.class);
    }}

插入

BuguDao中有如下方法可用于插入数据:

public WriteResult insert(T t)
public WriteResult insert(List<T> list)  //批量插入:主键不能设置为自动增长(@Id(type=
					     IdType.AUTO_INCREASE, start=1000))
public WriteResult save(T t)  //如果t中没有ID值,则为插入,若有ID值,则为修改。用户自定义ID除外。

其中,当使用save(obj)方法时,如果obj中的id值为null,则实际执行插入操作;如果obj中的id值不为null,则实际执行修改操作。(@Id的type=IdType.USER_DEFINE的情况除外)

例:

Foo foo =newFoo();
foo.setName("Frank");
foo.setLevel(10);
FooDao dao =newFooDao();
dao.save(foo);
String id = foo.getId();  //保存至数据库后,foo中有id值了

删除

public void drop()  //删除整个Collection
public WriteResult remove(T t)
public WriteResult remove(String id)
public WriteResult remove(List<String> idList)  //批量删除
public WriteResult remove(String key,Object value)  //按条件删除
public WriteResult remove(BuguQuery query)  //按条件删除

修改

对于修改过的对象,可以调用如下方法进行保存:

public WriteResult save(T t)

除此之外,mongoDB还提供了大量的对数据记录进行直接修改的方法。这些方法实在太多了,而且还在不断增加,因此BuguMongo把这些方法集中到了一个类BuguUpdater中:

BuguUpdater updater = dao.update();

我们看看BuguUpdater类中有哪些方法:

/* 修改属性值 */
public WriteResult set(BuguQuery query,String key,Object value)
public WriteResult set(BuguQuery query,Map values)
public WriteResult set(T t,String key,Object value)
public WriteResult set(String id,String key,Object value)
public WriteResult set(T t,Map values)
public WriteResult set(String id,Map values)/* 删除属性列 */
public WriteResult unset(T t,String... keys)
public WriteResult unset(String id,String... keys)
public WriteResult unset(BuguQuery query,String... keys)/* 增加、减少数值 */
public WriteResult inc(T t,String key,Object value)
public WriteResult inc(String id,String key,Object value)
public WriteResult inc(BuguQuery query,String key,Object value)/* 乘以某个数值 */
public WriteResult mul(T t,String key,Object value)
public WriteResult mul(String id,String key,Object value)
public WriteResult mul(BuguQuery query,String key,Object value)/* 数组操作 */
public WriteResult push(T t,String key,Object value)
public WriteResult push(String id,String key,Object value)
public WriteResult push(BuguQuery query,String key,Object value)
public WriteResult pushEach(T t,String key,List valueList)
public WriteResult pushEach(String id,String key,List valueList)
public WriteResult pushEach(BuguQuery query,String key,List valueList)
public WriteResult pull(T t,String key,Object value)
public WriteResult pull(String id,String key,Object value)
public WriteResult pull(BuguQuery query,String key,Object value)
public WriteResult popFirst(T t,String key)
public WriteResult popFirst(String id,String key)
public WriteResult popFirst(BuguQuery query,String key)
public WriteResult popLast(T t,String key)
public WriteResult popLast(String id,String key)
public WriteResult popLast(BuguQuery query,String key)/* 设置成较小值 */
public WriteResult min(T t,String key,Object value)
public WriteResult min(String id,String key,Object value)
public WriteResult min(BuguQuery query,String key,Object value)/* 设置成较大值 */
public WriteResult max(T t,String key,Object value)
public WriteResult max(String id,String key,Object value)
public WriteResult max(BuguQuery query,String key,Object value)/* 按位操作 */
public WriteResult bitwise(T t,String key,int value,Bitwise bitwise)
public WriteResult bitwise(String id,String key,int value,Bitwise bitwise)
public WriteResult bitwise(BuguQuery query,String key,int value,Bitwise bitwise)

例:

FooDao dao =newFooDao();
Foo foo = dao.query().is("name","Frank").result();
dao.update().set(foo,"level",5);  //把foo的level值修改为5
dao.update().inc(foo,"level",10);  //把foo的level值增加10

基本查询

BuguDao类中提供了一些基本的查询方法,如下:

/* 查询一个 */
public T findOne(String id)
public T findOne(String key,Object value)/* 查询全部 */
public List<T> findAll()publicList<T> findAll(String orderBy)
public List<T> findAll(int pageNum,int pageSize)
public List<T> findAll(String orderBy,int pageNum,int pageSize)/* 查询是否存在 */
public boolean exists(String id)
public boolean exists(String key,Object value)/* 查询数目 */
public long count()
public long count(String key,Object value)/* 查询某一字段的不重复值 */
public List distinct(String key)

高级查询

更高级的查询需要用到BuguQuery类。先看看BuguQuery类中有些什么方法:

生成查询条件

public BuguQuery<T> is(String key,Object value)//等于
public BuguQuery<T> notEquals(String key,Object value)//key不等于value
public BuguQuery<T> greaterThan(String key,Object value)//大于
public BuguQuery<T> greaterThanEquals(String key,Object value)//key大于等于value
public BuguQuery<T> lessThan(String key,Object value)//小于
public BuguQuery<T> lessThanEquals(String key,Object value)//key小于等于value
public BuguQuery<T> in(String key,Object... values)//查询key值为这些的数据
public BuguQuery<T> in(String key,List list)//查询key值为这些的数据
public BuguQuery<T> notIn(String key,Object... values)//查询key值不属于这些的数据
public BuguQuery<T> notIn(String key,List list)//查询key值不属于这些的数据
public BuguQuery<T> all(String key,Object... values)//查询key值为这些的数据
public BuguQuery<T> size(String key,int value)//
//查询key取模divisoe等于remainder运算
public BuguQuery<T> mod(String key,int divisor,int remainder)
public BuguQuery<T> existsField(String key)//查询所有字段key存在的数据
public BuguQuery<T> notExistsField(String key)//查询所有字段key不存在的数据
public BuguQuery<T> regex(String key,String regex)//
public BuguQuery<T> where(String whereStr)//
public BuguQuery<T> or(BuguQuery... qs)//
public BuguQuery<T> and(BuguQuery... qs)//

地理空间数据查询

public BuguQuery<T> near(String key,double x,double y)
public BuguQuery<T> near(String key,double x,double y,double maxDistance)
public BuguQuery<T> withinCenter(String key,double x,double y,double radius)
public BuguQuery<T> withinBox(String key,double x1,double y1,double x2,double y2)

设置查询参数:

public BuguQuery<T> slice(String key,long num)
public BuguQuery<T> returnFields(String... fieldNames)//返回字段
public BuguQuery<T> notReturnFields(String... fieldNames)//
public BuguQuery<T> sort(String orderBy)//排序
public BuguQuery<T> pageNumber(int pageNumber)//页数
public BuguQuery<T> pageSize(int pageSize)//页码大小

返回查询结果

public T result()  //返回一个实体
public List<T> results()  //返回多个实体
public long count()//统计
public boolean exists()//存在
public List distinct(String key)//查询key的所有不重复的对象集合

创建BuguQuery

通过调用BuguDao中的query()方法,就可以创建一个BuguQuery对象:

public class FooDao extends BuguDao<Foo>{
    public FooDao(){
        super(Foo.class);
    }
    ...}
FooDao dao =new FooDao();
BuguQuery<Foo> q = dao.query();...

用BuguQuery实现查询

支持连缀书写形式

List<Foo> list = dao.query().greaterThan("level",10).notEquals("name",
		"Frank").results();

支持分页

List<Foo> list = dao.query().greaterThan("level",10).
notEquals("name","Frank").pageNumber(1).pageSize(20).results();

支持指定返回、不返回某些字段

//只返回id、name、level这三个字段
BuguQuery query1 = dao.query().greaterThan("level",10).
				returnFields("name","level");
//不返回detail、comments这两个字段
BuguQuery query2 = dao.query().greaterThan("level",10).
			notReturnFields("detail","comments");  

支持Entity对象作为查询条件

FatherDao fDao =new FatherDao();
FatherFoo father = fDao.query().is("id","4dcb4d1d3febc6503e4e5933").result();
Foo foo = dao.query().is("father", father).result();  
//用FatherFoo对象作为查询条件

支持字符串形式的排序

List<Foo> list = dao.query().in("name","Frank","John").
		sort("{level:1, timestamp: -1}").results();

注意事项

1、对于数组、List、Set,在MongoDB中都被保存成数组,可以用push、pull等方法对其进行操作。

2、BuguMongo支持用字符串来表示排序规则。对于其书写方法,请参考这里

3、对数据库的更新操作,都有一个返回值WriteResult,代表了操作的结果。该类由mongoDB Java Driver提供,其详细信息,可以查看这里。 4、使用DAO操作MongoDB时,应该使用数据库的字段名称,而不是Java的属性名称。

比如:

@Property(name="total_score")
private int totalScore;

那么,操作数据库的时候,应该是:

list = dao.query().is("total_score",1000).results();    
//注意:不是totalScore

一种较好的习惯是:尽量不设置@Property、@Embed、@EmbedList、@Ref、@RefList等注解的name属性,使得数据库的字段名称,与Java的属性名称,保持一致。

分享到:
评论
5 楼 天涯海角tour 2016-11-25  
尽量不设置@Property、@Embed、@EmbedList、@Ref、@RefList等注解的name属性


在用@Ref时当关联表的数据很大时,速度很慢。很慢。很慢。
4 楼 深水蓝 2015-10-23  
有分组查询么?
3 楼 深水蓝 2015-04-15  
这个or方法怎么用啊,试了一下好像是当and查询一样
比如我要查user1=2或者 user2=2
我在query1 里用了 user1 is 2 ,query2用了user2 is 2 然后再query1.or(query2)
查询结果是必须两个同时满足上面的查询条件,这个问题很严重呀,这是非常基本的需求,
好像满足不了这样的查询,求指导。
2 楼 yu120 2014-11-21  
我用bugu-mongo-1.14时都有,你用的两个版本应该也是有的,你反编译后看看,或者是你的使用方式错了,建议你在检查检查
1 楼 spc_cpx 2014-11-19  
请教一个问题,我下载的是1.10以及1.12版本,为什么dao里没有update()和query()方法呢?

相关推荐

    ibatis-dao-2.jar

    ibatis-dao-2.jar gggggggggggg

    s2-dao-1.0.50.zip

    - **s2dao-tiger**:这可能是针对特定JDBC驱动(如Oracle、MySQL等)或Java版本的扩展库,提供了针对不同数据库特性的定制化功能。 - **doc**:文档文件,可能包含S2-DAO的用户手册、API参考、教程或者示例代码,是...

    s2-dao-1.0.49.zip

    标题中的“s2-dao-1.0.49.zip”指的是Seasar2项目中的一个特定版本,DAO(Data Access Object)模块的压缩包。Seasar2是一个Java平台上的开源框架,它旨在简化企业级应用的开发过程,尤其是数据库相关的操作。DAO层...

    spring-dao-2.0.8.jar

    spring-dao-2.0.8.jar

    使用jsp-servlet-service-dao四层结构完成用户信息的增删改查操作

    它封装了DAO层的操作,为Servlet提供更高级别的服务接口。 4. **DAO(Data Access Object)**:DAO层是数据访问层,直接与数据库进行交互。它的任务是执行SQL查询,将数据对象转换为数据库记录,反之亦然。 在本...

    iBATIS-DAO-2

    ### iBATIS Data Access Objects (DAO):一种强大的持久层抽象技术 ...无论是处理单一数据库还是跨多个数据库的操作,iBATIS DAO API都提供了可靠的工具和方法,使得开发者能够专注于业务逻辑,而不是底层的技术细节。

    map-dao是数据库接口包

    在软件开发中,数据库操作是不可或缺的一部分,而“map-dao”就是专为这一目的设计的数据库接口包。本文将全面探讨map-dao的核心概念、功能特性以及如何在实际项目中有效应用,帮助开发者更好地理解和利用这一工具。...

    -web-Dao-Service-Controller--master.zip

    本篇文章将深入探讨一个基于-ioc(Inversion of Control,控制反转)、aop(Aspect Oriented Programming,面向切面编程)、mvc(Model-View-Controller,模型-视图-控制器)的Java后端框架,以-web-Dao-Service-...

    spring-dao.jar

    spring-dao.jar spring-dao.jar

    dao-unit-test.ftl

    dao-unit-test.ftl

    hibernate3.jar、ibatis-dao-2.jar、spring.jar、struts.jar、log4j-1.2.9.jar

    5. **iBatis-dao-2.jar**:iBatis(在本例中可能是iBATIS DAO的特定版本)是另一种ORM框架,不同于Hibernate,它更强调SQL的灵活性。iBatis允许开发者编写自定义的SQL,将SQL语句直接嵌入XML配置文件或Java代码中,...

    applicationContext-dao.xml配置

    《深入解析:applicationContext-dao.xml配置》 在软件开发中,特别是在Java企业级应用中,Spring框架扮演着至关重要的角色。Spring的核心是IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...

    mybatis的基本演示项目-mybatis-generic-dao-demo-generic

    "mybatis-generic-dao-demo-generic" 是一个基于MyBatis的通用DAO项目的示例,它展示了如何利用MyBatis的插件机制来实现数据访问对象(DAO)的通用化,从而提高开发效率。 在这个项目中,重点可能包括以下几个方面...

    vc-DAO-data.zip_dao vc_vc dao

    在这个"vc-DAO-data.zip_dao vc_vc dao"压缩包中,包含的资源主要与使用VC++(Visual C++)通过DAO接口访问数据库有关。"vc++访问DAO数据库"这个文件名暗示了其中可能包含了C++源代码示例,这些示例展示了如何在VC++...

    用DAO操作数据库--数据库操作

    ### 用DAO操作数据库——数据库操作 #### 一、DAO体系结构与对象模型 ##### 1.1 DAO体系结构 **DAO(Data Access Objects)**是一种面向对象的数据库访问技术,它提供了一种统一的方式,使得开发人员能够通过标准...

    实例程序VC6.0 -----------DAO实例程序

    实例程序VC6.0 -----------DAO实例程序

    spring-dao-2.0.8.jar.zip

    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...

    第12章 数据库操作-DAO篇.rar_C# 数据库 操作_Dao 数据库_dao

    在这个"第12章 数据库操作-DAO篇"中,我们将会深入探讨如何使用C#进行数据库操作以及如何设计和实现DAO。 1. **什么是DAO** DAO是数据访问对象的缩写,它提供了一种方式来封装对数据库的所有操作,使得业务逻辑与...

    ibatis-dao-2.2.0.jar

    ibatis-dao-2.2.0.jar

    dao-hibernate.jar

    dao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jardao-hibernate.jar

Global site tag (gtag.js) - Google Analytics