在SSM中整合MongoDB

一、SSM整合MongoDB

在搭建好了SSM框架之后想着再把学过的MongoDB也搞进来用用。

1、导入依赖

  <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>2.0.9.RELEASE</version>
    </dependency>

整个项目中导入这一个依赖就够了。由于我之前练手在项目中导入了:

      <dependency>
          <groupId>org.mongodb</groupId>
          <artifactId>mongodb-driver</artifactId>
          <version>3.6.3</version>
      </dependency>

这个驱动,结果最后运行程序的时候直接报错:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.bson.types.ObjectId.(III)V from class org.mongojack.internal.stream.ObjectIdConvertor.

 解决方案就是删除这个依赖:参考——https://blog.csdn.net/torrytang/article/details/50606588

2、配置相关数据库连接文件

#DB name
mongo.dbname = test
#username
mongo.username =
#password
mongo.password =
#host
mongo.host = 127.0.0.1
#port
mongo.port = 27017
#xiancheng zui da zu se shu
mongo.connectionsPerHost= 8
#xiancheng dui lie shu
mongo.threadsAllowedToBlockForConnectionMultiplier= 4
#connectTimeout ms
mongo.connectTimeout= 1500
#maxWaitTime
mongo.maxWaitTime= 1500
#autoConnect
mongo.autoConnectRetry= true
#socketKeepAlive
mongo.socketKeepAlive= true
#socketTimeout
mongo.socketTimeout=1500
#du xie fen li
mongo.slaveOk=true

3、配置MongoDB的配置文件

   <!--引入MongoDB连接文件-->
    <context:property-placeholder location="classpath*:mongodb.properties" ignore-unresolvable="true"/>
    <!--连接MongoDB服务器-->
    <mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}" >
        <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:db-factory id="mongoDbFactory"  dbname="${mongo.dbname}"  mongo-ref="mongo"/>


    <!--配置mongoTemplate-->
    <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成-->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    </bean>

这里也是踩了坑,因为之前项目中本来就用了mysql,然后有一个 db.properties 文件已经导入到项目中,因此我一开始也是向导入 db.properties 一样使用,结果报错:

"Could not resolve placeholder"

原因是Spring在管理配置文件的时候冲突了,因此需要在导入的配置项目中加上:ignore-unresolvable="true"

<context:property-placeholder location="mongodb.properties" ignore-unresolvable="true"  
/>  
<context:property-placeholder location="db.properties" ignore-unresolvable="true"  
/>  

这样就能解决冲突问题了

4、将mongodb.xml文件引入spring.xml文件中好一起加载

 <!--SSM集成mongodb-->
    <import resource="classpath*:mongodb.xml"/>

5、最后就是写相关的类进行开发了

service:

@Service
public class StuMongodb {
    private static Logger log = Logger.getLogger(StuMongodb.class);

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 查询所有
     * @return
     */
    public List<Stu> findAll(){
        List<Stu> stuList = mongoTemplate.findAll(Stu.class);
        return stuList;
    }

    /**
     * 更新
     * @param stu
     */
    public void update(Stu stu){
         Query query = new Query(Criteria.where("name").is(stu.getName()));
         Update update = new Update();
         //Update update = Update.update("age",stu.getAge());
         update.set("age",stu.getAge());
         update.set("gender",stu.getGender());

         //更新字段,不插入实体类
         mongoTemplate.updateFirst(query,update,Stu.class);
         //更新字段同时插入实体类
        // mongoTemplate.updateMulti(query,update,Stu.class);
    }

    /**
     * 插入
     */
    public void insert(Stu stu){
        List<Stu> list = new ArrayList<>();
        list.add(stu);
        log.info("插入");
        try {
            mongoTemplate.insert(list,Stu.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除
     */
    public void delete(Object str){
        Query query = new Query(new Criteria("_id").is(str));
        //Object object = mongoTemplate.find(query,Stu.class);
        try {
            mongoTemplate.findAllAndRemove(query,Stu.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 在做更新的时候由于不是很了解方法采坑了,还有就是最后的删除,因为最开始一直用的是remove方法,一直显示

No id property found for object of type

搞了好久一直不过,以为是实体类要把id改为_id,因为MongoDB的文档中的id字段是“_id”,但是还是不行,最后按照换了方法就ok了。

还有一点就是在执行删除的时候,我是按照id来删除的嘛,所以在postman请求的时候传进来的值

    "_id" : ObjectId("5b4d6d1a4f59197946cfdc30")

是这个整个后面部分也是一直不成功,最后经人指点应该直接传入ObjectId中的内容。

controller:

@Controller
@RequestMapping(value = "/hrms/emp")
public class StuMongodbController {
    @Autowired
    private StuMongodb stuMongodb;

    @RequestMapping(value = "/getEmpList",method = RequestMethod.GET)
    public ModelAndView findAll(){
        ModelAndView mv = new ModelAndView();
        List<Stu> stus = stuMongodb.findAll( );
        mv.addObject("stus",stus);
        mv.setViewName("test");
        return mv;
    }

    @RequestMapping(value = "/update",method = RequestMethod.POST)
    public void update(Stu stu){
        stuMongodb.update(stu);
    }

    @RequestMapping(value = "/insert",method = RequestMethod.POST)
    public void insert(Stu stu){
        stuMongodb.insert(stu);
    }

    @RequestMapping(value = "/delete",method = RequestMethod.POST)
    public void insert(String  str){
        stuMongodb.delete(str);
    }

}

完成一个小模块了!!!

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值