一、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);
}
}
完成一个小模块了!!!