SpringMvc整合MongoDB 初识(一)

MongoDb初识(1)

基本概念解析

MongoDb属于非关系型数据库之一,mongodb中 基本概念是 文档、集合、数据库,下表是从菜鸟教程里面复制的关于MongoDb的一些常见理念,可能写的不好,以后再对mongo认知更多的基础上,再次修改和提升文档编辑。
SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDb不支持
primary keyprimary key主键,MondoDb 自动将_id字段设置为主键

SpringMVC整合

常规的spring-mvc配置在此不多做赘述,这里面主要说下spring-mongo.xml中的配置和pom文件配置中的问题。SpringMVC中配置使用mongo的pom依赖是比较坑的一个点,springmvc中使用mongo一般情况下依赖于两个jar ,分别是mongo-java-driver和spring-data-mongodb,spring-data-mongodb主要用户注入mongoTemplate,能够比较方便的使用java对mongodb实现CRUD
  • 先说pom文件中的依赖吧

    首先是mongodb本身的版本是无关紧要的,直接用最新版本的都可以,但是在实际使用中,mongodb的java驱动包和spring整合的jar包版本是有版本要求的。
    Mongodb的java驱动包分为1.x ,2.x,3.x ,目前主流使用的还是2.x和3.x的版本,如果项目本身spring版本是4.x版本的,那么spring-data-mongo的jar包版本只能是1.x,我之前就是因为本身spring是4.x的,但是使用了spring-data-mongo 2.x的版本,所以运行时一直报错
    java.lang.NoSuchMethodError: org.springframework.util.Assert.isTrue ,下面直接贴上我的pom文件依赖

<!--MongoBD-Spring整合-->
<dependency> <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId> 
    <version>2.14.3</version>
 </dependency>
 <dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-mongodb</artifactId> 
    <version>1.10.7.RELEASE</version>
</dependency>


然后是我自己spring-mongo.xml的配置,spring-mongo.xml中配置需要注意的就是你连接的mongodb版本是否设置了用户名密码,如果设置用户名密码,连接的配置是一样的,首先贴下具体配置文件,使用密码和不使用密码仅仅在于其中一段是否使用用户名密码注释,各自根据实际情况进行修改

<?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:mongo="http://www.springframework.org/schema/data/mongo"          xsi:schemaLocation="          http://www.springframework.org/schema/data/mongo          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd          http://www.springframework.org/schema/beans          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">      

<mongo:mongo replica-set="${mongo.hostport}">              
<mongo:options connections-per-host="${mongo.connectionsPerHost}"                                     
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"                                     connect-timeout="${mongo.connectTimeout}"            
max-wait-time="${mongo.maxWaitTime}"                                    
auto-connect-retry="true"                                     
socket-keep-alive="true"                                    
socket-timeout="${mongo.socketTimeout}"                                     
slave-ok="true"                                     
write-number="1"                                     
write-timeout="0"                                     
write-fsync="true"              />       
</mongo:mongo>       
<!--   使用用户名密码 -->
<!--   <mongo:db-factory username="${mongo.username}" password="${mongo.password}" 
dbname="${mongo.databaseName}" mongo-ref="mongo"/>-->       
<!-- 不使用用户名密码 -->       
<mongo:db-factory  dbname="${mongo.databaseName}" mongo-ref="mongo"/>       
<bean id="MongoTemplate" 
class="org.springframework.data.mongodb.core.MongoTemplate">              
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>       
</bean>
</beans>


除了配置spring-mongo.xml 还需要在spring-mvc.xml中引入spring-mongo.xml配置

<!--   mongodb 配置-->
<import resource="spring-mongo.xml"/>

下面贴上我的mongo.properties配置

mongo.hostport=10.10.2.4:27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
#连接超时时间
mongo.connectTimeout=1000
#等待时间mongo.maxWaitTime=1500
#Socket超时时间
mongo.socketTimeout=1500
#admin登录信息
mongo.username=admin
mongo.password=123456
#DataBaseName
#认证数据库名
mongo.authenticationDbname=mongodb_demo
#要链接的数据库名
mongo.databaseName=mongodb_demo

正常来说,按照这个配置好了,并且如果mongo没有设置什么ip白名单等限制的话,项目应该是能直接启动并且通过注入的方式使用MongoTemplate的

基础查询

  • 单个保存
    单个保存,在定义好mongodb需要保存的类后,可以直接调用mongoTemplate.save(Object obj)方法进行保存,具体如下:
@Autowired
private  MongoTemplate mongoTemplate;
/** * @description: 保存单个 
* @author qjx 
* @createdate: 2020-05-22 14:34 
*/
@RequestMapping("/saveSingleDemo")
@ResponseBody
public OutputBean saveSingleDemo(HttpServletRequest request){    
    OutputBean outputBean = new OutputBean();              
    outputBean.setCode(CodeConstants.Basic.ZERO_CODE);  
    outputBean.setMsg(CodeConstants.Basic.SUCCESS);    
    try{        
    MongoDemoDTO mongoDemoDTO = new MongoDemoDTO();        
    mongoDemoDTO.setId(IdUtil.getSnowflake(0,1).nextIdStr());    
    mongoDemoDTO.setUserName(RandomUtil.randomString(10));     
    mongoDemoDTO.setAge(i);        
    mongoDemoDTO.setCity("上海");        
    mongoDemoDTO.setCreateDate(new Date());        
    List<String> orderIdList = 
        Arrays.asList(IdUtil.objectId(),IdUtil.simpleUUID());
    mongoDemoDTO.setOrderIdList(orderIdList);        
mongoDemoDTO.setSalary(RandomUtil.randomDouble()); 
mongoTemplate.save(mongoDemoDTO);    
}catch (Exception e){        
e.printStackTrace();  
}    
return outputBean;
}

  • 保存list
    保存一个集合的方式需要使用mongoTemplate.insertAll(Collection obj);
/** * @description: 保存集合 
* 数据至mongodb 需要注意的是查看 spring-mongo.xml中配置,mongodb 有没有用户名密码是不同的配置 * @author qjx 
* @createdate: 2020-05-22 14:34 
*/
@RequestMapping("/saveDemo")
@ResponseBodypublic OutputBean saveDemo(HttpServletRequest request){    
OutputBean outputBean = new OutputBean(); 
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);   
outputBean.setMsg(CodeConstants.Basic.SUCCESS);  
try{        
List<MongoDemoDTO> mongoDemoDTOList = new LinkedList<>();       
for(int i = 0;i<100;i++){            
MongoDemoDTO mongoDemoDTO = new MongoDemoDTO();            mongoDemoDTO.setId(IdUtil.getSnowflake(0,1).nextIdStr());            mongoDemoDTO.setUserName(RandomUtil.randomString(10));            mongoDemoDTO.setAge(i);          
mongoDemoDTO.setCity("上海"+i*i);       
mongoDemoDTO.setCreateDate(new Date());     
List<String> orderIdList = 
Arrays.asList(IdUtil.objectId(),IdUtil.simpleUUID());            mongoDemoDTO.setOrderIdList(orderIdList);            mongoDemoDTO.setSalary(RandomUtil.randomDouble());            mongoDemoDTOList.add(mongoDemoDTO);      
}      
mongoTemplate.insertAll(mongoDemoDTOList);  
}catch (Exception e){       
e.printStackTrace();  
}   
return outputBean;}


  • 查询list
    查询的话需要封装自定义查询条件,下面代码中简单示例基本查询以及排序和分页
    /**     
    * @description: 查询     
    * @author qjx     
    * @createdate: 2020-05-22 14:35     
    */    
    @RequestMapping("/queryDemoList")    
    @ResponseBody    
    public OutputBean queryDemo(HttpServletRequest request){        
    OutputBean outputBean = new OutputBean();        
    outputBean.setCode(CodeConstants.Basic.ZERO_CODE);     
    outputBean.setMsg(CodeConstants.Basic.SUCCESS);        
    try{           
    Criteria criteria = new Criteria();          
    // 进行查询的字段类型必须和实体类中一样,建议使用dto实体类方式传值         
    // 普通查询//            
    criteria.and("age").gt(4).and("salary").gt(0.5);          
    Query query = new Query(criteria);         
    // 排序           
    Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC,"id"));            
    query.with(sort);         
    // 分页 从1 开始,查询10条          
    query.skip(1).limit(10);           
    List<MongoDemoDTO> mongoDemoDTOList = mongoTemplate.find(query, 
MongoDemoDTO.class);            
outputBean.setData(mongoDemoDTOList);       
}catch (Exception e){           
e.printStackTrace();        
}        
return outputBean;   
}


  • 查询单个
    查询单个的话其实一般都是使用主键id或能够确定唯一的条件进行查询,具体如下代码:
/** 
* @description: 查询单个 
* @author qjx 
* @createdate: 2020-05-22 14:35 
*/
@RequestMapping("/queryDemoDetail")
@ResponseBodypublic OutputBean queryDemoDetail(HttpServletRequest request){    
OutputBean outputBean = new OutputBean();    
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);    
outputBean.setMsg(CodeConstants.Basic.SUCCESS);    
try{        
Criteria criteria = new Criteria();        
criteria.and("id").is("1263724724903608320");      
Query query = new Query(criteria);        
MongoDemoDTO mongoDemoDTO = mongoTemplate.findOne(query, 
MongoDemoDTO.class);       
outputBean.setDataObject(mongoDemoDTO);    
}catch (Exception e){        
e.printStackTrace();    
}    
return outputBean;
}


  • 更新
    mongo中的更新和sql中一般更新区别在于mongo中一般是查询出并更新,并且查询和更新是两个不同的拼接语句,具体如下:
/** 
* @description: 更新 
* @author qjx 
* @createdate: 2020-05-22 14:35 
*/
@RequestMapping("/updateDemo")
@ResponseBody
public OutputBean updateDemo(HttpServletRequest request){    
OutputBean outputBean = new OutputBean();    
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);    
outputBean.setMsg(CodeConstants.Basic.SUCCESS);    
try{       
Criteria criteria = new Criteria();        
criteria.and("id").is("1263724724903608320");        
Query query = new Query(criteria);        
Update update = new Update();        
update.set("city","上海helloworld");        
MongoDemoDTO mongoDemoDTO = mongoTemplate.findAndModify(query, 
update,MongoDemoDTO.class);        
outputBean.setDataObject(mongoDemoDTO);    
}catch (Exception e){        
e.printStackTrace();    
}    
return outputBean;
}

  • 删除
    mongodb删除和更新有一点相同的地方就是查询出后删除,具体如下代码:
/** 
* @description: 更新 
* @author qjx 
* @createdate: 2020-05-22 14:35 
*/
@RequestMapping("/deleteDemo")
@ResponseBody
public OutputBean deleteDemo(HttpServletRequest request){    
OutputBean outputBean = new OutputBean();    
outputBean.setCode(CodeConstants.Basic.ZERO_CODE);    
outputBean.setMsg(CodeConstants.Basic.SUCCESS);   
try{       
Criteria criteria = new Criteria();       
criteria.and("id").is("1263724724903608320");        
Query query = new Query(criteria);        
MongoDemoDTO mongoDemoDTO = 
mongoTemplate.findAndRemove(query,MongoDemoDTO.class);        outputBean.setDataObject(mongoDemoDTO);    
}catch (Exception e){        
e.printStackTrace();    
}    
return outputBean;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值