2018起,成为一个纯粹的Java后端。有时间我会将项目上经历的,拆分为一篇篇文章,用以巩固知识体系。
本文其实和Mybatis无关,沿用ssm这个系列的文章,当然也是基于这个系列的文章代码接入MongoDb数据库,本文准确的说是Spring+SpringMVC+Mongo集成。
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
安装命令
brew install mongodb
更新命令
brew upgrade mongodb
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.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(); //查询
说明:许多奇怪的问题都是因为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}
target/classes/conf/spring-mongodb.xml配置如下:
此处相当于将mongo需要装配的bean(mongo、mongoTemplate,及自定义的userDao对象)分离到另一个配置文件中,结构清晰。
此处mongo默认为本地localhost。mongoTemplate模版用来调用mongo的crud方法,针对本地的某个数据库,我当前为手动新建的数据库
user_mongodb_01
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来测试接口调用数据库。
思路: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 }
本文完,如有错误疏漏之处,希望看官留言指出。感谢!