最近完成了在spring boot下完成了对mongoDB数据库的相关操作,对于一些常用的操作做出如下的总结。
1.首先我们完成MongoDB数据库的下载和启动。
2.接下来我们在项目中完成对MongoDB的相关配置。
在Spring context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="UserInfoRepository"
class="com.lyf.user.UserInfoRepositoryImpl">
<property name="mongoTemplate" ref="mongoTemplate" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongo" ref="mongo" />
<constructor-arg name="databaseName" value="user" />
</bean>
<!-- Factory bean that creates the Mongo instance -->
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="localhost" />
<property name="port" value="27017" />
</bean>
<!-- Activate annotation configured components -->
<context:annotation-config />
<!-- Scan components for annotations within the configured package -->
<context:component-scan base-package="com.lyf.user">
<context:exclude-filter type="annotation"
expression="org.springframework.context.annotation.Configuration" />
</context:component-scan>
</beans>
3.接下来我们需要设置我们的实体类
代码如下:
package com.lyf.user;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Getter
@Setter
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String uid;
private String name;
private int age;
private String address;
private String[] hobby;
private JSONObject description;
public User() {
}
public User(String uid, String name, int age,String address,String hobby[],JSONObject description) {
this.uid = uid;
this.name = name;
this.age = age;
this.address= address;
this.hobby = hobby;
this.description = description;
}
@Override
public String toString() {
return "User{" +
"uid='" + uid + '\'' +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", hobby=" + Arrays.toString(hobby) +
", description='" + description + '\'' +
'}';
}
}
4.配置好实体类后,接下来我们编写一个简单的接口,定义我们要实现的功能
代码如下:
package com.lyf.user;
import com.mongodb.WriteResult;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Created by flyfy on 2017/7/13.
*/
//@Repository
public interface UserInfoRepository<T>{
public void saveObject(T object);
public void deleteObject(String id);
public List<T> queryByName(String name,Class<T> tClass);
public List<T> queryByAddress(String address,Class<T> tClass);
public String queryByDescriptionRealname(String descriptionParam,Class<T> tClass);
public List<T> queryAll(Class<T> tClass);
}
5.然后设计一个接口实现类
代码如下:
package com.lyf.user;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonParser;
import com.mongodb.WriteResult;
import lombok.extern.java.Log;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.repository.Query;
import java.util.*;
/**
* Created by flyfy on 2017/7/14.
*/
public class UserInfoRepositoryImpl implements UserInfoRepository<User>{
MongoTemplate mongoTemplate;
public void setMongoTemplate(MongoTemplate mongoTemplate){
this.mongoTemplate = mongoTemplate;
}
public void saveObject(User user) {
mongoTemplate.insert(user);
}
public void deleteObject(String id) {
mongoTemplate.remove(new org.springframework.data.mongodb.core.query.Query(Criteria.where("uid").is(id)));
}
public List<User> queryByName(String name,Class<User> userClass){
List<User> list = mongoTemplate.find(new org.springframework.data.mongodb.core.query.Query(Criteria.where("name").is(name)),userClass);
return list;
}
public List<User> queryByAddress(String address,Class<User> userClass){
List<User> queryUser = mongoTemplate.find(new org.springframework.data.mongodb.core.query.Query(Criteria.where("address").is(address)),userClass);
return queryUser;
}
public List<User> queryAll(Class<User> userClass){
List<User> queryUsers = mongoTemplate.findAll(userClass);
return queryUsers;
}
public String queryByDescriptionRealname(String descriptionParam,Class<User> userClass){
List<User> queryUsers = queryAll(userClass);
System.out.println(queryUsers.size());
List<User> queryUser = new ArrayList<User>();
if(queryUsers.size()>0) {
for (User list : queryUsers) {
JSONObject jsonObject = list.getDescription();
if(null!=jsonObject) {
if (jsonObject.containsValue(descriptionParam)) {
queryUser.add(list);
} else {
System.out.println("该条记录里不包含descriptpParam");
}
}else{
continue;
}
}
}
if(queryUser.size()== 0){
return "not exist";
}else{
System.out.println("取到的内容:"+queryUser.toString());
return queryUser.toString();
}
}
}
6.接下来我们将方法的调用写入controller类(这里我们其实应该将具体的方法实现放到service里)
代码如下:
package com.lyf.user;
/**
* Created by flyfy on 2017/7/12.
*/
import com.alibaba.fastjson.JSONObject;
import com.lyf.MongoQuery.mongoQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.lyf.user.UserInfoRepository;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@RestController
@RequestMapping(value = {"/users"}, produces = "application/json;charset=UTF-8")
public class UserController {
/**
* 向MongoDB中插入数据
*
*/
@RequestMapping(value = {"/save"}, method = POST)
@ResponseBody
public String save() {
String hobby[] ={"youyong","huachuan"};
JSONObject description = new JSONObject();
String realname ="flyfy";
String realhobby[] ={"cuiyanwen","chat"};
description.put("realname",realname);
description.put("realhobby",realhobby);
User user = new User("flyfy_02","liyifei",23,"beijing",hobby,description);
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:Spring context.xml");
UserInfoRepository userInfoRepository = context.getBean(UserInfoRepositoryImpl.class);
userInfoRepository.saveObject(user);
JSONObject ret = new JSONObject();
ret.put("code", 200);
ret.put("codeStatus", "ok");
ret.put("detailedMsg", "success");
return ret.toJSONString();
}
/*
*
* 根据name属性进行查询
* */
@RequestMapping(value = {"/queryByName"}, method = GET)
@ResponseBody
public String queryByName(@Param("name") String name) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:Spring context.xml");
UserInfoRepository userInfoRepository = context.getBean(UserInfoRepositoryImpl.class);
userInfoRepository.queryByName(name,User.class);
JSONObject ret = new JSONObject();
ret.put("code", 200);
ret.put("codeStatus", "ok");
ret.put("detailedMsg", "success");
return ret.toJSONString();
}
/*
*
* 根据address属性查询
*
*/
@RequestMapping(value = {"/queryByAddress"}, method = GET)
@ResponseBody
public String queryByAddress(@Param("address") String address) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:Spring context.xml");
UserInfoRepository userInfoRepository = context.getBean(UserInfoRepositoryImpl.class);
userInfoRepository.queryByAddress(address,User.class);
JSONObject ret = new JSONObject();
ret.put("code", 200);
ret.put("codeStatus", "ok");
ret.put("detailedMsg", "success");
return ret.toJSONString();
}
/*
*
* 根据description字段下的二级字段realname进行查询
* */
@RequestMapping(value = {"/queryByDescriptionRealname"}, method = GET)
@ResponseBody
public String queryByDescription(@Param("descriptionParamRealname") String descriptionParam) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:Spring context.xml");
UserInfoRepository userInfoRepository = context.getBean(UserInfoRepositoryImpl.class);
userInfoRepository.queryByDescriptionRealname(descriptionParam,User.class);
JSONObject ret = new JSONObject();
ret.put("code", 200);
ret.put("codeStatus", "ok");
ret.put("detailedMsg", "success");
return ret.toJSONString();
}
/*
*
* 根据uid完成数据的删除
* */
@RequestMapping(value = {"/delete"}, method = POST)
@ResponseBody
public String delete(String id) {
if(null!=id){
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:Spring context.xml");
UserInfoRepository userInfoRepository = context.getBean(UserInfoRepositoryImpl.class);
userInfoRepository.deleteObject(id);
}
JSONObject ret = new JSONObject();
ret.put("code", 200);
ret.put("codeStatus", "ok");
ret.put("detailedMsg", "success");
return ret.toJSONString();
}
}
7.当然你也可以参照官网的文档,利用官方的MongoRepository接口,内部自带了很多常用的方法,但是对于提取二级字段属性值的话,就需要我们自己编写实现方法。
下面附上官网文档地址:http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/