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. 锁屏界面提示某些设置已隐藏_iOS 13隐藏手电筒和相机快捷图标
  2. MYSQL的随机抽取实现方法
  3. linux清理磁盘空间的脚本,在Ubuntu和Linux Mint上释放空间的7种简单方法
  4. Swift中的#pragma mark?
  5. python实现池化操作
  6. 不干胶设计用什么软件制作_用什么软件制作抖音短视频会比较好?
  7. 支持linux_Linux的UL库 支持MCC数据采集卡
  8. 推荐四款实用的局域网文件夹同步工具
  9. 嵌入式系统那些事—脚本语言tcl
  10. Ubuntu10.04使用HP LaserJetPro P1606dn
  11. 英语词根词缀记忆法(全集)_【干货又来啦】中考英语词汇速记,你也会说 so easy啦...
  12. 汽车CAN总线入门,通俗易懂
  13. oppo计算机找不到,oppo手机照片在电脑显示不出来怎么办啊
  14. ECMAScript 面试题目
  15. jzoj5234. 【NOIP2017模拟8.7A组】外星人的路径
  16. [python + pillow] 自制壁纸不完全教程
  17. 深信服python面试题_深信服软件测试面试经验
  18. iOS开发 适配iOS10
  19. RK3568平台开发系列讲解(驱动篇)驱动开发之GPIO使用
  20. 最全面的Python重点知识汇总,建议码住

热门文章

  1. IEEE Std 802.3™-2018中文版
  2. 【技术认证题库】SCCA理论HCI-2考试【初级】
  3. 【sentinel】Sentinel的介绍与使用
  4. deepin QQ/TIM显示不了图片的解决方法
  5. 衡水东方计算机学校地址,衡水东方计算机学校
  6. 合天实验室:渗透测试项目一
  7. 图书管理系统学习与总结
  8. python慢的原因
  9. mongodb 基础入门
  10. java素数的流程图_Java程序流程结构