springcloud(java)+spring-data-mongo 集成 mongodb 副本集集群
环境
springcloud版本Dalston.SR1
springboot版本1.5.2.RELEASE
mongodb3.4.14 3台3分片
- 在 pomx.ml 引入 spring-boot-starter-data-mongodb
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.在 yml 里配置
spring:
data:
mongodb:
uri: mongodb://admin:123456@192.168.31.1:20000,192.168.31.2:20000,192.168.31.3:20000/testdb?authSource=admin&connect=replicaSet&readPreference=secondaryPreferred&safe=true&authMechanism=SCRAM-SHA-1&maxPoolSize=500&minPoolSize=10
- uri 参数说明
- uri 格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- mongodb:// 这是固定的格式,必须要指定。
- username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
- host1 必须的指定至少一个 host, host1 是这个 URI 唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
- portX 可选的指定端口,如果不填,默认为 27017
- /database 如果指定 username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
- ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对 name=value,键值对之间通过&或;(分号)隔开
标准的连接格式包含了多个选项(options),如下所示:
选项 | 描述 |
---|---|
replicaSet=name | 验证 replica set 的名称。 Impliesconnect=replicaSet. |
safe=true|false | true:在执行更新操作之后,驱动都会发送 getLastError 命令来确保更新成功。(还要参考 wtimeoutMS).false: 在每次更新之后,驱动不会发送 getLastError 来确保更新成功。 |
w=n | 驱动添加 { w : n } 到 getLastError 命令. 应用于 safe=true。 |
wtimeoutMS=ms | 驱动添加 { wtimeout : ms } 到 getlasterror 命令. 应用于 safe=true. |
fsync=true|false | true: 驱动添加 { fsync : true } 到 getlasterror 命令.应用于 safe=true |
journal=true|false | 如果设置为 true, 同步到 journal (在提交到数据库前写入到实体中). 应用于 safe=true |
connectTimeoutMS=ms | 可以打开连接的时间。 |
socketTimeoutMS=ms | 发送和接受 sockets 的时间。 |
跟多参数参考:mongodb 官方文档
- 建立通用 model
MongoOpenDoorLog.java
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.io.Serializable;
@Document(collection="open_door_log")
@CompoundIndexes({
@CompoundIndex(name = "id_1_user_id_1_open_time_1", def = "{'user_id': 1, 'open_time': 1}"),
@CompoundIndex(name = "door_id_1_community_id_1_build_id_1_cell_id_1", def = "{'door_id': 1, 'community_id': 1,'build_id':1,'cell_id':1}")
})
public class MongoOpenDoorLog implements Serializable{
@Id
private String id;
private String tid;
@Field("log_time")
private long logTime;
@Field("door_id")
private String doorId;
@Field("user_id")
private String userId;
@Field("user_type")
private String userType;
@Field("device_type")
private String deviceType;
@Field("device_sys")
private String deviceSys;
@Field("open_time")
private long openTime;
@Field("lock_type")
private int lockType;
@Field("open_type")
private int openType;
@Field("open_info")
private String openInfo;
@Field("area_id")
private String areaId;
private String area;
@Field("community_id")
private String communityId;
@Field("community_name")
private String communityName;
@Field("build_id")
private String buildId;
@Field("build_name")
private String buildName;
@Field("build_num")
private String buildNum;
@Field("cell_id")
private String cellId;
@Field("cell_name")
private String cellName;
@Field("cell_num")
private String cellNum;
private int feedback;
@Field("feedback_time")
private long feedbackTime;
private String img;
private boolean deletec;
/**
* 创建时间
*/
@Field("create_time")
private long createTime;
/**
* 更新时间
*/
@Field("update_time")
private long updateTime;
public void setId(String id){
this.id = id;
}
public String getId(){
return this.id;
}
public void setLogTime(long logTime){
this.logTime = logTime;
}
public long getLogTime(){
return this.logTime;
}
public void setDoorId(String doorId){
this.doorId = doorId;
}
public String getDoorId(){
return this.doorId;
}
public void setDeviceType(String deviceType){
this.deviceType = deviceType;
}
public String getDeviceType(){
return this.deviceType;
}
public void setDeviceSys(String deviceSys){
this.deviceSys = deviceSys;
}
public String getDeviceSys(){
return this.deviceSys;
}
public void setOpenTime(long openTime){
this.openTime = openTime;
}
public long getOpenTime(){
return this.openTime;
}
public void setLockType(int lockType){
this.lockType = lockType;
}
public int getLockType(){
return this.lockType;
}
public void setOpenType(int openType){
this.openType = openType;
}
public int getOpenType(){
return this.openType;
}
public void setOpenInfo(String openInfo){
this.openInfo = openInfo;
}
public String getOpenInfo(){
return this.openInfo;
}
public void setAreaId(String areaId){
this.areaId = areaId;
}
public String getAreaId(){
return this.areaId;
}
public void setArea(String area){
this.area = area;
}
public String getArea(){
return this.area;
}
public void setCommunityId(String communityId){
this.communityId = communityId;
}
public String getCommunityId(){
return this.communityId;
}
public void setCommunityName(String communityName){
this.communityName = communityName;
}
public String getCommunityName(){
return this.communityName;
}
public void setBuildId(String buildId){
this.buildId = buildId;
}
public String getBuildId(){
return this.buildId;
}
public void setBuildName(String buildName){
this.buildName = buildName;
}
public String getBuildName(){
return this.buildName;
}
public void setBuildNum(String buildNum){
this.buildNum = buildNum;
}
public String getBuildNum(){
return this.buildNum;
}
public void setCellId(String cellId){
this.cellId = cellId;
}
public String getCellId(){
return this.cellId;
}
public void setCellName(String cellName){
this.cellName = cellName;
}
public String getCellName(){
return this.cellName;
}
public void setCellNum(String cellNum){
this.cellNum = cellNum;
}
public String getCellNum(){
return this.cellNum;
}
public void setFeedback(int feedback){
this.feedback = feedback;
}
public int getFeedback(){
return this.feedback;
}
public void setFeedbackTime(long feedbackTime){
this.feedbackTime = feedbackTime;
}
public long getFeedbackTime(){
return this.feedbackTime;
}
public void setImg(String img){
this.img = img;
}
public String getImg(){
return this.img;
}
public boolean isDeletec() {
return deletec;
}
public void setDeletec(boolean deletec) {
this.deletec = deletec;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getUpdateTime() {
return updateTime;
}
public void setUpdateTime(long updateTime) {
this.updateTime = updateTime;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
}
- 建立通用 dao
MongoBaseDao.java
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import java.util.List;
public interface MongoBaseDao<T> {
//保存一个对象到mongodb
public T save(T bean);
// 根据id删除对象
public void deleteById(T t);
// 根据对象的属性删除
public void deleteByCondition(T t);
// 通过条件查询更新数据
public void update(Query query, Update update);
// 根据id进行更新
public void updateById(String id, T t);
// 通过条件查询实体(集合)
public List<T> find(Query query);
public List<T> findByCondition(T t);
// 通过一定的条件查询一个实体
public T findOne(Query query);
// 通过ID获取记录
public T get(String id);
// 通过ID获取记录,并且指定了集合名(表的意思)
public T get(String id, String collectionName);
public MongoTemplate getMongoTemplate();
}
- 建立通用 daosuport
MongoDaoSupport.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.mongodb.core.MongoTemplate;
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 java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.List;
public abstract class MongoDaoSupport<T extends Serializable> implements MongoBaseDao<T> {
@Autowired
@Qualifier("mongoTemplate")
protected MongoTemplate mongoTemplate;
//保存一个对象到mongodb
public T save(T bean) {
mongoTemplate.save(bean);
return bean;
}
// 根据id删除对象
public void deleteById(T t) {
mongoTemplate.remove(t);
}
// 根据对象的属性删除
public void deleteByCondition(T t) {
Query query = buildBaseQuery(t);
mongoTemplate.remove(query, getEntityClass());
}
// 通过条件查询更新数据
public void update(Query query, Update update) {
mongoTemplate.updateMulti(query, update, this.getEntityClass());
}
// 根据id进行更新
public void updateById(String id, T t) {
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
Update update = buildBaseUpdate(t);
update(query, update);
}
// 通过条件查询实体(集合)
public List<T> find(Query query) {
return mongoTemplate.find(query, this.getEntityClass());
}
public List<T> findByCondition(T t) {
Query query = buildBaseQuery(t);
return mongoTemplate.find(query, getEntityClass());
}
// 通过一定的条件查询一个实体
public T findOne(Query query) {
return mongoTemplate.findOne(query, this.getEntityClass());
}
// 通过ID获取记录
public T get(String id) {
return mongoTemplate.findById(id, this.getEntityClass());
}
// 通过ID获取记录,并且指定了集合名(表的意思)
public T get(String id, String collectionName) {
return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
}
// 根据vo构建查询条件Query
private Query buildBaseQuery(T t) {
Query query = new Query();
Field[] fields = t.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object value = field.get(t);
if (value != null) {
org.springframework.data.mongodb.core.mapping.Field queryField = field.getAnnotation(org.springframework.data.mongodb.core.mapping.Field.class);
if (queryField != null) {
query.addCriteria(Criteria.where(queryField.value()).is(value));
}else{
query.addCriteria(Criteria.where(field.getName()).is(value));
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return query;
}
private Update buildBaseUpdate(T t) {
Update update = new Update();
Field[] fields = t.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object value = field.get(t);
if (value != null) {
update.set(field.getName(), value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return update;
}
// 获取需要操作的实体类class
@SuppressWarnings("unchecked")
protected Class<T> getEntityClass() {
return ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
}
public MongoTemplate getMongoTemplate() {
return mongoTemplate;
}
}
8.建立 service 接口
MongoOpenDoorLogService.java
public interface MongoOpenDoorLogService extends MongoBaseDao<MongoOpenDoorLog> {
}
- 建立 service 实现类
MongoOpenDoorLogServiceImpl.java
import org.springframework.stereotype.Service;
@Service("mongoOpenDoorLogServiceImpl")
public class MongoOpenDoorLogServiceImpl extends MongoDaoSupport<MongoOpenDoorLog> implements MongoOpenDoorLogService{
}
- 暴露接口
RequestObject.java
import com.zzwtec.common.validation.constraint.ZNotBlank;
import com.zzwtec.common.validation.constraint.ZNotNullWithStr;
import javax.validation.Valid;
public class RequestObject<T> {
@ZNotBlank
private String requestId;
@Valid @ZNotNullWithStr
private T data;
public RequestObject() {
this.requestId = RequestIdContext.get();
}
public RequestObject(T data) {
this();
this.data = data;
}
public RequestObject(String requestId, T data) {
this.requestId = requestId;
this.data = data;
}
public String getRequestId() {
return requestId;
}
public RequestObject<T> setRequestId(String requestId) {
this.requestId = requestId;
return this;
}
public T getData() {
return data;
}
public RequestObject<T> setData(T data) {
this.data = data;
return this;
}
public static <T> RequestObject<T> build(T data) {
return new RequestObject<T>(data);
}
public static <T> RequestObject<T> build(T data,String requestId) {
return new RequestObject<T>(requestId,data);
}
public static <T> RequestObject<T> build(String requestId,T data) {
return new RequestObject<T>(requestId,data);
}
@Override
public String toString() {
return "RequestObject [requestId=" + requestId + ", data=" + data + "]";
}
}
ResultObject.java
public class ResultObject<T> {
public static final String SUCCESS_CODE = "0";
public static final String SUCCESS_MSG = "success";
public static final String ERROR_CODE = "1";
public static final String ERROR_MSG = "error";
private String requestId;
/**
* 返回码
*/
private String code;
/**
* 返回描述
*/
private String msg;
/**
* 请求数据
*/
private T data;
public ResultObject() {
}
public ResultObject(String requestId) {
this.requestId = requestId;
}
@SuppressWarnings("rawtypes")
public ResultObject(RequestObject request) {
this(request.getRequestId());
}
@SuppressWarnings("rawtypes")
public ResultObject(RequestObject request, String code, String msg) {
this(request);
this.code = code;
this.msg = msg;
}
@SuppressWarnings("rawtypes")
public ResultObject(RequestObject request, String code, String msg, T data) {
this(request, code, msg);
this.data = data;
}
public String getRequestId() {
return requestId;
}
public ResultObject<T> setRequestId(String requestId) {
this.requestId = requestId;
return this;
}
public String getCode() {
return code;
}
public ResultObject<T> setCode(String code) {
this.code = code;
return this;
}
public String getMsg() {
return msg;
}
public ResultObject<T> setMsg(String msg) {
this.msg = msg;
return this;
}
public T getData() {
return data;
}
public ResultObject<T> setData(T data) {
this.data = data;
return this;
}
public boolean isSuccess() {
return SUCCESS_CODE.equals(code);
}
@Override
public String toString() {
return "ResultObject [requestId=" + requestId + ", code=" + code + ", msg=" + msg + ", data=" + data + "]";
}
}
OpenDoorLogService.java
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "a", fallback = OpenDoorLogServiceFallback.class)
@RequestMapping("odls")
@Api(value="OpenDoorLogService",
description="mongodb开门日志操作外部服务接口",
consumes = "application/json",
produces = "application/json",
protocols = "http")
public interface OpenDoorLogService {
/**
* 添加单条开门日志
* @param request
* @return
*/
@ApiOperation(value="add", notes="添加单条开门日志")
@ApiImplicitParam(name = "request", required = true, dataType = "RequestObject<MongoOpenDoorLog>", paramType = "body")
@RequestMapping(value = "add", method = RequestMethod.POST)
public ResultObject<Void> saveOpenDoorLog(@GroupsValid({Add.class}) @RequestBody RequestObject<MongoOpenDoorLog> request);
}
OpenDoorLogServiceController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OpenDoorLogServiceController implements OpenDoorLogService {
@Autowired
private MongoOpenDoorLogService mongoOpenDoorLogService;
@Override
public ResultObject<Void> saveOpenDoorLog(@GroupsValid({Add.class}) @RequestBody RequestObject<MongoOpenDoorLog> request){
MongoOpenDoorLog t = request.getData();
mongoOpenDoorLogService.save(t);
return ResultBuilder.success(request);
}
}
- 其它辅助类
GroupsValid.java
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface GroupsValid {
Class<?>[] value() default {};
}
Add.java
public interface Add {
}
Delete.java
public interface Delete {
}
Query.java
public interface Query {
}
Update.java
public interface Update {
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于