MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
暂且不讨论它的优缺点,下面是个人刚开始接触mongodb,并与springmvc集成的一个学习过程:
一、导包,建议使用maven工程,pom导包非常方便。
二、配置好项目SpringMVC和mongoDB集成的环境
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>MongoDBSpring</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>lztspringmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- DispatcherServlet在初始化方法里面,会读取该初始化参数的值
来获取spring配置文件的位置,然后启动spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>lztspringmvc</servlet-name>
<url-pattern>*.lzt</url-pattern>
</servlet-mapping>
<!-- CharacterEncodingFilter配置 编码问题-->
<filter>
<filter-name>lztfilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>lztfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
">
<!-- 包的扫描路径 -->
<mvc:annotation-driven/>
<context:component-scan base-package="com.lzt"/>
<!-- 静态配置文件的过滤 -->
<mvc:resources location="/public/**" mapping="/public/**"/>
<!-- 配置文件读取 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:mongodb.properties</value>
</list>
</property>
</bean>
<!-- 导入其他spring配置文件 -->
<import resource="spring-mongDB.xml" />
</beans>
spring-mongoDB.xml
<?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/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mongo:mongo id="mongo" host="${mongo.db.ip}" port="${mongo.db.port}"></mongo:mongo>
<!-- 用户验证 -->
<bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="${mongo.db.username}" />
<constructor-arg name="password" value="${mongo.db.password}" />
</bean>
<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
<bean id="mongoDbFactory"
class="org.springframework.data.mongodb.core.SimpleMongoDbFactory">
<constructor-arg ref="mongo" />
<constructor-arg value="${mongo.db.dbname}" />
<constructor-arg ref="userCredentials" />
</bean>
<bean id="mappingContext"
class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultMongoTypeMapper"
class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey">
<null />
</constructor-arg>
</bean>
<!-- collection的映射 -->
<bean id="mappingMongoConverter"
class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<property name="typeMapper" ref="defaultMongoTypeMapper" />
</bean>
<!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
</beans>
mongodb.properties文件
mongo.db.ip=localhost
mongo.db.port=27017
mongo.db.dbname=lzt
mongo.db.username =
mongo.db.password =
三、简单的增删查改,加测试
1、先定义一个对应数据库文档的类,菜鸟类(CaiNiao)
package com.lzt.entity;
import java.util.Arrays;
import java.util.List;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "test")
public class CaiNiao {
private String _id;
private String title;
private String description;
private String by;
private String url;
private List<String> tags;
private Integer likes;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getBy() {
return by;
}
public void setBy(String by) {
this.by = by;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getLikes() {
return likes;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
public void setLikes(Integer likes) {
this.likes = likes;
}
@Override
public String toString() {
return "CaiNiao [_id=" + _id + ", title=" + title + ", description=" + description + ", by=" + by + ", url="
+ url + ", tags=" + tags + ", likes=" + likes + "]";
}
}
2、定义一个公共接口MongoGenDao,并实现,方便以后有多个对应文档的类操作,当有共同的操作的时候,dao层实现类直接继承之后调用。
package com.lzt.dao;
public interface MongoGenDao<T> {
//保存
public void save(T t);
}
实现类
package com.lzt.dao.daoImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import com.lzt.dao.MongoGenDao;
public class MongoGenDaoImpl<T> implements MongoGenDao<T> {
@Autowired
protected MongoTemplate mongoTemplate;
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public void save(T t) {
this.mongoTemplate.save(t);
}
}
对应菜鸟类的dao层接口
package com.lzt.dao;
import java.util.List;
import com.lzt.entity.CaiNiao;
public interface CaiNiaoDao extends MongoGenDao<CaiNiao>{
//查询
public List<CaiNiao> list(Integer likes);
//更新
public int update(String title,String url);
//分页查询
public List<CaiNiao> findPage(int start,int pagesize);
public int delete(String _id);
}
实现类
这里写代码片
package com.lzt.dao.daoImpl;
import java.util.List;
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 org.springframework.stereotype.Repository;
import com.lzt.dao.CaiNiaoDao;
import com.lzt.entity.CaiNiao;
import com.mongodb.WriteResult;
@Repository("caiNiaoDao")
public class CaiNiaoDaoImpl extends MongoGenDaoImpl<CaiNiao> implements CaiNiaoDao {
public List<CaiNiao> list(Integer likes) {
Query query = new Query();
query.addCriteria(new Criteria("likes").is(likes));
//query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "_id")));
return this.mongoTemplate.find(query, CaiNiao.class);
}
public int update(String title,String url) {
Query query = new Query();
query.addCriteria(Criteria.where("title").is(title));
Update update = new Update();
update.set("url", url);
//updateMulti更新多条,updateFirst更新一条
WriteResult result = this.mongoTemplate.updateMulti(query, update, CaiNiao.class);
return result.getN();
}
public List<CaiNiao> findPage(int start, int pagesize) {
/*Integer i = this.mongoTemplate.findAll(CaiNiao.class).size();
System.out.println("总条数"+i);
int pagetotal = i%pagesize==0?(i/pagesize):((i/pagesize)+1);
System.out.println("总页数"+pagetotal);*/
Query query = new Query();
query.skip((start-1)*pagesize);
query.limit(pagesize);
return this.mongoTemplate.find(query, CaiNiao.class);
}
public int delete(String _id) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(_id));
return this.mongoTemplate.remove(query,CaiNiao.class).getN();
}
}
3、测试
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lzt.dao.CaiNiaoDao;
import com.lzt.entity.CaiNiao;
public class mongoTest {
private ApplicationContext ac;
private CaiNiaoDao dao;
@Before
public void init(){
ac = new ClassPathXmlApplicationContext("SpringMVC.xml");
dao = ac.getBean("caiNiaoDao",CaiNiaoDao.class);
}
@Test
public void insert(){
CaiNiao cn = new CaiNiao();
cn.setBy("教程123");
cn.setDescription("不错的教程123");
cn.setLikes(210);
List<String> tags = new ArrayList<String>();
tags.add("mysql");
tags.add("nosql");
tags.add("oracle");
cn.setTags(tags);
cn.setTitle("好1");
cn.setUrl("www.baidu.com");
System.out.println(cn.toString());
dao.save(cn);
}
@Test
public void findList(){
List<CaiNiao> list = dao.list(210);
System.out.println("集合大小"+list.size());
for (CaiNiao caiNiao : list) {
System.out.println("数据"+caiNiao.toString());
}
}
@Test
public void update(){
int n = dao.update("MongoDB 教程", "www.lzt.com");
System.out.println("总更新条数:"+n);
}
@Test
public void page(){
List<CaiNiao> list = dao.findPage(1, 3);
for (CaiNiao caiNiao : list) {
System.out.println(caiNiao.toString());
}
}
@Test
public void delete(){
System.out.println(dao.delete("5947923c0ed14ecbdaa9ac66"));
}
}
对应的mongoDB数据库文档