【Maven+SSM】超详细Spring+SpringMVC+Mongo集成

前言:

2018起,成为一个纯粹的Java后端。有时间我会将项目上经历的,拆分为一篇篇文章,用以巩固知识体系。

本文其实和Mybatis无关,沿用ssm这个系列的文章,当然也是基于这个系列的文章代码接入MongoDb数据库,本文准确的说是Spring+SpringMVC+Mongo集成。

正文:

一、安装MongoDb(已经安装mongo的忽略此部分)

1.1、控制台输入brew命令,更新brew

brew update

常见问题:天朝围墙大又强!解决方案,替换及重置Homebrew默认源(参考文章)。

具体替换默认源如下:

替换brew.git:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

替换homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

1.2、控制台输入命令,安装或者更新mongodb(注意:此处是upgrade不是update!)具体的brew命令可参考这篇文章

安装命令

brew install mongodb
更新命令
brew upgrade mongodb

1.3、配置mongo命令到bash_profile(我是mac笔记本,其他系统随意)

vim .bash_profile 

在其中添加如下几行,根据自身情况修改MONGO_PATH路径。我此处为brew默认的安装mongodb的路径。

export MONGO_PATH=/usr/local/Cellar/mongodb/3.6.2
export PATH=$PATH:$MONGO_PATH/bin

修改完后,使用如下命令使配置立即生效。

source ~/.bash_profile

1.4、运行mongo数据库

1.4.1、启动数据库

控制台执行mongod命令,可能会发现如下提示:

exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating

提示mongo默认写入路径/data/db不存在。那么新建一个路径即可。

sudo mkdir -p /data/db

控制台再次执行mongod,发现如下提示:发现刚刚新建的文件只读。

exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /data/db, terminating

修改/data/db权限:

chmod 777 /data/db

再次执行mongod启动mongo数据库:提示如下即成功。

2018-02-12T15:24:47.244+0800 I NETWORK  [initandlisten] waiting for connections on port 27017

1.4.2、连接数据库

另起一个控制台输入命令mongo,测试是否连接成功:客户端出现右箭头>即连接成功。可在此处输入mongo的crud命令

2018-02-12T15:24:47.224+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
> 

服务端也会提示有一个新链接:

received client metadata from 127.0.0.1:53260 conn: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "3.6.2" }, os: { type: "Darwin", name: "Mac OS X", architecture: "x86_64", version: "17.2.0" } }

可以通过mongodb命令测试一下新建表和查看表数据。

mongodb常用命令:
1、查询库、查询表
show dbs  //查询所有的数据库
show collections   //查询当前数据库下的所有数据表
2、建库和删库
use myDbs  //建立一个名为myDbs的数据库,当这个库存在时则是切换到这个数据库中去
use myDbs
db.dropDatabase();  //这两句是删除这个数据库
3、建表和删表
//表操作都是要先到一个数据库中去,通过use方法
db.myTable.insert({name:’hf’,age:20});  //在mongodb中在插入数据时即创建了改表,此时创建的是名为myTable的数据表
db.myTable.drop();  //删除myTable这个数据表
//如果没有指定数据库,表会创建在mongdb默认数据库test里
4、单表的增删改
db.myTable.insert({name:’hahaha’,age:12});  //新增
db.myTable.update({name:’hf’},{$set:{age:25}})  //修改
db.myTable.remove({name:’hf'});  //删除
5、查询
db.myTable.find();  //查询myTable中的所有数据
db.myTable.find().sort({age:1})  //根据age升续
db.myTable.find().count();  //查询

二、SSM框架接入mongo数据库(项目地址)

2.1、maven项目依赖包:pom.xml

说明:许多奇怪的问题都是因为maven依赖的jar包版本导致的。新增依赖如下:mongo-java-driver,spring-data-mongodb,

spring-context-support三个包。

	
 		4.3.3.RELEASE
		3.2.2  
		1.9.2.RELEASE  
 	
 	  
          org.mongodb  
          mongo-java-driver  
          ${mongodb.java.driver}  
      

      
          org.springframework.data  
          spring-data-mongodb  
          ${spring.data.mongodb}  
      
                
      
          org.springframework  
          spring-context-support  
          ${spring.version}  
      

2.1、我之前文章的项目中我们已经配置好了Spring.xml配置(bean容器中引入mongo)

  
  

target/classes/conf/spring-mongodb.xml配置如下:

此处相当于将mongo需要装配的bean(mongo、mongoTemplate,及自定义的userDao对象)分离到另一个配置文件中,结构清晰。



	    
    
    
    		
    		
    
    
      
此处mongo默认为本地localhost。mongoTemplate模版用来调用mongo的crud方法,针对本地的某个数据库,我当前为手动新建的数据库
user_mongodb_01

2.3、UserDao这个操作数据库类,如果有过其他数据库的经验可轻松阅读如下代码:

package dao.impl;

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 dao.IUserDao;
import model.User;

public class UserDao extends AbstractBaseMongoTemplete  implements IUserDao{
    
    /**  
     * 新增  
     * 
------------------------------
* @param user */ public void insert(User user) { // TODO Auto-generated method stub mongoTemplate.insert(user); } /** * 批量新增 *
------------------------------
* @param users */ public void insertAll(List users) { // TODO Auto-generated method stub mongoTemplate.insertAll(users); } /** * 删除,按主键id, 如果主键的值为null,删除会失败 *
------------------------------
* @param id */ public void deleteById(String id) { // TODO Auto-generated method stub User user = new User(id, null, 0); mongoTemplate.remove(user); } /** * 按条件删除 *
------------------------------
* @param criteriaUser */ public void delete(User criteriaUser) { // TODO Auto-generated method stub Criteria criteria = Criteria.where("age").gt(criteriaUser.getAge());; Query query = new Query(criteria); mongoTemplate.remove(query, User.class); } /** * 删除全部 *
------------------------------
*/ public void deleteAll() { // TODO Auto-generated method stub mongoTemplate.dropCollection(User.class); } /** * 按主键修改, * 如果文档中没有相关key 会新增 使用$set修改器 *
------------------------------
* @param user */ public void updateById(User user) { // TODO Auto-generated method stub Criteria criteria = Criteria.where("id").is(user.getId()); Query query = new Query(criteria); Update update = Update.update("age", user.getAge()).set("name", user.getName()); mongoTemplate.updateFirst(query, update, User.class); } /** * 修改多条 *
------------------------------
* @param criteriaUser * @param user */ public void update(User criteriaUser, User user) { // TODO Auto-generated method stub Criteria criteria = Criteria.where("age").gt(criteriaUser.getAge());; Query query = new Query(criteria); Update update = Update.update("name", user.getName()).set("age", user.getAge()); mongoTemplate.updateMulti(query, update, User.class); } /** * 根据主键查询 *
------------------------------
* @param id * @return */ public User findById(String id) { // TODO Auto-generated method stub return mongoTemplate.findById(id, User.class); } /** * 查询全部 *
------------------------------
* @return */ public List findAll() { // TODO Auto-generated method stub return mongoTemplate.findAll(User.class); } /** * 按条件查询, 分页 *
------------------------------
* @param criteriaUser * @param skip * @param limit * @return */ public List find(User criteriaUser, int skip, int limit) { // TODO Auto-generated method stub Query query = getQuery(criteriaUser); query.skip(skip); query.limit(limit); return mongoTemplate.find(query, User.class); } /** * 根据条件查询出来后 再去修改 *
------------------------------
* @param criteriaUser 查询条件 * @param updateUser 修改的值对象 * @return */ public User findAndModify(User criteriaUser, User updateUser) { // TODO Auto-generated method stub Query query = getQuery(criteriaUser); Update update = Update.update("age", updateUser.getAge()).set("name", updateUser.getName()); return mongoTemplate.findAndModify(query, update, User.class); } /** * 查询出来后 删除 *
------------------------------
* @param criteriaUser * @return */ public User findAndRemove(User criteriaUser) { // TODO Auto-generated method stub Query query = getQuery(criteriaUser); return mongoTemplate.findAndRemove(query, User.class); } /** * count *
------------------------------
* @param criteriaUser * @return */ public long count(User criteriaUser) { // TODO Auto-generated method stub Query query = getQuery(criteriaUser); return mongoTemplate.count(query, User.class); } /** * *
------------------------------
* @param criteriaUser * @return */ private Query getQuery(User criteriaUser) { if (criteriaUser == null) { criteriaUser = new User(); } Query query = new Query(); if (criteriaUser.getId() != null) { Criteria criteria = Criteria.where("id").is(criteriaUser.getId()); query.addCriteria(criteria); } if (criteriaUser.getAge() > 0) { Criteria criteria = Criteria.where("age").gt(criteriaUser.getAge()); query.addCriteria(criteria); } if (criteriaUser.getName() != null) { Criteria criteria = Criteria.where("name").regex("^" + criteriaUser.getName()); query.addCriteria(criteria); } return query; } }

其中父类AbstractBaseMongoTemplete如下,通过它获得mongoTemplate操作类对象用来crud。

package dao.impl;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.data.mongodb.core.MongoTemplate;

public class AbstractBaseMongoTemplete implements ApplicationContextAware {  
    protected MongoTemplate mongoTemplate;  
      
    /**  
     * 设置mongoTemplate  
     * @param mongoTemplate the mongoTemplate to set  
     */  
    public void setMongoTemplate(MongoTemplate mongoTemplate) {  
        this.mongoTemplate = mongoTemplate;  
    }  
      
    public void setApplicationContext(ApplicationContext applicationContext)  
            throws BeansException {  
        // TODO Auto-generated method stub  
        MongoTemplate mongoTemplate = applicationContext.getBean("mongoTemplate", MongoTemplate.class);  
        setMongoTemplate(mongoTemplate);  
    }  
  
}  

IUserDao仅仅是一个接口类

package dao;

import java.util.List;

import model.User;

public interface IUserDao {
	/**
	 * 新增
	 * 
------------------------------
* @param user */ void insert(User user); /** * 新增 *
------------------------------
* @param users */ void insertAll(List users); /** * 删除,主键id, 如果主键的值为null,删除会失败 *
------------------------------
* @param id */ void deleteById(String id); /** * 按条件删除 *
------------------------------
* @param criteriaUser */ void delete(User criteriaUser); /** * 删除全部 *
------------------------------
*/ void deleteAll(); /** * 修改 *
------------------------------
* @param user */ void updateById(User user); /** * 更新多条 *
------------------------------
* @param criteriaUser * @param user */ void update(User criteriaUser, User user); /** * 根据主键查询 *
------------------------------
* @param id * @return */ User findById(String id); /** * 查询全部 *
------------------------------
* @return */ List findAll(); /** * 按条件查询 *
------------------------------
* @param criteriaUser * @param skip * @param limit * @return */ List find(User criteriaUser, int skip, int limit); /** * 根据条件查询出来后 在去修改 *
------------------------------
* @param criteriaUser 查询条件 * @param updateUser 修改的值对象 * @return */ User findAndModify(User criteriaUser, User updateUser); /** * 查询出来后 删除 *
------------------------------
* @param criteriaUser * @return */ User findAndRemove(User criteriaUser); /** * count *
------------------------------
* @param criteriaUser * @return */ long count(User criteriaUser); }

其中User类如下:通过该类建表

package model;

import java.io.Serializable;

public class User implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 
	 */
	private String id;	
	private String name;	
	private int age;
	
	public User() {		
	}

	public User(String id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

这样dao层就已经完成了。到这,mongo已经接入了spring框架中。我们可以写一个controller来测试接口调用数据库。

三、测试springmvc调用mongo

思路:controller调用service,service调用dao层,dao层调用数据库。(为什么多使用service?习惯而已)

MongoService接口:

package service;

import java.util.List;

import model.User;

public interface MongoService {
	/**
	 * 新增
	 * 
------------------------------
* @param user */ void insert(User user); /** * 新增 *
------------------------------
* @param users */ void insertAll(List users); /** * 删除,主键id, 如果主键的值为null,删除会失败 *
------------------------------
* @param id */ void deleteById(String id); /** * 按条件删除 *
------------------------------
* @param criteriaUser */ void delete(User criteriaUser); /** * 删除全部 *
------------------------------
*/ void deleteAll(); /** * 修改 *
------------------------------
* @param user */ void updateById(User user); /** * 更新多条 *
------------------------------
* @param criteriaUser * @param user */ void update(User criteriaUser, User user); /** * 根据主键查询 *
------------------------------
* @param id * @return */ User findById(String id); /** * 查询全部 *
------------------------------
* @return */ List findAll(); /** * 按条件查询 *
------------------------------
* @param criteriaUser * @param skip * @param limit * @return */ List find(User criteriaUser, int skip, int limit); /** * 根据条件查询出来后 在去修改 *
------------------------------
* @param criteriaUser 查询条件 * @param updateUser 修改的值对象 * @return */ User findAndModify(User criteriaUser, User updateUser); /** * 查询出来后 删除 *
------------------------------
* @param criteriaUser * @return */ User findAndRemove(User criteriaUser); /** * count *
------------------------------
* @param criteriaUser * @return */ long count(User criteriaUser); }

MongoServiceImpl实现:

package service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import dao.IUserDao;
import dao.impl.UserDao;
import model.User;
@Service
public class MongoServiceImpl implements MongoService{
	@Resource
	private UserDao iUserDao;
	@Override
	public void insert(User user) {
		// TODO Auto-generated method stub
		iUserDao.insert(user);
	}

	@Override
	public void insertAll(List users) {
		// TODO Auto-generated method stub
		iUserDao.insertAll(users);
	}

	@Override
	public void deleteById(String id) {
		// TODO Auto-generated method stub
		iUserDao.deleteById(id);
	}

	@Override
	public void delete(User criteriaUser) {
		// TODO Auto-generated method stub
		iUserDao.delete(criteriaUser);
	}

	@Override
	public void deleteAll() {
		// TODO Auto-generated method stub
		iUserDao.deleteAll();
	}

	@Override
	public void updateById(User user) {
		// TODO Auto-generated method stub
		iUserDao.updateById(user);
	}

	@Override
	public void update(User criteriaUser, User user) {
		// TODO Auto-generated method stub
		iUserDao.update(criteriaUser,user);
	}

	@Override
	public User findById(String id) {
		// TODO Auto-generated method stub
		return iUserDao.findById(id);
	}

	@Override
	public List findAll() {
		// TODO Auto-generated method stub
		return iUserDao.findAll();
	}

	@Override
	public List find(User criteriaUser, int skip, int limit) {
		// TODO Auto-generated method stub
		return iUserDao.find(criteriaUser,skip,limit);
	}

	@Override
	public User findAndModify(User criteriaUser, User updateUser) {
		// TODO Auto-generated method stub
		return iUserDao.findAndModify(criteriaUser, updateUser);
	}

	@Override
	public User findAndRemove(User criteriaUser) {
		// TODO Auto-generated method stub
		return iUserDao.findAndRemove(criteriaUser);
	}

	@Override
	public long count(User criteriaUser) {
		// TODO Auto-generated method stub
		return iUserDao.count(criteriaUser);
	}

}

controller新增如下:

@Resource
	private MongoService mongoService;	
	// 查询
	@RequestMapping(value = "q.do")
	public String viewAll10() {
		User user = new User();
		user.setName("hehe");
		user.setAge(30);
		mongoService.insert(user);
		return "successlogin";
	}

测试结果:每次调用都会新增一行数据。查询结果如下:

db.user.find()
{ "_id" : ObjectId("5a800ebd462f7d2c3a786d76"), "_class" : "model.User", "name" : "bobo", "age" : 23 }
{ "_id" : ObjectId("5a800f9e462f7d2c3add42d6"), "_class" : "model.User", "name" : "hehe", "age" : 30 }
{ "_id" : ObjectId("5a810ee4462f7d37f894a8e0"), "_class" : "model.User", "name" : "hehe", "age" : 30 }
{ "_id" : ObjectId("5a810fa9462f7d382308f255"), "_class" : "model.User", "name" : "hehe", "age" : 30 }
{ "_id" : ObjectId("5a813677462f7d3ab7f60d79"), "_class" : "model.User", "name" : "hehe", "age" : 30 }
本文完,如有错误疏漏之处,希望看官留言指出。感谢!






你可能感兴趣的:(java,mongo,springmvc,spring,ssm,maven)