`
hbxflihua
  • 浏览: 678473 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mongodb在java中小试牛刀

阅读更多

对mongodb不是很了解的可以去看看我的上一篇博客 mongodb入门

 

mongodb官方对很多编程语言都提供了ORM框架支持,这里按下不表。本篇以spring data for mongo来简单介绍一下mongodb在java中的使用。

 

Spring Data提供了repository 抽象方式,可以极大的减少数据访问层千篇一律的类似的重复的代码。 基本DAO都会实现,find,findAll, findById, save, delete,update等方法,而且代码逻辑基本一致。Spring Data提供了简化方法,通过接口定义 Spring Data通过Proxy自动提供具体的实现。

 

1、pom.xml文件中 引入spring-data-mongodb 的jar包

		<!-- 配置mongodb -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-mongodb</artifactId>
			<version>1.9.0.RELEASE</version>
		</dependency>

 

2、在spring的ApplicationContext.xml配置mongodb

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
            http://www.springframework.org/schema/data/mongo       
            http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd   
            http://www.springframework.org/schema/context  
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	
	<!-- 标注扫描的类 -->
	<!-- 开启注解 -->
	<context:annotation-config />
	<context:component-scan base-package="com.huatech" />
	
	<!-- 配置数据库的地址和端口 -->
	<mongo:mongo host="127.0.0.1" port="27017" >
		<!-- 设定连接属性 -->
		<mongo:options connections-per-host="8"
                   threads-allowed-to-block-for-connection-multiplier="4"
                   connect-timeout="1000"
                   max-wait-time="1500"
                   auto-connect-retry="true"
                   socket-keep-alive="true"
                   socket-timeout="1500"
                   slave-ok="true"
                   write-number="1"
                   write-timeout="0"
                   write-fsync="true"/>
	</mongo:mongo>
	
	<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
	<!-- 如果没有创建数据库,就会默认创建数据库
	   username="root"  
	   password="root"
	  -->
	<mongo:db-factory id="mongoDbFactory"  
	                  host="127.0.0.1"  
	                  port="27017"  
	                  dbname="test"  	                
	                  mongo-ref="mongo"/>  
	<!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成
		设定我们的 mongoDbFactory 对象
	 -->
	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
	</bean>
</beans>
 

 

3、建立公共的MongoDao接口

package com.huatech.dao;

import java.util.List;

import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.huatech.common.Page;
import com.huatech.entity.MongoEntity;


/**
 * 建立公共的MongoDao接口,所有的Dao都需要继承这个类
 * @author lh@erongdu.com
 * 2017年4月21日
 *
 * @param <T>
 */
public interface MongoDao<T extends MongoEntity<T>> {

    /** 
     * 通过条件查询实体(集合)
     *  
     * @param query 
     */  
    List<T> list(Query query) ;  
    /**
     * 获取所有的数据
     * @return
     */
    List<T> list() ;  
  
    /** 
     * 通过一定的条件查询一个实体 
     *  
     * @param query 
     * @return 
     */  
    T findOne(Query query) ;  
  
    /** 
     * 通过条件查询更新数据 
     *  
     * @param query 
     * @param update 
     * @return 
     */  
    void update(Query query, Update update) ; 
    
    /**
     * 通过给定的对象进行更新(只更新非空的属性)
     * @param entry
     */
    void update(T entry);
  
    /** 
     * 保存一个对象到mongodb 
     * 使用的是mongotemplate的insert方法
     * 
     * 添加的时候,会制动增长id 
     * id  必须是 String  id 字段
     *  
     * @param entity 
     * @return 
     */  
    void insert(T entity) ;  
    
	/**
	 * 批量插入
	 * @param list
	 */
	void insertBatch(List<T> list);
  
    /** 
     * 通过ID获取记录 
     *  
     * @param id 
     * @return 
     */  
    T get(String uuid) ;  
  
    /** 
     * 通过ID获取记录,并且指定了集合名(表的意思) 
     *  
     * @param id 
     * @param collectionName 
     *            集合名 
     * @return 
     */  
    T findById(String uuid, String collectionName) ;  
      
    /** 
     * 分页查询 
     * @param page 
     * @param query 
     * @return 
     */  
    Page<T> findPage(Page<T> page, Query query);  
      
    /** 
     * 求数据总和 ,根据给定的 Query查询
     * @param query 
     * @return 
     */  
    long count(Query query);
    
    /**
     * 获取所有数据条数
     * @return
     */
    long count();
    
    /**
     * 通过id删除数据
     * @param uuid
     */
    void delete(String uuid);
    /**
     * 一次删除多条数据
     * @param ids
     */
    void deletes(String [] ids);
    /**
     * 通过传递过来的 对象来删除数据
     * @param entry
     */
    void delete(T entry);

}

  MongoDao实现类

package com.huatech.dao.impl;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.huatech.common.Page;
import com.huatech.common.util.ReflectionUtils;
import com.huatech.common.util.StringUtils;
import com.huatech.common.util.UuidUtil;
import com.huatech.dao.MongoDao;
import com.huatech.entity.MongoEntity;

/**
 * 这个MongoDaoImpl实现了MongoDb大部分有用的方法
 * @author lh@erongdu.com
 * 2017年4月21日
 *
 * @param <T>
 */

public class MongoDaoImpl<T extends MongoEntity<T>> implements MongoDao<T> {
	
	private Class<T> clazz = ReflectionUtils.getClassGenricType(super.getClass());


	/**
	 * spring mongodb 集成操作类 
	 */
	private MongoTemplate mongoTemplate;

	@Resource(name = "mongoTemplate")
	public void setMongoTemplate(MongoTemplate mongoTemplate) {
		this.mongoTemplate = mongoTemplate;
	}

	// 提供mongoTempldate获取更多的操作
	public MongoTemplate getMongoTemplate() {
		return mongoTemplate;
	}

	public List<T> list(Query query) {
		return this.mongoTemplate.find(query, clazz);
	}

	public T findOne(Query query) {
		return this.mongoTemplate.findOne(query, clazz);
	}

	public void update(Query query, Update update) {
		mongoTemplate.findAndModify(query, update, clazz);
	}

	/**
	 * 添加实体 
	 */
	public void insert(T entity) {
		entity.setUuid(UuidUtil.genUuid());
		// 获取对象,然后加上id
		mongoTemplate.insert(entity);
	}
	
	/**
	 * 批量添加
	 */
	@Override
	public void insertBatch(List<T> list) {
		mongoTemplate.insertAll(list);
	}
	
	/**
	 * 通过id来加载数据对象
	 */
	public T get(String id) {
		return mongoTemplate.findById(id, clazz);
	}
	
	/**
	 * 通过id来查找我们的数据对象
	 */
	public T findById(String id, String collectionName) {
		return mongoTemplate.findById(id, clazz, collectionName);
	}

	/**
	 * 这个是通过Query查询
	 */
	public long count(Query query) {
		return mongoTemplate.count(query, clazz);
	}

	/**
	 * 获取本集合中的条数
	 */
	public long count() {
		return count(new Query(Criteria.where("").is("")));
	}

	/**
	 * 删除记录
	 */
	public void delete(String id) {
		mongoTemplate.remove(new Query(Criteria.where("_id").is(id)),
				clazz);
	}
	/**
	 * 直接删除传递过来的实体对象
	 */
	public void delete(T entry) {
		mongoTemplate.remove(entry);
	}
	
	/**
	 * 更新我们的实体类
	 */
	public void update(T entry) {
		try {
			
			// 获取所有的字段,然后设定到update中
			// 将所有获取的数据 放下Update中
			Update update = new Update();
			
			List<String> fieldNames = getClassFieldName(clazz);
			for (String fieldName : fieldNames) {
				if (StringUtils.isNotBlank(fieldName) && !"uuid".equals(fieldName) && !"serialVersionUID".equals(fieldName)) {
					Object fieldValue = BeanUtils.getProperty(entry, fieldName);
					if(!StringUtils.isBlank(fieldValue)){
						update.set(fieldName, fieldValue);	
					}
				}
			}
//			Iterator<String> it = fields.keySet().iterator();
//			while (it.hasNext()) {
//				String fieldName = it.next();
//				if (StringUtils.isNotBlank(fieldName) && !"uuid".equals(fieldName) && !"serialVersionUID".equals(fieldName)) {
//					Object fieldValue = BeanUtils.getProperty(entry, fieldName);
//					if(!StringUtils.isBlank(fieldValue)){
//						update.set(fieldName, fields.get(fieldName));	
//					}
//				}
//				
//			}
			
//			@SuppressWarnings("unchecked")
//			Map<String, Object> fields = JsonMapper.fromJsonString(JsonMapper.toJsonString(entry), Map.class);
//			Iterator<String> it = fields.keySet().iterator();
//			while (it.hasNext()) {
//				String fieldName = it.next();
//				if (StringUtils.isNotBlank(fieldName) && !"uuid".equals(fieldName)) {
//					update.set(fieldName, fields.get(fieldName));	
//				}
//			}
			
			// 然后更新我们的对象
			this.mongoTemplate.updateFirst(
					new Query(Criteria.where("_id").is(entry.getUuid())), update,
					clazz);
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
	}
	
	private static List<String> getClassFieldName(Class<?> clazz) {
		Field[] declaredFields = clazz.getDeclaredFields();
		List<String> fields = new ArrayList<>();
		List<String> superFields = new ArrayList<>();
		for (Field field : declaredFields) {
			fields.add(field.getName());
		}
		if (clazz.getSuperclass() != null && clazz.getSuperclass().getClass().equals(MongoEntity.class)) {
			superFields = getClassFieldName(clazz.getSuperclass());
		}
		fields.addAll(superFields);
		return fields;
	}
	
	/**
	 * 删除多条数据
	 */
	public void deletes(String[] ids) {
		for (String id : ids) {
			delete(id);
		}
	}
	/**
	 * 获取集合中所有的数据
	 */
	public List<T> list() {
		return this.mongoTemplate.findAll(clazz);
	}
	
	
	public Page<T> findPage(Page<T> page, Query query) {
		// 获取页面的大小和 页面
		if(page == null) page = new Page<>();
		Integer pageSize = page.getPageSize();
		Integer pageNow = page.getPage();
		String order = page.getOrder();
		String sort =page.getSort();
		//获取条数,由于不同的条件,所产生的条数是不一样的
		int count = Integer.parseInt(this.count(query) + "");
		page.setCount(count);
		Sort mySort = null;
		
		if(order == null || "".equals(order.trim())){
			order = "id";
		}
		
		int offset = (pageNow - 1) * pageSize;

		// 页面大小是多少
		query.limit(pageSize);
		// 从多少条开始
		query.skip(offset);
		
		//通过Sort这个 类可以完成排序的问题
		if(sort != null && sort.equalsIgnoreCase("desc")){
			mySort = new Sort(Direction.DESC,order);
		}else{
			mySort = new Sort(Direction.ASC,order);
		}		
		//设定排序
		query.with(mySort);
		page.setRows(this.mongoTemplate.find(query, clazz));
		
		return page;
	}

}

 

4、User实现

    1> MongoEntity

package com.huatech.entity;

import java.io.Serializable;

import org.springframework.data.annotation.Id;



/**
 * Entity 基类
 * @author lh
 * @version 3.0
 * @date 2016年5月9日
 */
public abstract class MongoEntity<T> implements Serializable {

		
	private static final long serialVersionUID = 1L;

	/**
	 * 主键:UUID
	 */
	@Id
	protected String uuid;

	public String getUuid() {
		return uuid;
	}

	public void setUuid(String uuid) {
		this.uuid = uuid;
	}
	
	
}

     2> User

package com.huatech.entity;

import java.util.Date;

import org.springframework.data.mongodb.core.mapping.Document;

@Document
public class User extends MongoEntity<User> {
	

	/**
	 * 
	 */
	private static final long serialVersionUID = -3042174626746305781L;
	private String userName;
	private Date birthday;
	private int sex;
	
	public User() {
	}
	
	public User(String userName, Date birthday, int sex) {
		super();
		this.userName = userName;
		this.birthday = birthday;
		this.sex = sex;
	}

	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "User [uuid=" + uuid +", userName=" + userName + ", birthday=" + birthday + ", sex=" + sex + "]";
	}
	
	
	
}

     3> UserDao 接口继承MongoDao

package com.huatech.dao;

import com.huatech.entity.User;

public interface UserDao extends MongoDao<User> {

}

     4> UserDao实现类

package com.huatech.dao.impl;

import org.springframework.stereotype.Repository;

import com.huatech.dao.UserDao;
import com.huatech.entity.User;

@Repository("userDao")
public class UserDaoImpl extends MongoDaoImpl<User> implements UserDao {
	
	
}

 

5、编写测试用例

package com.huatech.dao.impl;

import java.util.Date;

import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.huatech.dao.UserDao;
import com.huatech.entity.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:ApplicationContext.xml")
public class UserDaoTest {
	
	@Autowired
	private UserDao userDao;
	
	@Test
	public void testAddUser(){
		Logger.getLogger(SpringJUnit4ClassRunner.class); 		
		User user = new User("张三", new Date(), 0);
		userDao.insert(user);		
	}
	
	@Test
	public void testGet(){
		User user = userDao.get("9daaa5d958364acf9b6be3edf9660502");
		System.out.println(user.toString());
	}
	
	@Test
	public void testUpdate(){
		User user = userDao.get("9daaa5d958364acf9b6be3edf9660502");
		user.setBirthday(null);
		user.setSex(1);
		userDao.update(user);
	}

}

 附件为整个工程代码,有需要的可以下载。

分享到:
评论

相关推荐

    mongodb_java_2.6_API

    在Java编程环境中,与MongoDB交互主要通过其提供的Java驱动程序。本篇将深入探讨"mongodb_java_2.6_API",即MongoDB 2.6版本的Java驱动程序API,了解如何使用Java进行MongoDB的开发。 1. **MongoDB Java驱动程序...

    MongoDB 在java中的应用 纯Java操作

    ### MongoDB在Java中的应用 #### 一、MongoDB简介与安装步骤 MongoDB是一种非常流行的NoSQL数据库系统,尤其适用于需要处理非结构化或半结构化数据的应用场景。其灵活性和扩展性使得它成为众多开发者的首选。在...

    MongoDB、Java与对象关系映射

    在Java开发环境中集成MongoDB,开发者通常会使用官方提供的Java驱动程序。该驱动程序提供了丰富的API,使得Java开发者可以直接操作MongoDB数据库。除了基本的CRUD(创建、读取、更新、删除)操作外,还可以利用高级...

    mongodb-java-driver-4.4.0.jar

    mongodb-java-driver-4.4.0.jar

    Mongodb + GridFS +Java 操作Mongodb中存储的文件

    总之,Java中的MongoDB GridFS API提供了强大且灵活的方式来存储和管理大型文件。通过以上步骤,你可以实现文件的上传、下载、查询和删除,为你的应用程序提供了高效的数据存储解决方案。在实际开发中,记得根据需求...

    mongodb在java中的使用

    在Java开发中,我们可以使用MongoDB Java驱动程序来与MongoDB进行交互。本篇文章将深入探讨如何在Java环境中使用MongoDB,包括基本的连接设置、数据操作以及高级功能如分组和模糊查询。 首先,确保已安装MongoDB...

    MongoDB for Java Developers

    MongoDB for Java Developers Design, build, and deliver efficient Java applications using the most advanced NoSQL database

    MongoDBjava各版本驱动下载

    在Java中使用MongoDB,首先需要安装并配置对应的驱动版本,以确保与正在运行的MongoDB服务器兼容。 1. MongoDB驱动介绍: MongoDB提供了多种语言的驱动程序,Java驱动是其中之一。它基于Java 6及更高版本,实现了...

    java连接mongodb的jar包

    在本文中,我们将深入探讨如何使用Java连接MongoDB,涉及的知识点包括MongoDB Java驱动程序的安装、配置,以及基本的连接和操作数据库的方法。 首先,我们来看“java连接mongodb的jar包”。这个“mongodbjar”通常...

    MongoDB免安装 java Demo

    在Java中,这通常涉及构建一个查询对象,并将其传递给MongoDB的find()方法。查询结果会以MongoDB的Cursor对象返回,我们可以遍历这个Cursor来获取每个匹配的文档。 插入数据则需要使用insertOne()或insertMany()...

    MongoDB之Java使用例子

    在这个“MongoDB之Java使用例子”中,我们将深入探讨如何在Java环境中操作MongoDB数据库,包括增、删、改、查(CRUD)操作以及图像数据的存储和检索。 首先,Java与MongoDB的交互主要通过MongoDB的Java驱动程序实现...

    mongodb_java_driver

    mongodb_java_driver 已经验证可用!

    MongoDB Java API 中文

    MongoDB Java 驱动提供了一个 `DBObject` 接口用于保存对象至数据库中。下面是一个简单的例子: ```java public class Tweet implements DBObject { // ... } Tweet tweet = new Tweet(); tweet.put("user", ...

    mongodb 3.4.2 java包

    在Java中,开发者可以通过构建BSON对象(二进制JSON)来构造查询,利用MongoDB的查询API执行这些查询。此外,还可以使用聚合框架进行数据处理和分析,例如计算平均值、分组数据等。 5. **安全性**:MongoDB 3.4.2...

    MongoDB-Java驱动API

    在Java开发环境中,MongoDB提供了Java驱动API,使得Java程序员可以方便地与MongoDB进行交互。本文档将深入探讨如何利用Java驱动API来操作MongoDB数据库。 一、MongoDB Java驱动API简介 MongoDB的Java驱动程序是Java...

    java中mongodb使用环境详细配置

    Java 中 MongoDB 使用环境详细配置是指在 Windows 平台(WinXP)上安装、运行、安装 Windows 服务的笔记,以作备忘。下面是一些重要的知识点: 1. MongoDB 的下载和安装 MongoDB 提供了多种操作系统的版本,包括 ...

    mongodb的java驱动包

    这是一个java的mongodb的驱动包,使用它就能够与用java去连接mongodb服务器,和操作mongodb

    mongodb_java_demo

    在Java中,增、删、改、查的操作都是通过MongoCollection对象进行的。以下是一些基本操作的例子: 1. 增加数据: ```java MongoCollection&lt;Document&gt; collection = database.getCollection("myCollection"); ...

    mongodb的java驱动jar包3.7.0

    在MongoDB中,数据通常是以BSON形式存储的,因此这个库是Java驱动程序与MongoDB交互的基础。它提供了解析和生成BSON文档的工具,包括`BsonDocument`和`BsonValue`等类,方便了数据的转换和处理。 在3.7.0版本中,...

Global site tag (gtag.js) - Google Analytics