前言: 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集成】
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])