java|【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 AbstractBaseMongoTempleteimplements 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 = "https://www.it610.com/article/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|【Maven+SSM】超详细Spring+SpringMVC+Mongo集成】

    推荐阅读