MongoDB与Spring整合(支持事务)——SpringDataMongoDB
1.将MongoDB设置为复制集模式
a.修改 mongod.cfg 文件,添加replSetName复制集名称
#replication:
replication:
replSetName: "rs0"
b.在MongDB命令行输入初始化添加 localhost:27017 节点
rs.initiate( {_id : "rs0",members: [ { _id: 0, host: "localhost:27017" } ]})
2.添加maven依赖
<!-- mongo -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
注:a.支持事务MongoDB要4.0版本以上,使用复制集,单节点不支持。
b.Spring要 5.1.1.RELEASE 以上
c.SpringDataMongoDB要 2.1.1.RELEASE 以上
d.使用事务之前(@Transaction),数据库、文档、索引必须提前创建
3.书写 spring-mongo.xml 及对应 mongo.properties
<?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"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:property-placeholder location="classpath:mongo.properties"/> <!-- <mongo:mongo-client id="mongo-client" host="${mongo.host}" port="${mongo.port}"> -->
<mongo:mongo-client id="mongo-client" replica-set="${mongo.replSet}">
<mongo:client-options connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}" />
</mongo:mongo-client> <mongo:repositories base-package="com.wode.dao"/> <mongo:db-factory dbname="${mongo.db}" mongo-ref="mongo-client"/> <bean id="mongoTemplate"
class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean> <bean id="mongoTransactionManager" class="org.springframework.data.mongodb.MongoTransactionManager">
<constructor-arg name="dbFactory" ref="mongoDbFactory"/>
</bean> <tx:annotation-driven transaction-manager="mongoTransactionManager" proxy-target-class="true"/> </beans>
mongo.host=localhost
mongo.port=27017
mongo.replSet=localhost:27017
mongo.db=testmongo #################连接池配置################# #最大连接数
mongo.connectionsPerHost=8
#可被阻塞的线程数因子,默认值为5,如果connectionsPerHost配置为10,那么最多能阻塞50个线程,超过50个之后就会收到一个异常
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#连接超时时间,默认值是0,就是不超时
mongo.connectTimeout=1000
#阻塞线程获取连接的最长等待时间,默认120000 ms
mongo.maxWaitTime=1500
#keep alive标志,默认false
mongo.socketKeepAlive=true
#socket超时时间,默认值是0,就是不超时
mongo.socketTimeout=1500
4.创建实体类
public class BaseBean {
@Id
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@Document
public class Cmdty extends BaseBean { private String cmdtyCode;
private String cmdtyName;
private List<Attr> attributes;
@DBRef
private Info info; public String getCmdtyCode() {
return cmdtyCode;
} public void setCmdtyCode(String cmdtyCode) {
this.cmdtyCode = cmdtyCode;
} public String getCmdtyName() {
return cmdtyName;
} public void setCmdtyName(String cmdtyName) {
this.cmdtyName = cmdtyName;
} public List<Attr> getAttributes() {
return attributes;
} public void setAttributes(List<Attr> attributes) {
this.attributes = attributes;
} public Info getInfo() {
return info;
} public void setInfo(Info info) {
this.info = info;
} @Override
public String toString() {
return "[Cmdty]: cmdtyCode[" + cmdtyCode + "], cmdtyName[" + cmdtyName + "], attributes[" + attributes + "], info[" + info + "]";
}
}
public class Attr extends BaseBean {
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "[Attr]: key[" + key + "], value[" + value + "]";
}
}
@Document
public class Info extends BaseBean { private String color; private String style; public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public String getStyle() {
return style;
} public void setStyle(String style) {
this.style = style;
} @Override
public String toString() {
return "[Info]: color[" + color + "], style[" + style + "]";
}
}
5.通过 MongoTemplate 的方式
a.创建Dao
@Repository
public class TestDao { @Resource
protected MongoTemplate mongoTemplate;
private Class<Cmdty> clazz; @PostConstruct
private void construct(){
clazz = Cmdty.class;
} //添加
public Cmdty insert(Cmdty t) {
return mongoTemplate.insert(t);
} //保存
public Cmdty save(Cmdty t) {
return mongoTemplate.save(t);
} //保存商品信息
public Info saveInfo(Info t) {
return mongoTemplate.save(t);
} //修改
public int update(Map<String, Object> filter, Map<String, Object> updater) {
UpdateResult result = mongoTemplate.updateMulti(this.getQuery(filter), this.getUpdater(updater), this.clazz);
return (int) result.getModifiedCount();
} //删除
public long delete(Map<String, Object> filter) {
DeleteResult result = mongoTemplate.remove(this.getQuery(filter), this.clazz);
return result.getDeletedCount();
} //存在
public boolean exist(Map<String, Object> filter) {
return mongoTemplate.exists(this.getQuery(filter), this.clazz);
} //个数
public long count(Map<String, Object> filter) {
return mongoTemplate.count(this.getQuery(filter), this.clazz);
} //查询一个
public Cmdty getObject(Map<String, Object> filter) {
return mongoTemplate.findOne(this.getQuery(filter), this.clazz);
} //查询多个
public List<Cmdty> getList(Map<String, Object> filter) {
return mongoTemplate.find(this.getQuery(filter), this.clazz);
} protected Query getQuery(Map<String, Object> filter){
Query query = new Query();
for(Map.Entry<String, Object> entry : filter.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
switch (key){
case "id":
query = query.addCriteria(Criteria.where("_id").is(value));
break;
case "cmdtyName":
query = query.addCriteria(Criteria.where("cmdtyName").is(value));
break;
case "cmdtyNameLike":
Pattern pattern = Pattern.compile("^.*"+value+".*$", Pattern.CASE_INSENSITIVE);
query = query.addCriteria(Criteria.where("cmdtyName").regex(pattern));
break;
case "cmdtyCode":
query = query.addCriteria(Criteria.where("cmdtyCode").is(value));
break;
default:
break;
}
}
return query;
} protected Update getUpdater(Map<String, Object> updater) {
Update update = new Update();
for(Map.Entry<String, Object> entry : updater.entrySet()){
update.set(entry.getKey(), entry.getValue());
}
return update;
} }
b.创建Service
@Service
public class TestService { @Resource
private TestDao dao; @Transactional
public boolean saveCmdty(Cmdty cmdty, Info info){
dao.saveInfo(info);
// int a = 1/0; //回滚测试代码
dao.save(cmdty);
return true;
} }
c.测试代码
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
TestService service = (TestService) applicationContext.getBean("testService");
//商品信息
Info info = new Info();
info.setColor("silver");
info.setStyle("111");
//商品
Cmdty cmdty = new Cmdty();
cmdty.setCmdtyCode("Ag111");
cmdty.setCmdtyName("银111");
//商品属性
List<Attr> attributes = new ArrayList<>();
Attr attribute = new Attr();
attribute.setKey("品质");
attribute.setValue("特优");
attributes.add(attribute);
cmdty.setInfo(info);
cmdty.setAttributes(attributes);
service.saveCmdty(cmdty, info);
}
d.其他
①.排序:
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
query.with(new Sort(direction, sort));
②.分页:
int skip = (pageIndex - 1) * pageSize;
query.skip(skip).limit(pageSize);
或者
Pageable pageable = new PageRequest(pageIndex, pageSize);
query.with(pageable);
③.返回指定字段:
Document document = new Document();
for(String field : fields){
document.put(field, isReturn);
}
Query query = new BasicQuery(new Document(), document);
6.使用 MongoRepository 的方式
a.书写Dao接口,继承 MongoRepository
@Repository
public interface TestRepositoryDao extends MongoRepository<Cmdty, String> { @Query(value="{'info.$id': ?0 }")
public Cmdty findByInfoId(ObjectId id); public Cmdty findByCmdtyCode(String cmdtyCode); }
注:这种方式也支持 JPA 命名规则
b.书写Service
@Service
public class TestRepositoryService { @Resource
private TestRepositoryDao dao; public Cmdty findByInfoId(String infoId){
return dao.findByInfoId(new ObjectId(infoId));
} public Cmdty findByCmdtyCode(String cmdtyCode){
return dao.findByCmdtyCode(cmdtyCode);
}
}
e.测试
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
TestRepositoryService service = (TestRepositoryService) applicationContext.getBean("testRepositoryService");
// Cmdty cmdty = service.findByInfoId("5cc15f32a0e5eaeb0413dfde");
Cmdty cmdty = service.findByCmdtyCode("Ag111");
System.out.println(cmdty);
}
MongoDB与Spring整合(支持事务)——SpringDataMongoDB的更多相关文章
- MongoDB 学习(三)MongoDB 和 Spring 整合(Maven)
一.MongoDB 和 Spring 整合(Maven) 1.相关 jar 包准备 2.用 Maven 创建项目,pom.xml 文件 <project xmlns="http://m ...
- Spring整合JMS——事务管理
Spring提供了一个JmsTransactionManager用于对JMS ConnectionFactory做事务管理.这将允许JMS应用利用Spring的事务管理特性.JmsTransactio ...
- 像我这样优雅地进行Spring整合MongoDB
本文重点是要将mongodb与spring整合到项目中去,在实践中发现问题,追踪问题,然后解决问题. 一.准备 Maven.Spring(spring-data-mongodb) spring Dat ...
- 使用Spring管理数据库事务
在整个JavaWeb项目开发中,事务是用来开发可靠性网络应用程序的最关键部分.当应用程序与后端资源进行交互时,就会用到事务,这里的后端资源包括数据库.MQ.ERP等.而数据库事务是最常见的类型,而我们 ...
- MongoDB与SpringBoot整合(支持事务)
1.创建SpringBoot工程,选择 Web.MonogDB 依赖,pom如下: <parent> <groupId>org.springframework.boot< ...
- spring整合mongodb
使用spring整合mongodb maven 依赖 <dependency> <groupId>org.mongodb</groupId> <artifac ...
- Spring整合MongoDB(转)
1.认识Spring Data MongoDB 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data ...
- Spring整合JMS(四)——事务管理
原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...
- MongoDB系列:四、spring整合mongodb,带用户验证
在前面的两篇博客 MongoDB常用操作练习.springboot整合mongoDB的简单demo中,我们基本上熟悉了mongodb,也把它与spring boot进行了整合并且简单使用.在本篇博客中 ...
随机推荐
- Jenkins_安装
1.下载war包 wget -c -O ./jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war 2.启动下载好的wa ...
- 我的长大app开发教程第一弹:Fragment布局
在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...
- PHP代码审计之XSS操作
XSS XSS是Cross Site Scripting(跨站脚本攻击), 它与sql注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除的目的,而在XSS攻击中,通过插入 ...
- 利用crontab定时提交svn遇到的几个问题
交待下背景...公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的..因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk.一开始手 ...
- hdu5965扫雷 枚举+递推
题目链接 思路:枚举第一列的可能种数,然后递推即可,中途判断是否满足条件,最后再判断最后一列是否满足条件即可. #include<bits/stdc++.h> #define LL lon ...
- Python 面试总结
公司面试: 1,说说项目都用到了什么技术? 2,mysql索引的种类? 3,索引建多有什么不好? 4,mysql的引擎有什么? 5,redis是单线程还是多线程的? 6, redis的持久化机制? 7 ...
- java Socket实例
可以实现客户端与服务端双向通信,支持多客户端连接,客户端断开连接,服务端不会出现异常 服务端代码: package com.thinkgem.jeesite.modules.socketTest.de ...
- Object类中方法详解
目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...
- 盒子取球C语言 蓝桥杯
盒子取球方法二今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定:每个人从盒子中取出 ...
- CVE-2018-19386:SolarWinds数据库性能分析器中反射的XSS
漏洞 在SolarWinds的11.1.457版中,"idcStateError.iwc"错误页面中存在Reflected Cross-Site Scripting漏洞,已经在版本 ...