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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsdhttp://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 {@Idprivate 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;@DBRefprivate 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic String toString() {return "[Info]: color[" + color + "], style[" + style + "]";}
}

5.通过 MongoTemplate 的方式

  a.创建Dao

@Repository
public class TestDao {@Resourceprotected MongoTemplate mongoTemplate;private Class<Cmdty> clazz;@PostConstructprivate 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 {@Resourceprivate TestDao dao;@Transactionalpublic 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 {@Resourceprivate 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);}

转载于:https://www.cnblogs.com/vettel0329/p/10766805.html

MongoDB与Spring整合(支持事务)——SpringDataMongoDB相关推荐

  1. spring整合hibernate事务编程中错误分析

    2019独角兽企业重金招聘Python工程师标准>>> 在spring整合hibernate过程中,我们的配置文件: <?xml version="1.0" ...

  2. 避坑spring整合mybatis事务不生效问题

    作者最近在用spring整合mybatis的时候碰到一个问题就是开启声明式事务之后发现事务不生效,出现异常之后不回滚,在网上查阅很多资料后都没有成功解决.最后仔细检查代码之后发现SqlSessionF ...

  3. Spring整合JMS(四)——事务管理

    2019独角兽企业重金招聘Python工程师标准>>> Spring整合JMS(四)--事务管理 博客分类: Spring Jms SpringJMS事务sessionTransac ...

  4. Spring Boot2.x-10 基于Spring Boot 2.1.2 + Mybatis 2.0.0实现多数据源,支持事务

    文章目录 概述 思路 步骤 Step1 多数据源配置文件applicaiton.yml Step2 初始化多个数据源 Step3 配置多个数据源 验证测试 支持事务 Step1 配置类中通过@Bean ...

  5. java元婴期(21)----java进阶(spring(5)---事务管理AOP事务管理(全自动)spring整合Junit)

    事务管理 事务:一组业务操作ABCD,要么全部成功,要么全部不成功. 特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 隔离问题: 脏读:一个事务读到另一个事务没有提交的数据 不 ...

  6. Spring 整合 Mybatis - 二(切面、事务管理)

    紧接着上篇<Spring 整合 Mybatis - 一(基础)>,介绍Spring 整合 Mybatis的切面.事务管理. 1 增加切面aop功能 1.1 spring.xml sprin ...

  7. Spring JDBC-Spring对事务管理的支持

    概述 事务管理关键抽象 Spring事务管理的实现类 Spring JDBC 和MybBatis的事务管理器的配置 JPA的事务管理器的配置 Hibernate的事务管理器的配置 JTA 的事务管理器 ...

  8. Spring(四)——AOP、Spring实现AOP、Spring整合Mybatis、Spring中的事务管理

    文章目录 1. 什么是AOP 2. 使用Spring实现AOP 2.1 使用Spring的API 接口实现 2.2 自定义实现 2.3 使用注解实现 3. 整合MyBatis 3.1 MyBatis- ...

  9. Spring整合Hibernate 二 - 声明式的事务管理

    Spring大战Hibernate之声明式的事务管理 Spring配置文件: 添加事务管理类的bean: <bean id="txManager" class="o ...

最新文章

  1. 能说明你的Javascript技术很烂的五个原因
  2. 高通 MSM8K bootloader : SBL1 .
  3. iis php5.6.8配置,Windows 8.1 + IIS 8.5 + PHP 5.6.3配置
  4. jna 使用_使用JNA的透明JFrame
  5. 【转】oracle数据库中varchar2陷阱
  6. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx
  7. iview上传文件案例
  8. 生存分析——快手的基于深度学习框架的集成⽣存分析软件KwaiSurvival(一)
  9. spring boot 与配置
  10. 软件开发工具大题考点整理
  11. Python list列表查找元素
  12. 网页中插入Flash动画(.swf)代码和常用参数设置
  13. Vim插件之python-mode
  14. 浙大版《C语言程序设计(第3版)》题目集习题4-11 兔子繁衍问题 (15 分)
  15. 首届华为开发者大赛沙龙牵手大连-与开发者共话赛事
  16. SEER区块链database_api更新 支持通过txid查询交易所在区块信息
  17. 局域网内帆软BI使用arcgis发布的wms服务
  18. 最硬核的独立蒙特卡洛抽样法
  19. html消除图之间间距,html表格间距怎么取消 html 表格行之间的间距怎么设置
  20. Pycharm 配置 Autopep8

热门文章

  1. 使用telnet远程华为路由器及CRT使用连接
  2. 20181218股市早盘
  3. 企业信息化、数字化和智能化的区别
  4. 前端leaflet框选下载bing遥感图
  5. 什么是邮箱地址?邮箱地址在哪里找?
  6. Jeff Dean长文展望:机器学习领域的五大潜力趋势
  7. WEEK(8)作业——差分约束、拓扑排序(Kahn算法)、SCC(强连通分量)、DFS序、Kosaraju算法
  8. android快牙原理,实测快牙的真实传输速度
  9. vuex-module-decorators装饰器的使用
  10. 经济学人信息部:2012年大数据研究报告:商业领袖们的经验